{"ok":true,"site":{"host":"laydyne.com","url":"https://laydyne.com/studio","type":"live","desc":"Describe your space and workflow to AI. Build layouts, adapt process scenarios, and compare simulations through MCP or the built-in assistant.","tools":[{"name":"get_space","kind":"answer","impl":"imperative","description":"Read the active floor (dimensions, object IDs and footprints, robot settings; floor reads another in full without switching to it), the building (every floor with its level and x/z position in building metres), the current simulation summary and revision. Parts leave out fields at their default (rotation 0, y 0, blocks as the kind, no tags). partFingerprints supplies exact saved-part fingerprints for apply_changes floors.patch[].base.parts; use them instead of hashing the compact parts. building.spaceHash fingerprints the layout process results depend on; processResult says whether the last one is stale (computed for another layout). detail=summary gives every floor in brief without parts; detail=full every floor in full; select reads only some parts of a large floor (by id, kind, tag, group or a rectangle). persistence reports browser autosave status/reason and whether the last named browser project holds this exact snapshot; storage status does not change revision. If autosave failed, save_local_project can keep a complete named copy, then read persistence.namedLocal=current to confirm. Read summary/full before understanding an unfamiliar space; use detail=status for lightweight revision, busy, Undo/Redo, persistence, activeFloor, spaceHash and latest result/playback checks once its inputs are known. status cannot be combined with floor or select and omits geometry, catalogs, quantities and checks. Does not expose chat, account data or source images.","title":"Read the current space","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"detail":{"default":"floor","description":"status: revision, busy, Undo/Redo, persistence, activeFloor, spaceHash and latest process result/playback status only; no geometry, catalog or checks. Use summary/full to understand a space not yet read. summary: floors, part counts, zones, groups, connections and scenario IDs, without parts; floor (default): the active floor in full (or floor); full: every floor in full.","type":"string","enum":["status","summary","floor","full"]},"floor":{"description":"With detail=floor: this floor area in full instead of the active one (its parts, checks and quantities). Does not switch the editor.","type":"string","minLength":1,"maxLength":40},"select":{"description":"With detail=floor: only the parts that match, for a large floor. A part matches when it is in ids, or passes every other filter given (kinds and tags and groups and within). The room itself (size, outline, holes) stays whole; selection says how many matched of how many, and names ids not found. The part catalog, capabilities and limits are left out (get_part_catalog and detail=floor without select have them).","type":"object","properties":{"ids":{"description":"These parts, whatever the other filters say.","maxItems":500,"type":"array","items":{"type":"string","minLength":1,"maxLength":80}},"kinds":{"description":"Parts of any of these kinds (wall, rack, table…).","maxItems":40,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"tags":{"description":"Parts carrying any of these tags.","maxItems":40,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"groups":{"description":"Parts in any of these groups.","maxItems":40,"type":"array","items":{"type":"string","minLength":1,"maxLength":80}},"within":{"description":"Parts whose footprint reaches into this rectangle (floor metres, top-left corner and size).","type":"object","properties":{"x":{"type":"number"},"z":{"type":"number"},"w":{"type":"number","exclusiveMinimum":0},"d":{"type":"number","exclusiveMinimum":0}},"required":["x","z","w","d"],"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_space_quantities","kind":"answer","impl":"imperative","description":"Areas and quantities of the drawn model: each floor area (outline less holes), each zone on the floor (turned and polygon zones exactly; the part off the floor reported apart), zoned and unzoned area, areas by tag (the union of the tagged zones) and by marking kind (parking, lawns, roads), part counts by kind (walls, partitions and fences with their length), and totals by level, building of the site, use (space type) and the whole site. definitions says how overlapping zones are counted: once in totals and tags, in full in each zone row. floor limits the floor rows to one area; totals stay whole. Square metres to 0.01. When editable solids exist, floors also report solids with ideal analytic closed volume, transformed bounds, decoration status and exact-prism/unsupported-3d analysis; this does not add decorative volume to floor area or claim curved mesh and ideal volume are identical. Read-only; free; no AI call. It measures the drawing, not a legal floor area.","title":"Read floor areas and part counts","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"floor":{"description":"Only this floor area’s rows; every floor when left out.","type":"string","minLength":1,"maxLength":40}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_part_catalog","kind":"answer","impl":"imperative","description":"Search basic parts, size presets and grouped sets by use and name. Sizes are illustrative metres, not certified product specifications. Place a result with edit_space.place using its item ID. These create static parts, not process resources or floor connections. Round appearances still use the stored collision footprint. Free; no AI API or simulation is called. source=saved_assemblies reads the active account/workspace browser library when this host supports it; list returns metadata, id returns one closed editable pack. Large packs use content.data chunks: retain assetRevision and pass nextContentOffset as contentOffset; concatenate and verify sha256. A changed revision is refused. Unavailable is an error; this tool never saves or deletes library entries.","title":"Find prepared parts and reusable sets","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"source":{"default":"prepared","type":"string","enum":["prepared","saved_assemblies"]},"contentOffset":{"type":"integer","minimum":0,"maximum":5242880},"assetRevision":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"query":{"type":"string","maxLength":100},"use":{"type":"string","enum":["structure","warehouse","office","retail","event","home","outdoor","pool","transport"]},"type":{"type":"string","enum":["part","preset","set"]},"id":{"description":"Get one exact item, including every component.","type":"string","maxLength":60},"offset":{"default":0,"type":"integer","minimum":0,"maximum":1000},"limit":{"default":50,"description":"Items per call: up to 200, the whole library at once.","type":"integer","minimum":1,"maximum":200}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"check_space","kind":"answer","impl":"imperative","description":"Deterministic geometry check of the requested floor area (floor, else the active one): overlapping obstacles and passages narrower than minClearance (turned and polygonal parts exactly, by their outlines), doors lying across a wall instead of along it (door_not_in_wall, which opens nothing), parts in front of a door on either side (door_blocked), parts people are routed under lower than the headroom they need (low_headroom), connection ends inside a part in the way or off the floor (link_end_blocked, link_end_off_floor), parts off a shaped floor (outside_outline), zones the saved scenarios go to whose goto point parts close off from the rest of the zone (zone_center_enclosed, as a run warns anchor.enclosed; use a spot), and, on a floor with a gate, zones a pedestrian (radius 0.3 m, height 1.7 m, every connection) cannot reach from any gate (zone_unreachable, with the route failure reason), with object IDs and a bounding rectangle. Zones are ignored otherwise unless they block, but a zone tagged passage or egress holds every gap across it to passageClearance. Gaps inside one group or between parked vehicles are not walkways: counted in excludedGaps (gaps=all lists them). Parts hung above head height neither narrow nor block a walkway. With reach.agent.oneWayPassages, exact opening IDs select forward/backward against physical passageHeading (at most 64 unique floor/part pairs); real endpoints on their finite plane are refused and wall/body clearance still applies. The default pedestrian has no scenario direction rules. With reach, it also routes one agent (a pedestrian unless given) from one place to up to 20 others through every floor and connection, as run_process_scenario routes a goto, and returns reach[]: reachable, lengthMetres (null when not), reason (no-path, link-not-allowed, link-blocked, floor-too-large, too-many-route-nodes, anchor-blocked, anchor-missing, oneway-endpoint; null when reachable) and links (connections taken, or those concerned). For a door or exit (an object that is a door, gate or a small part tagged exit or entrance) reach[] also gives doorWidth, effectiveWidth (the narrowest clear width a pedestrian has across the doorway on the way in or out: less than doorWidth when parts stand in front of it, 0 when shut; a route only has to touch the door, so reachable stays true for a doorway that is mostly blocked) and blockedBy; when effectiveWidth is under the smaller of the door’s own width and doorClearance, reach[].narrowed says so and it is listed as a critical door_narrowed finding (left out where door_blocked already names that door). Geometry only: no queues, capacities or times. Routing works on floors of any size (beyond 120 m on a coarser route graph). With floors (\"all\" or a list of floor IDs) instead of floor, it checks every one of those areas in one call and answers per floor: counts by issue type, the first issuesPerFloor issues, and notChecked for areas left over when the time budget ran out (check those next). Each finding also carries severity (critical: a door or exit closed or a route cut; major; minor), where and nearest (words and the nearest wall, door or exit and zone), and for gaps, overlaps and door fronts a rough hint/suggest (which part to move which way, at least how far: a guide, not a solution); findings come most serious first. A door set in a gap of the wall and a small part tagged exit or entrance keep their front clear like a wall door, and a gap at the room edge names the door or exit at it. A note first says how many gaps are not shown. Read-only; free; no AI call. Whether the drawing matches the real site is not checked.","title":"Check overlaps, passage widths and reach","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"floor":{"description":"Floor area to inspect; defaults to the active area. Does not switch the editor.","type":"string","minLength":1,"maxLength":40},"floors":{"description":"Instead of floor: check several floor areas in one call, \"all\" or a list of floor IDs. Each floor is summarized: counts by issue type and its first issuesPerFloor issues.","anyOf":[{"type":"string","const":"all"},{"minItems":1,"maxItems":120,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}}]},"issuesPerFloor":{"description":"With floors: the issues listed for each floor (20 when left out); the counts cover them all. Lists are shortened further when the whole answer would pass 1 MB.","type":"integer","minimum":0,"maximum":200},"minClearance":{"default":0.9,"description":"Report passages narrower than this many metres.","type":"number","minimum":0.3,"maximum":5},"gaps":{"default":"walkways","description":"walkways (the default): narrow gaps inside one group of furniture or equipment, and between parked vehicles (cars, trucks, bicycles, forklifts, carts, trolleys, roll cages, robots, aircraft), are an assembly or parking, not walkways: counted in excludedGaps and not listed. all: list them too, each with its context.","type":"string","enum":["walkways","all"]},"passageTags":{"description":"Tags that make a zone a passage people must be able to use (passage and egress when left out): every gap across it is held to passageClearance, in a group or not.","minItems":1,"maxItems":8,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"passageClearance":{"description":"Width a passage zone keeps clear, metres: 1.2 when left out (a corridor with rooms on one side under Japan’s Building Standard Law; the IBC asks 1.12 m).","type":"number","minimum":0.6,"maximum":5},"doorClearance":{"description":"Depth kept clear on both sides of a door, metres: 0.9 when left out (a door leaf’s sweep); 1.22 to 1.52 for a wheelchair user’s approach (ADA §404.2.4.1).","type":"number","minimum":0.3,"maximum":3},"headroom":{"description":"Headroom people need under a raised part they are routed under, metres: 2.03 when left out (ADA §307.4, IBC §1003.3.1).","type":"number","minimum":1.8,"maximum":4},"reach":{"description":"Route check through the building (all floors and connections) as a process goto would take it: whether each place can be reached, the route length, and why not.","type":"object","properties":{"agent":{"description":"Who goes; a pedestrian (radius 0.3, height 1.7, every connection) when left out.","type":"object","properties":{"oneWayPassages":{"minItems":1,"maxItems":64,"type":"array","items":{"type":"object","properties":{"floor":{"type":"string","minLength":1,"maxLength":64},"object":{"type":"string","minLength":1,"maxLength":64},"direction":{"type":"string","enum":["forward","backward"]}},"required":["floor","object","direction"],"additionalProperties":false},"description":"Building-graph goto/pool crossings of named wall openings (not straight-distance move or simulate_space): [{floor, object, direction: \"forward\" | \"backward\"}]. Forward follows the opening passageHeading; backward opposes it. Exact IDs, at most 64, no duplicates. Real endpoints on a governed opening plane are invalid; physical clearance still applies."},"radius":{"default":0.3,"description":"Metres.","type":"number","minimum":0.1,"maximum":1.5},"height":{"default":1.7,"description":"Metres; parts raised at least this high are passed under.","type":"number","minimum":0.1,"maximum":3},"links":{"default":["passage","stairs","elevator","escalator"],"description":"Connection kinds the agent may use, and no others (a robot that cannot take stairs or escalators lists passage and elevator: passage is corridors and ramps).","maxItems":4,"type":"array","items":{"type":"string","enum":["passage","stairs","elevator","escalator"]}}},"additionalProperties":false},"from":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"pick":{"type":"string","enum":["nearest","random","least_occupied","free"]},"recall":{"description":"The place this job remembered under the name (goto only): a goto or an arrival with remember stored it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"spot":{"description":"Stand at one of the spots inside a zone part (0.8 m apart) instead of its centre: random, or free (one nobody else is at or on the way to).","type":"string","enum":["random","free"]},"within":{"description":"With a tag, in a goto: only its parts on the floor area the job is on (floor), on its level of the same building (level: the hall of the storey it is on), or in its building (structure; the ground when it is in none).","type":"string","enum":["floor","level","structure"]},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]},"open":{"description":"Only the first n parts with the tag (building order: floor, then part id) are candidates: the open tills.","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false}]}},"additionalProperties":false,"description":"Where from: {\"object\": id}, {\"tag\": t} (its first part), {\"point\": {x, z}} (on the checked floor area; add \"floor\": id for another) or {\"link\": id, \"end\": \"from\" | \"to\"}."},"to":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"pick":{"type":"string","enum":["nearest","random","least_occupied","free"]},"recall":{"description":"The place this job remembered under the name (goto only): a goto or an arrival with remember stored it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"spot":{"description":"Stand at one of the spots inside a zone part (0.8 m apart) instead of its centre: random, or free (one nobody else is at or on the way to).","type":"string","enum":["random","free"]},"within":{"description":"With a tag, in a goto: only its parts on the floor area the job is on (floor), on its level of the same building (level: the hall of the storey it is on), or in its building (structure; the ground when it is in none).","type":"string","enum":["floor","level","structure"]},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]},"open":{"description":"Only the first n parts with the tag (building order: floor, then part id) are candidates: the open tills.","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false}]}},"additionalProperties":false},"description":"Places to reach; a tag takes its nearest part, a point without floor is on the checked floor area."}},"required":["from","to"],"additionalProperties":false}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"create_space","kind":"act","impl":"imperative","description":"Replace the active floor with an editable 3D space; other floors of the building stay as they are, and so do the building’s name and the floor’s underlay. To start afresh in a tab that holds another project, give fresh: true (a new project of this one space; the chat stays). Neither fresh nor a plain replacement drops parts the user locked: the call is refused with code locked_parts, naming them and the ways on (export_project first, or create the space on a new floor area, or, only when the user asks, unlock them). Parts are boxes with a height (optionally turned by rotation, raised by y, or given a polygon footprint), not a mesh. Object IDs, labels and heights can be omitted. addArray places a prepared box or polygon part in a two-direction array without listing every cell. Robot settings/stations get illustrative defaults. Clears previous simulation results; Undo restores the previous space. Simulation requires an explicit simulation tool call within the account’s current access. No application AI API call.","title":"Create a simple 3D space","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"name":{"type":"string","minLength":1,"maxLength":80},"kind":{"default":"office","type":"string","enum":["office","facility","home","factory"]},"width":{"description":"Metres along x; taken from the outline when one is given.","type":"number","minimum":0.1,"maximum":500},"depth":{"description":"Metres along z; taken from the outline when one is given.","type":"number","minimum":0.1,"maximum":500},"outline":{"minItems":3,"maxItems":64,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":-500,"maximum":500},"z":{"type":"number","minimum":-500,"maximum":500}},"required":["x","z"],"additionalProperties":false},"description":"The floor boundary as a simple polygon, corners in order (either winding), metres. Its bounding box becomes width × depth: it is moved to the origin, and parts and stations move with it. Parts are not clipped to it; check_space reports those outside it."},"holes":{"maxItems":32,"type":"array","items":{"minItems":3,"maxItems":64,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":-500,"maximum":500},"z":{"type":"number","minimum":-500,"maximum":500}},"required":["x","z"],"additionalProperties":false}},"description":"Openings in the floor (an atrium, a courtyard), each a simple polygon inside the outline, apart from each other. [] removes them."},"task":{"default":"clean","type":"string","enum":["clean","transport"]},"scaleConfirmed":{"default":false,"description":"Ignored: only the user confirms dimensions, with the Measured box in the editor. A new or resized space is unconfirmed.","type":"boolean"},"objects":{"default":[],"maxItems":1000,"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["wall","column","zone","desk","table","chair","sofa","cabinet","shelf","display","counter","rack","pallet","machine","booth","stage","bed","plant","block","partition","door","window","stairs","elevator","escalator","round_table","bookshelf","locker","whiteboard","wardrobe","kitchen","fridge","rug","checkout","fridge_case","clothes_rack","kiosk","conveyor","workbench","roll_cage","container","tank","forklift","charger","dock_door","seating_row","podium","screen","barrier","building","parking","road","sidewalk","lawn","tree","car","truck","fence","gate","bench","pole","person","toilet","washbasin","urinal","atm","pos_terminal","coffee_machine","oven","dishwasher","microwave","stool","parasol","showcase","menu_board","planter","sign","shopping_cart","cart_corral","bicycle","dock_shelter","dock_leveler","wheel_stop","fire_extinguisher","robot_arm","mobile_robot","pod","sorter","spiral_conveyor","chute","carton_erector","aircraft","jet_bridge","baggage_carousel","security_scanner","metal_detector","self_checkout","platform_trolley","crate_stack","toilet_cubicle","gable_roof","barrel_roof","solid"]},"locked":{"type":"boolean"},"solid":{"type":"object","properties":{"version":{"type":"number","const":1},"recipe":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"extrude"},"axis":{"type":"string","enum":["x","y","z"]},"profile":{"minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"u":{"type":"number","minimum":0,"maximum":1},"v":{"type":"number","minimum":0,"maximum":1}},"required":["u","v"],"additionalProperties":false}}},"required":["type","axis","profile"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"revolve"},"profile":{"minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"u":{"type":"number","minimum":0,"maximum":1},"v":{"type":"number","minimum":0,"maximum":1}},"required":["u","v"],"additionalProperties":false}},"startDegrees":{"type":"number","minimum":-180,"maximum":180},"sweepDegrees":{"type":"number","minimum":0.1,"maximum":360}},"required":["type","profile","sweepDegrees"],"additionalProperties":false}]},"rotation":{"type":"object","properties":{"x":{"type":"number","minimum":-180,"maximum":180},"y":{"type":"number","minimum":-180,"maximum":180},"z":{"type":"number","minimum":-180,"maximum":180}},"required":["x","y","z"],"additionalProperties":false},"mirror":{"type":"object","properties":{"x":{"type":"boolean"},"y":{"type":"boolean"},"z":{"type":"boolean"}},"required":["x","y","z"],"additionalProperties":false}},"required":["version","recipe"],"additionalProperties":false,"description":"Closed editable solid v1. Profile u/v are 0..1: extrusion section (axis y: x/z, axis x: z/y, axis z: x/y); revolve radius/height. w/d/h are reference dimensions. Mirror around reference-box centre, then right-handed X→Y→Z degree rotations around that centre, then outer plan rotation and placement. Partial revolutions (0.1..359.9 degrees) have closed end caps; exactly 360 is a full turn. No holes. Curves use deterministic 64 segments/full turn. blocks:false explicitly marks decoration; unsupported blocking 3D geometry cannot be used as a routing proxy."},"rotation":{"description":"Degrees counter-clockwise on the plan about the centre of the box; 0 when omitted. x/z/w/d stay the unrotated box. A multiple of 90° is stored as the turned box (w/d swapped for a quarter turn) without rotation, the turn of a part with a front kept in facing.","type":"number","exclusiveMinimum":-180,"maximum":180},"passageHeading":{"description":"Physical positive normal of a rectangular door/dock_door/gate in its canonical box frame, degrees (-180,180]; effective heading adds rotation. 0 toward +x, 90 toward -z. Permission is selected per agent by oneWayPassages.","type":"number","exclusiveMinimum":-180,"maximum":180},"facing":{"description":"Which way a part with a front (catalog front: true, e.g. chairs, vehicles, stairs, toilets) faces within its box: the quarter or half turn, degrees counter-clockwise on the plan, that a rotation of 90°, 180° or -90° left; 0 when omitted: front toward +z (south); 90 toward +x (east), 180 or -180 toward -z (north), -90 or 270 toward -x (west). Set it to turn the front without moving the box; rotation, turn and rotate turn the front with the box. Display only; other kinds ignore it.","type":"number","enum":[-180,-90,0,90,180,270]},"y":{"description":"Elevation of the underside above the floor, metres; 0 when omitted.","type":"number","minimum":0,"maximum":50},"footprint":{"description":"Polygon base as {x,z} vertices in the unrotated box (0..w, 0..d), 3-32, no self-crossing, spanning the whole box; the box when omitted.","minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}},"blocks":{"description":"Whether the part blocks movement; overrides the kind default.","type":"boolean"},"color":{"type":"integer","minimum":0,"maximum":16777215},"material":{"type":"object","properties":{"materialId":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"override":{"type":"object","properties":{"baseColor":{"type":"integer","minimum":0,"maximum":16777215},"roughness":{"type":"number","minimum":0,"maximum":1},"metalness":{"type":"number","minimum":0,"maximum":1},"opacity":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false}},"additionalProperties":false},"referenceIds":{"maxItems":8,"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"}},"accent":{"description":"A second colour 0xRRGGBB for the members drawn apart: a rack's beams (its posts keep the structure colour), a sign's face, a door's leaf. Display only.","type":"integer","minimum":0,"maximum":16777215},"doorType":{"description":"How a door opens, for its plan symbol and 3D picture: hinged (one leaf, the default), double, sliding, automatic (two sliding leaves) or revolving. Doors and gates only; display only.","type":"string","enum":["hinged","double","sliding","automatic","revolving"]},"text":{"description":"Words shown on it: a sign or menu board carries them on its face, a floor marking (zone, parking, road, sidewalk, lawn, rug) painted on the floor. Display only.","type":"string","minLength":1,"maxLength":60},"symbol":{"description":"A symbol painted on a floor marking: arrow (along its length, turned with it), wheelchair (the accessible bay sign), crosswalk (zebra stripes across its length), bays (parking bay lines every 2.5 m along its length) or hatch (a no-go area). Floor markings only; display only.","type":"string","enum":["arrow","wheelchair","crosswalk","bays","hatch"]},"group":{"type":"string","minLength":1,"maxLength":40},"tags":{"description":"Up to 8 tags, each /^[a-z0-9_-]{1,24}$/, for scenarios to refer to.","maxItems":8,"type":"array","items":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"}},"source":{"description":"Where its position and size come from: drawing (read off a plan), measured (on site) or assumed (a typical size, or hidden in the drawing). Display only: not part of any calculation.","type":"string","enum":["drawing","measured","assumed"]},"note":{"description":"A note for whoever checks the model (what was assumed, what to confirm on site), up to 300 characters; not drawn on the plan and not part of any calculation.","type":"string","minLength":1,"maxLength":300},"id":{"type":"string","minLength":1,"maxLength":60},"label":{"type":"string","minLength":1,"maxLength":60},"x":{"type":"number","minimum":0},"z":{"type":"number","minimum":0},"w":{"type":"number","minimum":0.02,"maximum":500},"d":{"type":"number","minimum":0.02,"maximum":500},"h":{"type":"number","minimum":0.01,"maximum":50},"polygon":{"description":"Instead of x/z/w/d: the corners of the part on the floor, in order, metres (3-32, no self-crossing); x, z, w, d and the footprint are derived from them, unturned.","minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}}},"required":["kind"],"additionalProperties":false,"description":"A prepared part. Give kind and the minimum x/z corner; omit w/d/h to use the part size listed in get_space.parts. Or give polygon (corners on the floor) instead of x/z/w/d for a part of any outline."}},"addArray":{"default":[],"maxItems":20,"type":"array","items":{"type":"object","properties":{"part":{"type":"object","properties":{"kind":{"type":"string","enum":["wall","column","zone","desk","table","chair","sofa","cabinet","shelf","display","counter","rack","pallet","machine","booth","stage","bed","plant","block","partition","door","window","stairs","elevator","escalator","round_table","bookshelf","locker","whiteboard","wardrobe","kitchen","fridge","rug","checkout","fridge_case","clothes_rack","kiosk","conveyor","workbench","roll_cage","container","tank","forklift","charger","dock_door","seating_row","podium","screen","barrier","building","parking","road","sidewalk","lawn","tree","car","truck","fence","gate","bench","pole","person","toilet","washbasin","urinal","atm","pos_terminal","coffee_machine","oven","dishwasher","microwave","stool","parasol","showcase","menu_board","planter","sign","shopping_cart","cart_corral","bicycle","dock_shelter","dock_leveler","wheel_stop","fire_extinguisher","robot_arm","mobile_robot","pod","sorter","spiral_conveyor","chute","carton_erector","aircraft","jet_bridge","baggage_carousel","security_scanner","metal_detector","self_checkout","platform_trolley","crate_stack","toilet_cubicle","gable_roof","barrel_roof","solid"]},"locked":{"type":"boolean"},"solid":{"type":"object","properties":{"version":{"type":"number","const":1},"recipe":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"extrude"},"axis":{"type":"string","enum":["x","y","z"]},"profile":{"minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"u":{"type":"number","minimum":0,"maximum":1},"v":{"type":"number","minimum":0,"maximum":1}},"required":["u","v"],"additionalProperties":false}}},"required":["type","axis","profile"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"revolve"},"profile":{"minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"u":{"type":"number","minimum":0,"maximum":1},"v":{"type":"number","minimum":0,"maximum":1}},"required":["u","v"],"additionalProperties":false}},"startDegrees":{"type":"number","minimum":-180,"maximum":180},"sweepDegrees":{"type":"number","minimum":0.1,"maximum":360}},"required":["type","profile","sweepDegrees"],"additionalProperties":false}]},"rotation":{"type":"object","properties":{"x":{"type":"number","minimum":-180,"maximum":180},"y":{"type":"number","minimum":-180,"maximum":180},"z":{"type":"number","minimum":-180,"maximum":180}},"required":["x","y","z"],"additionalProperties":false},"mirror":{"type":"object","properties":{"x":{"type":"boolean"},"y":{"type":"boolean"},"z":{"type":"boolean"}},"required":["x","y","z"],"additionalProperties":false}},"required":["version","recipe"],"additionalProperties":false,"description":"Closed editable solid v1. Profile u/v are 0..1: extrusion section (axis y: x/z, axis x: z/y, axis z: x/y); revolve radius/height. w/d/h are reference dimensions. Mirror around reference-box centre, then right-handed X→Y→Z degree rotations around that centre, then outer plan rotation and placement. Partial revolutions (0.1..359.9 degrees) have closed end caps; exactly 360 is a full turn. No holes. Curves use deterministic 64 segments/full turn. blocks:false explicitly marks decoration; unsupported blocking 3D geometry cannot be used as a routing proxy."},"rotation":{"description":"Degrees counter-clockwise on the plan about the centre of the box; 0 when omitted. x/z/w/d stay the unrotated box. A multiple of 90° is stored as the turned box (w/d swapped for a quarter turn) without rotation, the turn of a part with a front kept in facing.","type":"number","exclusiveMinimum":-180,"maximum":180},"passageHeading":{"description":"Physical positive normal of a rectangular door/dock_door/gate in its canonical box frame, degrees (-180,180]; effective heading adds rotation. 0 toward +x, 90 toward -z. Permission is selected per agent by oneWayPassages.","type":"number","exclusiveMinimum":-180,"maximum":180},"facing":{"description":"Which way a part with a front (catalog front: true, e.g. chairs, vehicles, stairs, toilets) faces within its box: the quarter or half turn, degrees counter-clockwise on the plan, that a rotation of 90°, 180° or -90° left; 0 when omitted: front toward +z (south); 90 toward +x (east), 180 or -180 toward -z (north), -90 or 270 toward -x (west). Set it to turn the front without moving the box; rotation, turn and rotate turn the front with the box. Display only; other kinds ignore it.","type":"number","enum":[-180,-90,0,90,180,270]},"y":{"description":"Elevation of the underside above the floor, metres; 0 when omitted.","type":"number","minimum":0,"maximum":50},"footprint":{"description":"Polygon base as {x,z} vertices in the unrotated box (0..w, 0..d), 3-32, no self-crossing, spanning the whole box; the box when omitted.","minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}},"blocks":{"description":"Whether the part blocks movement; overrides the kind default.","type":"boolean"},"color":{"type":"integer","minimum":0,"maximum":16777215},"material":{"type":"object","properties":{"materialId":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"override":{"type":"object","properties":{"baseColor":{"type":"integer","minimum":0,"maximum":16777215},"roughness":{"type":"number","minimum":0,"maximum":1},"metalness":{"type":"number","minimum":0,"maximum":1},"opacity":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false}},"additionalProperties":false},"referenceIds":{"maxItems":8,"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"}},"accent":{"description":"A second colour 0xRRGGBB for the members drawn apart: a rack's beams (its posts keep the structure colour), a sign's face, a door's leaf. Display only.","type":"integer","minimum":0,"maximum":16777215},"doorType":{"description":"How a door opens, for its plan symbol and 3D picture: hinged (one leaf, the default), double, sliding, automatic (two sliding leaves) or revolving. Doors and gates only; display only.","type":"string","enum":["hinged","double","sliding","automatic","revolving"]},"text":{"description":"Words shown on it: a sign or menu board carries them on its face, a floor marking (zone, parking, road, sidewalk, lawn, rug) painted on the floor. Display only.","type":"string","minLength":1,"maxLength":60},"symbol":{"description":"A symbol painted on a floor marking: arrow (along its length, turned with it), wheelchair (the accessible bay sign), crosswalk (zebra stripes across its length), bays (parking bay lines every 2.5 m along its length) or hatch (a no-go area). Floor markings only; display only.","type":"string","enum":["arrow","wheelchair","crosswalk","bays","hatch"]},"group":{"type":"string","minLength":1,"maxLength":40},"tags":{"description":"Up to 8 tags, each /^[a-z0-9_-]{1,24}$/, for scenarios to refer to.","maxItems":8,"type":"array","items":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"}},"source":{"description":"Where its position and size come from: drawing (read off a plan), measured (on site) or assumed (a typical size, or hidden in the drawing). Display only: not part of any calculation.","type":"string","enum":["drawing","measured","assumed"]},"note":{"description":"A note for whoever checks the model (what was assumed, what to confirm on site), up to 300 characters; not drawn on the plan and not part of any calculation.","type":"string","minLength":1,"maxLength":300},"id":{"type":"string","minLength":1,"maxLength":60},"label":{"type":"string","minLength":1,"maxLength":60},"x":{"type":"number","minimum":0},"z":{"type":"number","minimum":0},"w":{"type":"number","minimum":0.02,"maximum":500},"d":{"type":"number","minimum":0.02,"maximum":500},"h":{"type":"number","minimum":0.01,"maximum":50},"polygon":{"description":"Instead of x/z/w/d: the corners of the part on the floor, in order, metres (3-32, no self-crossing); x, z, w, d and the footprint are derived from them, unturned.","minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}}},"required":["kind"],"additionalProperties":false,"description":"The part to repeat. Omit part.id: each cell needs a distinct ID. Set idPrefix on the array to choose stable IDs. Give x/z or polygon as for an ordinary part."},"rows":{"type":"integer","minimum":1,"maximum":50},"columns":{"type":"integer","minimum":1,"maximum":50},"rowStep":{"type":"object","properties":{"dx":{"type":"number","minimum":-500,"maximum":500},"dz":{"type":"number","minimum":-500,"maximum":500}},"required":["dx","dz"],"additionalProperties":false,"description":"Metres from one row or column to the next; diagonal steps are allowed."},"columnStep":{"type":"object","properties":{"dx":{"type":"number","minimum":-500,"maximum":500},"dz":{"type":"number","minimum":-500,"maximum":500}},"required":["dx","dz"],"additionalProperties":false,"description":"Metres from one row or column to the next; diagonal steps are allowed."},"idPrefix":{"description":"IDs of the cells, row by row: prefix-1, prefix-2, …; generated when omitted.","type":"string","minLength":1,"maxLength":50,"pattern":"^[A-Za-z0-9_-]+$"}},"required":["part","rows","columns","rowStep","columnStep"],"additionalProperties":false,"description":"Place a part at every row/column offset from part.x/z (or shift every corner of part.polygon). The first cell is at the supplied position; rows and columns include it. IDs are generated, or idPrefix-1, idPrefix-2, … row by row. In part.label, {n} becomes the cell number and {row}/{column} its row and column (from 1): \"Shelf {n}\", \"Seat {row}-{column}\"."}},"fresh":{"default":false,"description":"Start a new project with this space, named after it: the other floors, the underlays, scenarios, saved options and comparisons, the latest run and named views go (one Undo brings them back); the chat and the display settings stay. Without it only the active floor is replaced.","type":"boolean"},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"edit_space","kind":"act","impl":"imperative","description":"Edit several objects and room dimensions of one floor (floor, else the active one; or the same edit on several with floors) in one atomic change. room width and depth grow or shrink the floor on its +x and +z sides (east and south); its parts and holes keep their places unless scaleContents. Order: room, remove, update, move, rotate (90°), turn (any angle), align, distribute, rotateSelection, copy, copySelection, copyArray, add, addArray, walls, openings, group. assemblies edits floor-local definitions and instances, typed parameters and sparse component overrides; detach explicitly turns an instance into ordinary parts. Read scene.modelAssemblies and use assemblyPartId/provenance from the kit. Generated parts reject ordinary updates/copies; use assemblies overrides or detach first. Surviving generated IDs are stable when arrays change; references to disappearing IDs must be retargeted in the same apply_changes. Selection operations take explicit object IDs. Updates need only an existing ID and changed fields. Add prepared parts by kind and position; sizes default to get_space.parts. For a part of any outline (an L-shaped counter, a round column), give add[].polygon: its corners on the floor instead of x/z/w/d. addArray creates a two-direction array of one prepared part; copyArray repeats an existing assembly across rows and columns. Draw slanted walls with walls and put their doors with openings rather than computing angles and corners. Coordinates are metres. Invalid edits leave the space unchanged. The result gives the new revision, changes (the part IDs added, removed and changed), the scene of the active floor, checks (counts of the quick checks of the floor that was edited: overlaps, narrow passages, doors blocked and so on; check_space gives the IDs, severity and hints) with checksFloor naming that floor, and the building in brief; result=brief leaves the scene out. After editing another floor, scene stays the active floor, checks and checksFloor are still the edited floor’s (editedFloor.checks repeats them), activeFloorChecks gives the active floor’s counts, and editedFloor gives the edited one (id, scene, changes, checks). With floors, editedFloors[].checks is each floor’s. Stations stay put unless explicitly supplied or autoPlaceStations=true. Editing does not run a simulation; call simulate_space explicitly when authorized.","title":"Edit the space in one batch","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"assemblies":{"description":"Edit floor-local assembly definitions/instances, typed parameters and component overrides; detach explicitly makes regular parts. Generated parts cannot be edited directly.","type":"object","properties":{"definitions":{"type":"object","properties":{"put":{"maxItems":128,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"name":{"type":"string","minLength":1,"maxLength":80},"parameters":{"default":[],"maxItems":32,"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"type":{"type":"string","const":"number"},"default":{"type":"number"},"min":{"type":"number"},"max":{"type":"number"}},"required":["id","type","default","min","max"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"type":{"type":"string","const":"integer"},"default":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"min":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","type","default","min","max"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"type":{"type":"string","const":"enum"},"default":{"type":"string","maxLength":60},"values":{"minItems":1,"maxItems":32,"type":"array","items":{"type":"string","maxLength":60}}},"required":["id","type","default","values"],"additionalProperties":false}]}},"components":{"maxItems":4096,"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"array":{"type":"object","properties":{"count":{"anyOf":[{"type":"number"},{"type":"object","properties":{"parameter":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"factor":{"type":"number"},"offset":{"type":"number"}},"required":["parameter"],"additionalProperties":false}]},"dx":{"anyOf":[{"type":"number"},{"type":"object","properties":{"parameter":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"factor":{"type":"number"},"offset":{"type":"number"}},"required":["parameter"],"additionalProperties":false}]},"dz":{"anyOf":[{"type":"number"},{"type":"object","properties":{"parameter":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"factor":{"type":"number"},"offset":{"type":"number"}},"required":["parameter"],"additionalProperties":false}]}},"required":["count","dx","dz"],"additionalProperties":false},"type":{"type":"string","const":"part"},"part":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":60},"label":{"type":"string","minLength":1,"maxLength":60},"kind":{"type":"string","enum":["wall","column","zone","desk","table","chair","sofa","cabinet","shelf","display","counter","rack","pallet","machine","booth","stage","bed","plant","block","partition","door","window","stairs","elevator","escalator","round_table","bookshelf","locker","whiteboard","wardrobe","kitchen","fridge","rug","checkout","fridge_case","clothes_rack","kiosk","conveyor","workbench","roll_cage","container","tank","forklift","charger","dock_door","seating_row","podium","screen","barrier","building","parking","road","sidewalk","lawn","tree","car","truck","fence","gate","bench","pole","person","toilet","washbasin","urinal","atm","pos_terminal","coffee_machine","oven","dishwasher","microwave","stool","parasol","showcase","menu_board","planter","sign","shopping_cart","cart_corral","bicycle","dock_shelter","dock_leveler","wheel_stop","fire_extinguisher","robot_arm","mobile_robot","pod","sorter","spiral_conveyor","chute","carton_erector","aircraft","jet_bridge","baggage_carousel","security_scanner","metal_detector","self_checkout","platform_trolley","crate_stack","toilet_cubicle","gable_roof","barrel_roof","solid"]},"x":{"type":"number","minimum":0},"z":{"type":"number","minimum":0},"w":{"type":"number","minimum":0.02,"maximum":500},"d":{"type":"number","minimum":0.02,"maximum":500},"h":{"type":"number","minimum":0.01,"maximum":50},"locked":{"type":"boolean"},"solid":{"type":"object","properties":{"version":{"type":"number","const":1},"recipe":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"extrude"},"axis":{"type":"string","enum":["x","y","z"]},"profile":{"minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"u":{"type":"number","minimum":0,"maximum":1},"v":{"type":"number","minimum":0,"maximum":1}},"required":["u","v"],"additionalProperties":false}}},"required":["type","axis","profile"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"revolve"},"profile":{"minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"u":{"type":"number","minimum":0,"maximum":1},"v":{"type":"number","minimum":0,"maximum":1}},"required":["u","v"],"additionalProperties":false}},"startDegrees":{"type":"number","minimum":-180,"maximum":180},"sweepDegrees":{"type":"number","minimum":0.1,"maximum":360}},"required":["type","profile","sweepDegrees"],"additionalProperties":false}]},"rotation":{"type":"object","properties":{"x":{"type":"number","minimum":-180,"maximum":180},"y":{"type":"number","minimum":-180,"maximum":180},"z":{"type":"number","minimum":-180,"maximum":180}},"required":["x","y","z"],"additionalProperties":false},"mirror":{"type":"object","properties":{"x":{"type":"boolean"},"y":{"type":"boolean"},"z":{"type":"boolean"}},"required":["x","y","z"],"additionalProperties":false}},"required":["version","recipe"],"additionalProperties":false,"description":"Closed editable solid v1. Profile u/v are 0..1: extrusion section (axis y: x/z, axis x: z/y, axis z: x/y); revolve radius/height. w/d/h are reference dimensions. Mirror around reference-box centre, then right-handed X→Y→Z degree rotations around that centre, then outer plan rotation and placement. Partial revolutions (0.1..359.9 degrees) have closed end caps; exactly 360 is a full turn. No holes. Curves use deterministic 64 segments/full turn. blocks:false explicitly marks decoration; unsupported blocking 3D geometry cannot be used as a routing proxy."},"rotation":{"description":"Degrees counter-clockwise on the plan about the centre of the box; 0 when omitted. x/z/w/d stay the unrotated box. A multiple of 90° is stored as the turned box (w/d swapped for a quarter turn) without rotation, the turn of a part with a front kept in facing.","type":"number","exclusiveMinimum":-180,"maximum":180},"passageHeading":{"description":"Physical positive normal of a rectangular door/dock_door/gate in its canonical box frame, degrees (-180,180]; effective heading adds rotation. 0 toward +x, 90 toward -z. Permission is selected per agent by oneWayPassages.","type":"number","exclusiveMinimum":-180,"maximum":180},"facing":{"description":"Which way a part with a front (catalog front: true, e.g. chairs, vehicles, stairs, toilets) faces within its box: the quarter or half turn, degrees counter-clockwise on the plan, that a rotation of 90°, 180° or -90° left; 0 when omitted: front toward +z (south); 90 toward +x (east), 180 or -180 toward -z (north), -90 or 270 toward -x (west). Set it to turn the front without moving the box; rotation, turn and rotate turn the front with the box. Display only; other kinds ignore it.","type":"number","enum":[-180,-90,0,90,180,270]},"y":{"description":"Elevation of the underside above the floor, metres; 0 when omitted.","type":"number","minimum":0,"maximum":50},"footprint":{"description":"Polygon base as {x,z} vertices in the unrotated box (0..w, 0..d), 3-32, no self-crossing, spanning the whole box; the box when omitted.","minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}},"blocks":{"description":"Whether the part blocks movement; overrides the kind default.","type":"boolean"},"color":{"type":"integer","minimum":0,"maximum":16777215},"material":{"type":"object","properties":{"materialId":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"override":{"type":"object","properties":{"baseColor":{"type":"integer","minimum":0,"maximum":16777215},"roughness":{"type":"number","minimum":0,"maximum":1},"metalness":{"type":"number","minimum":0,"maximum":1},"opacity":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false}},"additionalProperties":false},"referenceIds":{"maxItems":8,"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"}},"accent":{"description":"A second colour 0xRRGGBB for the members drawn apart: a rack's beams (its posts keep the structure colour), a sign's face, a door's leaf. Display only.","type":"integer","minimum":0,"maximum":16777215},"doorType":{"description":"How a door opens, for its plan symbol and 3D picture: hinged (one leaf, the default), double, sliding, automatic (two sliding leaves) or revolving. Doors and gates only; display only.","type":"string","enum":["hinged","double","sliding","automatic","revolving"]},"text":{"description":"Words shown on it: a sign or menu board carries them on its face, a floor marking (zone, parking, road, sidewalk, lawn, rug) painted on the floor. Display only.","type":"string","minLength":1,"maxLength":60},"symbol":{"description":"A symbol painted on a floor marking: arrow (along its length, turned with it), wheelchair (the accessible bay sign), crosswalk (zebra stripes across its length), bays (parking bay lines every 2.5 m along its length) or hatch (a no-go area). Floor markings only; display only.","type":"string","enum":["arrow","wheelchair","crosswalk","bays","hatch"]},"group":{"type":"string","minLength":1,"maxLength":40},"tags":{"description":"Up to 8 tags, each /^[a-z0-9_-]{1,24}$/, for scenarios to refer to.","maxItems":8,"type":"array","items":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"}},"source":{"description":"Where its position and size come from: drawing (read off a plan), measured (on site) or assumed (a typical size, or hidden in the drawing). Display only: not part of any calculation.","type":"string","enum":["drawing","measured","assumed"]},"note":{"description":"A note for whoever checks the model (what was assumed, what to confirm on site), up to 300 characters; not drawn on the plan and not part of any calculation.","type":"string","minLength":1,"maxLength":300}},"required":["id","label","kind","x","z","w","d","h"],"additionalProperties":false},"bindings":{"type":"object","propertyNames":{"type":"string","enum":["x","z","y","w","d","h","rotation","color"]},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"string","maxLength":60},{"type":"object","properties":{"parameter":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"factor":{"type":"number"},"offset":{"type":"number"}},"required":["parameter"],"additionalProperties":false}]}}},"required":["id","type","part"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"array":{"type":"object","properties":{"count":{"anyOf":[{"type":"number"},{"type":"object","properties":{"parameter":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"factor":{"type":"number"},"offset":{"type":"number"}},"required":["parameter"],"additionalProperties":false}]},"dx":{"anyOf":[{"type":"number"},{"type":"object","properties":{"parameter":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"factor":{"type":"number"},"offset":{"type":"number"}},"required":["parameter"],"additionalProperties":false}]},"dz":{"anyOf":[{"type":"number"},{"type":"object","properties":{"parameter":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"factor":{"type":"number"},"offset":{"type":"number"}},"required":["parameter"],"additionalProperties":false}]}},"required":["count","dx","dz"],"additionalProperties":false},"type":{"type":"string","const":"assembly"},"definition":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"parameters":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"string","maxLength":60},{"type":"object","properties":{"parameter":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"factor":{"type":"number"},"offset":{"type":"number"}},"required":["parameter"],"additionalProperties":false}]}},"x":{"default":0,"type":"number"},"z":{"default":0,"type":"number"},"y":{"type":"number"},"rotation":{"type":"number"}},"required":["id","type","definition"],"additionalProperties":false}]}}},"required":["id","name","components"],"additionalProperties":false}},"update":{"maxItems":128,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"defaults":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"string","maxLength":60}]}}},"required":["id","defaults"],"additionalProperties":false}},"remove":{"maxItems":128,"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"}}},"additionalProperties":false},"instances":{"type":"object","properties":{"put":{"maxItems":512,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"definition":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"x":{"default":0,"type":"number"},"z":{"default":0,"type":"number"},"y":{"type":"number"},"rotation":{"type":"number"},"parameters":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"string","maxLength":60}]}},"overrides":{"maxItems":1000,"type":"array","items":{"type":"object","properties":{"path":{"minItems":2,"maxItems":24,"type":"array","items":{"type":"string","maxLength":42,"pattern":"^(?:[dp]:[a-zA-Z0-9_-]+|i:(?:0|[1-9][0-9]{0,2}))$"}},"fields":{"type":"object","properties":{"x":{"type":"number"},"z":{"type":"number"},"y":{"type":"number"},"w":{"type":"number"},"d":{"type":"number"},"h":{"type":"number"},"rotation":{"type":"number"},"color":{"type":"integer","minimum":0,"maximum":16777215},"material":{"type":"object","properties":{"materialId":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"override":{"type":"object","properties":{"baseColor":{"type":"integer","minimum":0,"maximum":16777215},"roughness":{"type":"number","minimum":0,"maximum":1},"metalness":{"type":"number","minimum":0,"maximum":1},"opacity":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false}},"additionalProperties":false},"referenceIds":{"maxItems":8,"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"}}},"additionalProperties":false}},"required":["path","fields"],"additionalProperties":false}}},"required":["id","definition"],"additionalProperties":false}},"update":{"maxItems":512,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"x":{"type":"number"},"z":{"type":"number"},"y":{"type":"number"},"rotation":{"type":"number"},"parameters":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"additionalProperties":{"anyOf":[{"type":"number"},{"type":"string","maxLength":60}]}},"overrides":{"maxItems":1000,"type":"array","items":{"type":"object","properties":{"path":{"minItems":2,"maxItems":24,"type":"array","items":{"type":"string","maxLength":42,"pattern":"^(?:[dp]:[a-zA-Z0-9_-]+|i:(?:0|[1-9][0-9]{0,2}))$"}},"fields":{"type":"object","properties":{"x":{"type":"number"},"z":{"type":"number"},"y":{"type":"number"},"w":{"type":"number"},"d":{"type":"number"},"h":{"type":"number"},"rotation":{"type":"number"},"color":{"type":"integer","minimum":0,"maximum":16777215},"material":{"type":"object","properties":{"materialId":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"override":{"type":"object","properties":{"baseColor":{"type":"integer","minimum":0,"maximum":16777215},"roughness":{"type":"number","minimum":0,"maximum":1},"metalness":{"type":"number","minimum":0,"maximum":1},"opacity":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false}},"additionalProperties":false},"referenceIds":{"maxItems":8,"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"}}},"additionalProperties":false}},"required":["path","fields"],"additionalProperties":false}}},"required":["id"],"additionalProperties":false}},"remove":{"maxItems":512,"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"}}},"additionalProperties":false},"detach":{"maxItems":512,"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"}}},"additionalProperties":false},"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"result":{"default":"scene","description":"What the result gives of the edited floor: scene (every part, with the IDs the edit made) or brief (only the IDs added, removed and changed, and its checks), for large floors.","type":"string","enum":["scene","brief"]},"preview":{"default":false,"description":"Check the proposed edit without applying it: returns the proposed floor and geometry issues. If it meets the user’s requirements, repeat with preview=false and the latest revision to apply it.","type":"boolean"},"floor":{"description":"Floor id (get_space.building.floors) to edit; the active floor when omitted. Another floor is edited in place and stays inactive.","type":"string","minLength":1,"maxLength":40},"floors":{"description":"The same edit on several floors at once, instead of floor: typical floors copied from one another share part IDs, so an update of 'corridor' widens it on every storey listed. All of them change or none, as one Undo step; the result gives each floor's checks. Not with preview.","minItems":1,"maxItems":40,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"skipMissing":{"default":false,"description":"With floors: on a floor that lacks a part the edit names, leave out what names it (an update, a removal, a move, an opening on that wall; the ID from a list) instead of refusing the whole edit, and list the IDs left out per floor. For storeys whose parts differ (a ground floor with a lobby under typical floors).","type":"boolean"},"room":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"kind":{"type":"string","enum":["office","facility","home","factory"]},"width":{"type":"number","minimum":0.1,"maximum":500},"depth":{"type":"number","minimum":0.1,"maximum":500},"outline":{"description":"A new floor boundary (see create_space.outline); [] returns to the width × depth rectangle (null does too). The holes move with it; holes given in the same edit are in the same frame as the outline and move with it too. Resizing an outlined floor with width/depth scales the outline with it; its holes, like its parts, keep their places unless scaleContents (a site grown to the south or east keeps the holes under its buildings).","anyOf":[{"maxItems":64,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":-500,"maximum":500},"z":{"type":"number","minimum":-500,"maximum":500}},"required":["x","z"],"additionalProperties":false}},{"type":"null"}]},"holes":{"maxItems":32,"type":"array","items":{"minItems":3,"maxItems":64,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":-500,"maximum":500},"z":{"type":"number","minimum":-500,"maximum":500}},"required":["x","z"],"additionalProperties":false}},"description":"Openings in the floor (an atrium, a courtyard), each a simple polygon inside the outline, apart from each other. [] removes them."},"scaleConfirmed":{"description":"Ignored: only the user confirms dimensions, with the Measured box in the editor. A new or resized space is unconfirmed.","type":"boolean"}},"additionalProperties":false},"scaleContents":{"default":false,"description":"When resizing, proportionally scale floor positions and footprints; heights stay unchanged. Otherwise only room bounds change.","type":"boolean"},"add":{"default":[],"maxItems":100,"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["wall","column","zone","desk","table","chair","sofa","cabinet","shelf","display","counter","rack","pallet","machine","booth","stage","bed","plant","block","partition","door","window","stairs","elevator","escalator","round_table","bookshelf","locker","whiteboard","wardrobe","kitchen","fridge","rug","checkout","fridge_case","clothes_rack","kiosk","conveyor","workbench","roll_cage","container","tank","forklift","charger","dock_door","seating_row","podium","screen","barrier","building","parking","road","sidewalk","lawn","tree","car","truck","fence","gate","bench","pole","person","toilet","washbasin","urinal","atm","pos_terminal","coffee_machine","oven","dishwasher","microwave","stool","parasol","showcase","menu_board","planter","sign","shopping_cart","cart_corral","bicycle","dock_shelter","dock_leveler","wheel_stop","fire_extinguisher","robot_arm","mobile_robot","pod","sorter","spiral_conveyor","chute","carton_erector","aircraft","jet_bridge","baggage_carousel","security_scanner","metal_detector","self_checkout","platform_trolley","crate_stack","toilet_cubicle","gable_roof","barrel_roof","solid"]},"locked":{"type":"boolean"},"solid":{"type":"object","properties":{"version":{"type":"number","const":1},"recipe":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"extrude"},"axis":{"type":"string","enum":["x","y","z"]},"profile":{"minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"u":{"type":"number","minimum":0,"maximum":1},"v":{"type":"number","minimum":0,"maximum":1}},"required":["u","v"],"additionalProperties":false}}},"required":["type","axis","profile"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"revolve"},"profile":{"minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"u":{"type":"number","minimum":0,"maximum":1},"v":{"type":"number","minimum":0,"maximum":1}},"required":["u","v"],"additionalProperties":false}},"startDegrees":{"type":"number","minimum":-180,"maximum":180},"sweepDegrees":{"type":"number","minimum":0.1,"maximum":360}},"required":["type","profile","sweepDegrees"],"additionalProperties":false}]},"rotation":{"type":"object","properties":{"x":{"type":"number","minimum":-180,"maximum":180},"y":{"type":"number","minimum":-180,"maximum":180},"z":{"type":"number","minimum":-180,"maximum":180}},"required":["x","y","z"],"additionalProperties":false},"mirror":{"type":"object","properties":{"x":{"type":"boolean"},"y":{"type":"boolean"},"z":{"type":"boolean"}},"required":["x","y","z"],"additionalProperties":false}},"required":["version","recipe"],"additionalProperties":false,"description":"Closed editable solid v1. Profile u/v are 0..1: extrusion section (axis y: x/z, axis x: z/y, axis z: x/y); revolve radius/height. w/d/h are reference dimensions. Mirror around reference-box centre, then right-handed X→Y→Z degree rotations around that centre, then outer plan rotation and placement. Partial revolutions (0.1..359.9 degrees) have closed end caps; exactly 360 is a full turn. No holes. Curves use deterministic 64 segments/full turn. blocks:false explicitly marks decoration; unsupported blocking 3D geometry cannot be used as a routing proxy."},"rotation":{"description":"Degrees counter-clockwise on the plan about the centre of the box; 0 when omitted. x/z/w/d stay the unrotated box. A multiple of 90° is stored as the turned box (w/d swapped for a quarter turn) without rotation, the turn of a part with a front kept in facing.","type":"number","exclusiveMinimum":-180,"maximum":180},"passageHeading":{"description":"Physical positive normal of a rectangular door/dock_door/gate in its canonical box frame, degrees (-180,180]; effective heading adds rotation. 0 toward +x, 90 toward -z. Permission is selected per agent by oneWayPassages.","type":"number","exclusiveMinimum":-180,"maximum":180},"facing":{"description":"Which way a part with a front (catalog front: true, e.g. chairs, vehicles, stairs, toilets) faces within its box: the quarter or half turn, degrees counter-clockwise on the plan, that a rotation of 90°, 180° or -90° left; 0 when omitted: front toward +z (south); 90 toward +x (east), 180 or -180 toward -z (north), -90 or 270 toward -x (west). Set it to turn the front without moving the box; rotation, turn and rotate turn the front with the box. Display only; other kinds ignore it.","type":"number","enum":[-180,-90,0,90,180,270]},"y":{"description":"Elevation of the underside above the floor, metres; 0 when omitted.","type":"number","minimum":0,"maximum":50},"footprint":{"description":"Polygon base as {x,z} vertices in the unrotated box (0..w, 0..d), 3-32, no self-crossing, spanning the whole box; the box when omitted.","minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}},"blocks":{"description":"Whether the part blocks movement; overrides the kind default.","type":"boolean"},"color":{"type":"integer","minimum":0,"maximum":16777215},"material":{"type":"object","properties":{"materialId":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"override":{"type":"object","properties":{"baseColor":{"type":"integer","minimum":0,"maximum":16777215},"roughness":{"type":"number","minimum":0,"maximum":1},"metalness":{"type":"number","minimum":0,"maximum":1},"opacity":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false}},"additionalProperties":false},"referenceIds":{"maxItems":8,"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"}},"accent":{"description":"A second colour 0xRRGGBB for the members drawn apart: a rack's beams (its posts keep the structure colour), a sign's face, a door's leaf. Display only.","type":"integer","minimum":0,"maximum":16777215},"doorType":{"description":"How a door opens, for its plan symbol and 3D picture: hinged (one leaf, the default), double, sliding, automatic (two sliding leaves) or revolving. Doors and gates only; display only.","type":"string","enum":["hinged","double","sliding","automatic","revolving"]},"text":{"description":"Words shown on it: a sign or menu board carries them on its face, a floor marking (zone, parking, road, sidewalk, lawn, rug) painted on the floor. Display only.","type":"string","minLength":1,"maxLength":60},"symbol":{"description":"A symbol painted on a floor marking: arrow (along its length, turned with it), wheelchair (the accessible bay sign), crosswalk (zebra stripes across its length), bays (parking bay lines every 2.5 m along its length) or hatch (a no-go area). Floor markings only; display only.","type":"string","enum":["arrow","wheelchair","crosswalk","bays","hatch"]},"group":{"type":"string","minLength":1,"maxLength":40},"tags":{"description":"Up to 8 tags, each /^[a-z0-9_-]{1,24}$/, for scenarios to refer to.","maxItems":8,"type":"array","items":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"}},"source":{"description":"Where its position and size come from: drawing (read off a plan), measured (on site) or assumed (a typical size, or hidden in the drawing). Display only: not part of any calculation.","type":"string","enum":["drawing","measured","assumed"]},"note":{"description":"A note for whoever checks the model (what was assumed, what to confirm on site), up to 300 characters; not drawn on the plan and not part of any calculation.","type":"string","minLength":1,"maxLength":300},"id":{"type":"string","minLength":1,"maxLength":60},"label":{"type":"string","minLength":1,"maxLength":60},"x":{"type":"number","minimum":0},"z":{"type":"number","minimum":0},"w":{"type":"number","minimum":0.02,"maximum":500},"d":{"type":"number","minimum":0.02,"maximum":500},"h":{"type":"number","minimum":0.01,"maximum":50},"polygon":{"description":"Instead of x/z/w/d: the corners of the part on the floor, in order, metres (3-32, no self-crossing); x, z, w, d and the footprint are derived from them, unturned.","minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}}},"required":["kind"],"additionalProperties":false,"description":"A prepared part. Give kind and the minimum x/z corner; omit w/d/h to use the part size listed in get_space.parts. Or give polygon (corners on the floor) instead of x/z/w/d for a part of any outline."}},"place":{"default":[],"description":"Place catalog items, including complete sets, in this same atomic edit. x/z is the minimum corner of the complete rotated bounds, in metres. Sizes are preserved; oversized sets are rejected. Sets get a new group unless group is specified. Use preview=true to check the proposal first.","maxItems":20,"type":"array","items":{"type":"object","properties":{"item":{"type":"string","minLength":1,"maxLength":60,"description":"Catalog ID from get_part_catalog: a basic part, size preset, or reusable set."},"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500},"rotation":{"type":"number","minimum":-180,"maximum":180},"y":{"type":"number","minimum":0,"maximum":50},"group":{"type":"string","minLength":1,"maxLength":40}},"required":["item","x","z"],"additionalProperties":false}},"addArray":{"default":[],"description":"Place prepared parts in a two-direction array in one edit; supports boxes and polygon prisms. Each cell gets a unique ID.","maxItems":20,"type":"array","items":{"type":"object","properties":{"part":{"type":"object","properties":{"kind":{"type":"string","enum":["wall","column","zone","desk","table","chair","sofa","cabinet","shelf","display","counter","rack","pallet","machine","booth","stage","bed","plant","block","partition","door","window","stairs","elevator","escalator","round_table","bookshelf","locker","whiteboard","wardrobe","kitchen","fridge","rug","checkout","fridge_case","clothes_rack","kiosk","conveyor","workbench","roll_cage","container","tank","forklift","charger","dock_door","seating_row","podium","screen","barrier","building","parking","road","sidewalk","lawn","tree","car","truck","fence","gate","bench","pole","person","toilet","washbasin","urinal","atm","pos_terminal","coffee_machine","oven","dishwasher","microwave","stool","parasol","showcase","menu_board","planter","sign","shopping_cart","cart_corral","bicycle","dock_shelter","dock_leveler","wheel_stop","fire_extinguisher","robot_arm","mobile_robot","pod","sorter","spiral_conveyor","chute","carton_erector","aircraft","jet_bridge","baggage_carousel","security_scanner","metal_detector","self_checkout","platform_trolley","crate_stack","toilet_cubicle","gable_roof","barrel_roof","solid"]},"locked":{"type":"boolean"},"solid":{"type":"object","properties":{"version":{"type":"number","const":1},"recipe":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"extrude"},"axis":{"type":"string","enum":["x","y","z"]},"profile":{"minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"u":{"type":"number","minimum":0,"maximum":1},"v":{"type":"number","minimum":0,"maximum":1}},"required":["u","v"],"additionalProperties":false}}},"required":["type","axis","profile"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"revolve"},"profile":{"minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"u":{"type":"number","minimum":0,"maximum":1},"v":{"type":"number","minimum":0,"maximum":1}},"required":["u","v"],"additionalProperties":false}},"startDegrees":{"type":"number","minimum":-180,"maximum":180},"sweepDegrees":{"type":"number","minimum":0.1,"maximum":360}},"required":["type","profile","sweepDegrees"],"additionalProperties":false}]},"rotation":{"type":"object","properties":{"x":{"type":"number","minimum":-180,"maximum":180},"y":{"type":"number","minimum":-180,"maximum":180},"z":{"type":"number","minimum":-180,"maximum":180}},"required":["x","y","z"],"additionalProperties":false},"mirror":{"type":"object","properties":{"x":{"type":"boolean"},"y":{"type":"boolean"},"z":{"type":"boolean"}},"required":["x","y","z"],"additionalProperties":false}},"required":["version","recipe"],"additionalProperties":false,"description":"Closed editable solid v1. Profile u/v are 0..1: extrusion section (axis y: x/z, axis x: z/y, axis z: x/y); revolve radius/height. w/d/h are reference dimensions. Mirror around reference-box centre, then right-handed X→Y→Z degree rotations around that centre, then outer plan rotation and placement. Partial revolutions (0.1..359.9 degrees) have closed end caps; exactly 360 is a full turn. No holes. Curves use deterministic 64 segments/full turn. blocks:false explicitly marks decoration; unsupported blocking 3D geometry cannot be used as a routing proxy."},"rotation":{"description":"Degrees counter-clockwise on the plan about the centre of the box; 0 when omitted. x/z/w/d stay the unrotated box. A multiple of 90° is stored as the turned box (w/d swapped for a quarter turn) without rotation, the turn of a part with a front kept in facing.","type":"number","exclusiveMinimum":-180,"maximum":180},"passageHeading":{"description":"Physical positive normal of a rectangular door/dock_door/gate in its canonical box frame, degrees (-180,180]; effective heading adds rotation. 0 toward +x, 90 toward -z. Permission is selected per agent by oneWayPassages.","type":"number","exclusiveMinimum":-180,"maximum":180},"facing":{"description":"Which way a part with a front (catalog front: true, e.g. chairs, vehicles, stairs, toilets) faces within its box: the quarter or half turn, degrees counter-clockwise on the plan, that a rotation of 90°, 180° or -90° left; 0 when omitted: front toward +z (south); 90 toward +x (east), 180 or -180 toward -z (north), -90 or 270 toward -x (west). Set it to turn the front without moving the box; rotation, turn and rotate turn the front with the box. Display only; other kinds ignore it.","type":"number","enum":[-180,-90,0,90,180,270]},"y":{"description":"Elevation of the underside above the floor, metres; 0 when omitted.","type":"number","minimum":0,"maximum":50},"footprint":{"description":"Polygon base as {x,z} vertices in the unrotated box (0..w, 0..d), 3-32, no self-crossing, spanning the whole box; the box when omitted.","minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}},"blocks":{"description":"Whether the part blocks movement; overrides the kind default.","type":"boolean"},"color":{"type":"integer","minimum":0,"maximum":16777215},"material":{"type":"object","properties":{"materialId":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"override":{"type":"object","properties":{"baseColor":{"type":"integer","minimum":0,"maximum":16777215},"roughness":{"type":"number","minimum":0,"maximum":1},"metalness":{"type":"number","minimum":0,"maximum":1},"opacity":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false}},"additionalProperties":false},"referenceIds":{"maxItems":8,"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"}},"accent":{"description":"A second colour 0xRRGGBB for the members drawn apart: a rack's beams (its posts keep the structure colour), a sign's face, a door's leaf. Display only.","type":"integer","minimum":0,"maximum":16777215},"doorType":{"description":"How a door opens, for its plan symbol and 3D picture: hinged (one leaf, the default), double, sliding, automatic (two sliding leaves) or revolving. Doors and gates only; display only.","type":"string","enum":["hinged","double","sliding","automatic","revolving"]},"text":{"description":"Words shown on it: a sign or menu board carries them on its face, a floor marking (zone, parking, road, sidewalk, lawn, rug) painted on the floor. Display only.","type":"string","minLength":1,"maxLength":60},"symbol":{"description":"A symbol painted on a floor marking: arrow (along its length, turned with it), wheelchair (the accessible bay sign), crosswalk (zebra stripes across its length), bays (parking bay lines every 2.5 m along its length) or hatch (a no-go area). Floor markings only; display only.","type":"string","enum":["arrow","wheelchair","crosswalk","bays","hatch"]},"group":{"type":"string","minLength":1,"maxLength":40},"tags":{"description":"Up to 8 tags, each /^[a-z0-9_-]{1,24}$/, for scenarios to refer to.","maxItems":8,"type":"array","items":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"}},"source":{"description":"Where its position and size come from: drawing (read off a plan), measured (on site) or assumed (a typical size, or hidden in the drawing). Display only: not part of any calculation.","type":"string","enum":["drawing","measured","assumed"]},"note":{"description":"A note for whoever checks the model (what was assumed, what to confirm on site), up to 300 characters; not drawn on the plan and not part of any calculation.","type":"string","minLength":1,"maxLength":300},"id":{"type":"string","minLength":1,"maxLength":60},"label":{"type":"string","minLength":1,"maxLength":60},"x":{"type":"number","minimum":0},"z":{"type":"number","minimum":0},"w":{"type":"number","minimum":0.02,"maximum":500},"d":{"type":"number","minimum":0.02,"maximum":500},"h":{"type":"number","minimum":0.01,"maximum":50},"polygon":{"description":"Instead of x/z/w/d: the corners of the part on the floor, in order, metres (3-32, no self-crossing); x, z, w, d and the footprint are derived from them, unturned.","minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}}},"required":["kind"],"additionalProperties":false,"description":"The part to repeat. Omit part.id: each cell needs a distinct ID. Set idPrefix on the array to choose stable IDs. Give x/z or polygon as for an ordinary part."},"rows":{"type":"integer","minimum":1,"maximum":50},"columns":{"type":"integer","minimum":1,"maximum":50},"rowStep":{"type":"object","properties":{"dx":{"type":"number","minimum":-500,"maximum":500},"dz":{"type":"number","minimum":-500,"maximum":500}},"required":["dx","dz"],"additionalProperties":false,"description":"Metres from one row or column to the next; diagonal steps are allowed."},"columnStep":{"type":"object","properties":{"dx":{"type":"number","minimum":-500,"maximum":500},"dz":{"type":"number","minimum":-500,"maximum":500}},"required":["dx","dz"],"additionalProperties":false,"description":"Metres from one row or column to the next; diagonal steps are allowed."},"idPrefix":{"description":"IDs of the cells, row by row: prefix-1, prefix-2, …; generated when omitted.","type":"string","minLength":1,"maxLength":50,"pattern":"^[A-Za-z0-9_-]+$"}},"required":["part","rows","columns","rowStep","columnStep"],"additionalProperties":false,"description":"Place a part at every row/column offset from part.x/z (or shift every corner of part.polygon). The first cell is at the supplied position; rows and columns include it. IDs are generated, or idPrefix-1, idPrefix-2, … row by row. In part.label, {n} becomes the cell number and {row}/{column} its row and column (from 1): \"Shelf {n}\", \"Seat {row}-{column}\"."}},"update":{"default":[],"description":"Change fields of existing objects by ID. null takes passageHeading, rotation, facing, y, footprint, blocks, color, group or tags back to the default, and footprint [] makes a polygon part its box again. A rotation given sets the whole turn of a part with a front, its facing included (rotation 180 again leaves it as it is). Objects with locked: true stay unchanged unless the same update sets locked: false (only when the user asks).","maxItems":100,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":60},"label":{"type":"string","minLength":1,"maxLength":60},"kind":{"type":"string","enum":["wall","column","zone","desk","table","chair","sofa","cabinet","shelf","display","counter","rack","pallet","machine","booth","stage","bed","plant","block","partition","door","window","stairs","elevator","escalator","round_table","bookshelf","locker","whiteboard","wardrobe","kitchen","fridge","rug","checkout","fridge_case","clothes_rack","kiosk","conveyor","workbench","roll_cage","container","tank","forklift","charger","dock_door","seating_row","podium","screen","barrier","building","parking","road","sidewalk","lawn","tree","car","truck","fence","gate","bench","pole","person","toilet","washbasin","urinal","atm","pos_terminal","coffee_machine","oven","dishwasher","microwave","stool","parasol","showcase","menu_board","planter","sign","shopping_cart","cart_corral","bicycle","dock_shelter","dock_leveler","wheel_stop","fire_extinguisher","robot_arm","mobile_robot","pod","sorter","spiral_conveyor","chute","carton_erector","aircraft","jet_bridge","baggage_carousel","security_scanner","metal_detector","self_checkout","platform_trolley","crate_stack","toilet_cubicle","gable_roof","barrel_roof","solid"]},"x":{"type":"number","minimum":0},"z":{"type":"number","minimum":0},"w":{"type":"number","minimum":0.02,"maximum":500},"d":{"type":"number","minimum":0.02,"maximum":500},"h":{"type":"number","minimum":0.01,"maximum":50},"locked":{"type":"boolean"},"solid":{"description":"null removes the recipe; change kind away from solid in the same update.","anyOf":[{"type":"object","properties":{"version":{"type":"number","const":1},"recipe":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"extrude"},"axis":{"type":"string","enum":["x","y","z"]},"profile":{"minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"u":{"type":"number","minimum":0,"maximum":1},"v":{"type":"number","minimum":0,"maximum":1}},"required":["u","v"],"additionalProperties":false}}},"required":["type","axis","profile"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"revolve"},"profile":{"minItems":3,"maxItems":32,"type":"array","items":{"type":"object","properties":{"u":{"type":"number","minimum":0,"maximum":1},"v":{"type":"number","minimum":0,"maximum":1}},"required":["u","v"],"additionalProperties":false}},"startDegrees":{"type":"number","minimum":-180,"maximum":180},"sweepDegrees":{"type":"number","minimum":0.1,"maximum":360}},"required":["type","profile","sweepDegrees"],"additionalProperties":false}]},"rotation":{"type":"object","properties":{"x":{"type":"number","minimum":-180,"maximum":180},"y":{"type":"number","minimum":-180,"maximum":180},"z":{"type":"number","minimum":-180,"maximum":180}},"required":["x","y","z"],"additionalProperties":false},"mirror":{"type":"object","properties":{"x":{"type":"boolean"},"y":{"type":"boolean"},"z":{"type":"boolean"}},"required":["x","y","z"],"additionalProperties":false}},"required":["version","recipe"],"additionalProperties":false,"description":"Closed editable solid v1. Profile u/v are 0..1: extrusion section (axis y: x/z, axis x: z/y, axis z: x/y); revolve radius/height. w/d/h are reference dimensions. Mirror around reference-box centre, then right-handed X→Y→Z degree rotations around that centre, then outer plan rotation and placement. Partial revolutions (0.1..359.9 degrees) have closed end caps; exactly 360 is a full turn. No holes. Curves use deterministic 64 segments/full turn. blocks:false explicitly marks decoration; unsupported blocking 3D geometry cannot be used as a routing proxy."},{"type":"null"}]},"rotation":{"description":"Degrees counter-clockwise on the plan about the centre of the box; 0 when omitted. x/z/w/d stay the unrotated box. A multiple of 90° is stored as the turned box (w/d swapped for a quarter turn) without rotation, the turn of a part with a front kept in facing. null turns it back to 0.","anyOf":[{"type":"number","exclusiveMinimum":-180,"maximum":180},{"type":"null"}]},"passageHeading":{"description":"Physical positive normal of a rectangular door/dock_door/gate in its canonical box frame, degrees (-180,180]; effective heading adds rotation. 0 toward +x, 90 toward -z. Permission is selected per agent by oneWayPassages. null removes the physical directional normal.","anyOf":[{"type":"number","exclusiveMinimum":-180,"maximum":180},{"type":"null"}]},"facing":{"description":"Which way a part with a front (catalog front: true, e.g. chairs, vehicles, stairs, toilets) faces within its box: the quarter or half turn, degrees counter-clockwise on the plan, that a rotation of 90°, 180° or -90° left; 0 when omitted: front toward +z (south); 90 toward +x (east), 180 or -180 toward -z (north), -90 or 270 toward -x (west). Set it to turn the front without moving the box; rotation, turn and rotate turn the front with the box. Display only; other kinds ignore it. null faces the part the way its kind is drawn.","anyOf":[{"type":"number","enum":[-180,-90,0,90,180,270]},{"type":"null"}]},"y":{"description":"Elevation of the underside above the floor, metres; 0 when omitted. null puts it back on the floor.","anyOf":[{"type":"number","minimum":0,"maximum":50},{"type":"null"}]},"footprint":{"description":"Polygon base as {x,z} vertices in the unrotated box (0..w, 0..d), 3-32, no self-crossing, spanning the whole box; the box when omitted. [] or null makes the part its plain box again.","anyOf":[{"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}},{"type":"null"}]},"blocks":{"description":"Whether the part blocks movement; overrides the kind default. null returns to the kind's default.","type":["boolean","null"]},"color":{"description":"null returns to the kind's colour.","anyOf":[{"type":"integer","minimum":0,"maximum":16777215},{"type":"null"}]},"material":{"description":"null removes the PBR material assignment.","anyOf":[{"type":"object","properties":{"materialId":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"},"override":{"type":"object","properties":{"baseColor":{"type":"integer","minimum":0,"maximum":16777215},"roughness":{"type":"number","minimum":0,"maximum":1},"metalness":{"type":"number","minimum":0,"maximum":1},"opacity":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false}},"additionalProperties":false},{"type":"null"}]},"referenceIds":{"description":"null removes reference links.","anyOf":[{"maxItems":8,"type":"array","items":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9_-]+$"}},{"type":"null"}]},"accent":{"description":"A second colour 0xRRGGBB for the members drawn apart: a rack's beams (its posts keep the structure colour), a sign's face, a door's leaf. Display only.","type":"integer","minimum":0,"maximum":16777215},"doorType":{"description":"How a door opens, for its plan symbol and 3D picture: hinged (one leaf, the default), double, sliding, automatic (two sliding leaves) or revolving. Doors and gates only; display only.","type":"string","enum":["hinged","double","sliding","automatic","revolving"]},"text":{"description":"Words shown on it: a sign or menu board carries them on its face, a floor marking (zone, parking, road, sidewalk, lawn, rug) painted on the floor. Display only.","type":"string","minLength":1,"maxLength":60},"symbol":{"description":"A symbol painted on a floor marking: arrow (along its length, turned with it), wheelchair (the accessible bay sign), crosswalk (zebra stripes across its length), bays (parking bay lines every 2.5 m along its length) or hatch (a no-go area). Floor markings only; display only.","type":"string","enum":["arrow","wheelchair","crosswalk","bays","hatch"]},"group":{"description":"null takes it out of its group.","anyOf":[{"type":"string","minLength":1,"maxLength":40},{"type":"null"}]},"tags":{"description":"Up to 8 tags, each /^[a-z0-9_-]{1,24}$/, for scenarios to refer to. null removes them.","anyOf":[{"maxItems":8,"type":"array","items":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"}},{"type":"null"}]},"source":{"description":"Where its position and size come from: drawing (read off a plan), measured (on site) or assumed (a typical size, or hidden in the drawing). Display only: not part of any calculation. null removes it.","anyOf":[{"type":"string","enum":["drawing","measured","assumed"]},{"type":"null"}]},"note":{"description":"A note for whoever checks the model (what was assumed, what to confirm on site), up to 300 characters; not drawn on the plan and not part of any calculation. null removes it.","anyOf":[{"type":"string","minLength":1,"maxLength":300},{"type":"null"}]}},"required":["id"],"additionalProperties":false}},"remove":{"default":[],"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"move":{"default":[],"description":"Move objects by a relative offset in metres.","maxItems":100,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":60},"dx":{"type":"number","minimum":-500,"maximum":500},"dz":{"type":"number","minimum":-500,"maximum":500}},"required":["id","dx","dz"],"additionalProperties":false}},"rotate":{"default":[],"description":"Turn footprints 90° around their centres (swaps w and d; a polygon part turns its polygon, and a part with a front its facing, counter-clockwise, as turn by 90 does).","maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"turn":{"default":[],"description":"Turn parts by any angle. Multiples of 90° are stored as a w/d swap without rotation; a part with a front keeps the turn in facing, so it faces the new way.","maxItems":100,"type":"array","items":{"type":"object","properties":{"ids":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"degrees":{"type":"number","minimum":-360,"maximum":360,"description":"Degrees counter-clockwise on the plan."},"pivot":{"default":"each","description":"each: every part about its own centre; selection: the parts as one block about the centre of their bounds.","type":"string","enum":["each","selection"]}},"required":["ids","degrees"],"additionalProperties":false}},"mirror":{"default":[],"description":"Mirror parts across the middle of their bounds: each goes to its mirrored place, its turn reflected (a chair then faces the other way) and its polygon base mirrored. Select a wall with its doors to mirror them together.","maxItems":100,"type":"array","items":{"type":"object","properties":{"ids":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"axis":{"type":"string","enum":["x","z"],"description":"x: left to right, across the vertical line through the middle of their bounds; z: top to bottom."}},"required":["ids","axis"],"additionalProperties":false}},"copy":{"default":[],"description":"Duplicate objects. With dx/dz the copies form a row at that spacing (copy n sits at n×offset); otherwise each copy goes to a free spot nearby.","maxItems":20,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":60},"count":{"default":1,"type":"integer","minimum":1,"maximum":50},"dx":{"type":"number","minimum":-500,"maximum":500},"dz":{"type":"number","minimum":-500,"maximum":500}},"required":["id"],"additionalProperties":false}},"align":{"default":[],"description":"Align objects to the shared bounding box of the given IDs.","maxItems":20,"type":"array","items":{"type":"object","properties":{"ids":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"mode":{"type":"string","enum":["left","center-x","right","top","center-z","bottom"]}},"required":["ids","mode"],"additionalProperties":false}},"distribute":{"default":[],"description":"Distribute with equal gaps; outer objects remain in place. Rejects overlaps caused by insufficient room.","maxItems":20,"type":"array","items":{"type":"object","properties":{"ids":{"minItems":3,"maxItems":1000,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"axis":{"type":"string","enum":["x","z"]}},"required":["ids","axis"],"additionalProperties":false}},"rotateSelection":{"default":[],"description":"Rotate each selection 90° clockwise as one block around its bounds; preserve relative positions and shift the whole block inside the floor if needed.","maxItems":20,"type":"array","items":{"type":"object","properties":{"ids":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}}},"required":["ids"],"additionalProperties":false}},"copySelection":{"default":[],"description":"Repeat a selection at n×(dx,dz) spacing, preserving all relative positions. Copies are unlocked. Refuses out-of-bounds copies.","maxItems":20,"type":"array","items":{"type":"object","properties":{"ids":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"count":{"default":1,"type":"integer","minimum":1,"maximum":50},"dx":{"type":"number","minimum":-500,"maximum":500},"dz":{"type":"number","minimum":-500,"maximum":500}},"required":["ids","dx","dz"],"additionalProperties":false}},"copyArray":{"default":[],"description":"Repeat an existing selection across rows and columns. The original selection occupies cell (0,0); other cells get unique IDs and groups. Refuses out-of-bounds copies.","maxItems":20,"type":"array","items":{"type":"object","properties":{"ids":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"rows":{"type":"integer","minimum":1,"maximum":50},"columns":{"type":"integer","minimum":1,"maximum":50},"rowStep":{"type":"object","properties":{"dx":{"type":"number","minimum":-500,"maximum":500},"dz":{"type":"number","minimum":-500,"maximum":500}},"required":["dx","dz"],"additionalProperties":false,"description":"Metres from one row or column to the next; diagonal steps are allowed."},"columnStep":{"type":"object","properties":{"dx":{"type":"number","minimum":-500,"maximum":500},"dz":{"type":"number","minimum":-500,"maximum":500}},"required":["dx","dz"],"additionalProperties":false,"description":"Metres from one row or column to the next; diagonal steps are allowed."}},"required":["ids","rows","columns","rowStep","columnStep"],"additionalProperties":false,"description":"The original selection is cell (0,0); every other cell is a new, unlocked copy with its own group names."}},"walls":{"default":[],"description":"Draw walls along polylines: one wall per segment, turned to its angle, all in one group (the group given, else a new one).","maxItems":20,"type":"array","items":{"type":"object","properties":{"points":{"minItems":2,"maxItems":64,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}},"thickness":{"type":"number","minimum":0.02,"maximum":500},"height":{"type":"number","minimum":0.01,"maximum":50},"closed":{"default":false,"description":"Add the segment from the last point back to the first.","type":"boolean"},"kind":{"default":"wall","type":"string","enum":["wall","partition","fence"]},"group":{"type":"string","minLength":1,"maxLength":40},"align":{"default":"center","description":"Where the points lie on the wall: its middle, or its left or right face walking from each point to the next on the plan (x right, z towards you). A closed outline drawn clockwise on the plan has the room on its right: align 'left' keeps the walls outside it.","type":"string","enum":["center","left","right"]},"joinCorners":{"default":true,"description":"Lengthen walls where they turn so the outside of each corner is closed; false keeps each wall to its segment.","type":"boolean"}},"required":["points"],"additionalProperties":false}},"openings":{"default":[],"description":"Put a door, window, gate or dock_door on a wall, partition or fence: an existing one, or one this batch adds with an explicit id in add (walls drawn by walls get new IDs: read them from the result, or add their openings in a later edit). Centred on the wall's line, as thick as it, at its rotation, so it opens the wall; it joins the wall's group.","maxItems":50,"type":"array","items":{"type":"object","properties":{"wall":{"type":"string","minLength":1,"maxLength":60},"at":{"description":"Metres along the wall from its start to the opening's middle. The start is the wall's minimum-x end before rotation (minimum-z for a wall deeper than wide); for a wall drawn with walls, the wall's own start, which lies past the segment's first point where a corner is joined. Or give point instead.","type":"number","minimum":0,"maximum":500},"point":{"description":"Where the opening's middle is, in floor metres (as measured on a plan): taken to the wall's line. Use it instead of at.","type":"object","properties":{"x":{"type":"number"},"z":{"type":"number"}},"required":["x","z"],"additionalProperties":false},"kind":{"type":"string","enum":["door","window","gate","dock_door"]},"width":{"description":"Opening width; the part's own width when omitted.","type":"number","minimum":0.02,"maximum":500},"id":{"description":"Its own ID; the next free one of the kind when omitted.","type":"string","minLength":1,"maxLength":60},"label":{"type":"string","minLength":1,"maxLength":60},"passageHeading":{"description":"Physical positive normal of a rectangular door/dock_door/gate in its canonical box frame, degrees (-180,180]; effective heading adds rotation. 0 toward +x, 90 toward -z. Permission is selected per agent by oneWayPassages.","type":"number","exclusiveMinimum":-180,"maximum":180},"h":{"description":"Its height; the kind's when omitted.","type":"number","minimum":0.01,"maximum":50},"y":{"description":"Its underside above the floor, such as a window's sill; 0 when omitted.","type":"number","minimum":0,"maximum":50}},"required":["wall","kind"],"additionalProperties":false}},"group":{"default":[],"description":"Put parts in a named group (they select together in the editor); null takes them out.","maxItems":20,"type":"array","items":{"type":"object","properties":{"ids":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"group":{"anyOf":[{"type":"string","minLength":1,"maxLength":40},{"type":"null"}]}},"required":["ids","group"],"additionalProperties":false}},"dock":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"destination":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"autoPlaceStations":{"default":false,"description":"Explicitly allow moving both provisional robot stations into the largest connected area.","type":"boolean"},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"simulate_space","kind":"act","impl":"imperative","description":"Apply optional robot/task/workload settings and recalculate the current room locally. Running a simulation requires Pro; Free accounts prepare scenarios and read saved results. Returns computed results, assumptions and warnings; not an LLM prediction. No application AI API call.","title":"Run a simple simulation","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"settings":{"default":{},"type":"object","properties":{"task":{"type":"string","enum":["clean","transport"]},"fleetSize":{"type":"integer","minimum":1,"maximum":8},"speed":{"type":"number","minimum":0.1,"maximum":2},"radius":{"type":"number","minimum":0.15,"maximum":0.5},"robotHeight":{"description":"Robot height above the floor, metres. Omitted means an assumed 0.4 m, not a confirmed machine dimension. Raised parts block only when their underside is below this height.","type":"number","minimum":0.05,"maximum":5},"coverageWidth":{"type":"number","minimum":0.4,"maximum":1.2},"durationMinutes":{"type":"integer","minimum":1,"maximum":120},"demandPerHour":{"type":"integer","minimum":0,"maximum":240},"serviceSeconds":{"type":"integer","minimum":0,"maximum":120}},"additionalProperties":false},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"edit_floors","kind":"act","impl":"imperative","description":"Edit the site in one batch, in the order: create or rename buildings (structures); remove buildings and floors; update floors; build buildings (buildStructures); add floors; duplicate and move buildings; disconnect, updateConnections, connect and cores; activate. A site may hold several buildings (a warehouse, an office block, towers, a car park), each a group of floor areas; the ground around them and bridges between them belong to none. buildStructures puts up a building of empty storeys with its lift and stairs in one step, duplicateStructures copies one with its parts and inner connections, cores adds a lift or stairs through every storey. Scenario places can name a building: {\"tag\": \"unit\", \"structure\": \"C\", \"pick\": \"random\"}. Level 0 is the ground floor, 1 the next level up, negative levels are basements; floors on the same level sit side by side at x/z (building metres). Add an empty floor with width/depth, or copyFrom an existing floor to repeat its parts (typical floors). connect joins two floors with a passage (a corridor on one level, a ramp between levels), stairs, an elevator or an escalator given only kind, from and to: the ends are placed automatically across facing edges (between levels, a ramp, stairs or an escalator reaches back into the lower floor) or on elevator, stairs or escalator parts of stacked floors; pass fromAt/toAt (floor-local metres) only to override. get_space.building.connections reports each length, rise, slope and notes such as ramps steeper than 1:12. activate chooses the floor that get_space.scene, create_space, check_space and simulate_space act on, and edit_space when given no floor; new floors can be given an id to activate them in the same batch. simulate_space works on one floor at a time; run_process_scenario and check_space reach route agents across floors along connections. No application AI API call.","title":"Add, move, connect, remove or switch floors and buildings","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"name":{"type":"string","minLength":1,"maxLength":80},"storyHeight":{"type":"number","minimum":2,"maximum":12},"add":{"default":[],"description":"elevation (m, floor surface height in the building) defaults to level × storyHeight; height (m, floor-to-floor) defaults to storyHeight. structure puts the floor in one of the site's buildings: then it stands on that building's floor below (its elevation plus its height; under the lowest, a storey below it), as high as that floor, at its place and size and named for the building, unless given.","maxItems":20,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40},"name":{"type":"string","minLength":1,"maxLength":80},"level":{"type":"integer","minimum":-5,"maximum":60},"x":{"type":"number","minimum":0,"maximum":1000},"z":{"type":"number","minimum":0,"maximum":1000},"width":{"type":"number","minimum":0.1,"maximum":500},"depth":{"type":"number","minimum":0.1,"maximum":500},"copyFrom":{"type":"string","minLength":1,"maxLength":40},"elevation":{"type":"number","minimum":-30,"maximum":300},"height":{"type":"number","minimum":2,"maximum":12},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"}},"required":["level"],"additionalProperties":false}},"update":{"default":[],"description":"null for elevation/height puts it back to the building default; structure moves the floor into one of the site's buildings, null takes it out of any.","maxItems":120,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40},"name":{"type":"string","minLength":1,"maxLength":80},"level":{"type":"integer","minimum":-5,"maximum":60},"x":{"type":"number","minimum":0,"maximum":1000},"z":{"type":"number","minimum":0,"maximum":1000},"elevation":{"anyOf":[{"type":"number","minimum":-30,"maximum":300},{"type":"null"}]},"height":{"anyOf":[{"type":"number","minimum":2,"maximum":12},{"type":"null"}]},"structure":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},{"type":"null"}]}},"required":["id"],"additionalProperties":false}},"remove":{"default":[],"maxItems":120,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"copyContents":{"default":[],"description":"Make existing floors' parts a copy of another floor's (same IDs, so later edits can list them together in edit_space.floors). Each target keeps its own outline, holes and connections; every part must fit on it. Runs after floors are added, copied and moved.","maxItems":10,"type":"array","items":{"type":"object","properties":{"from":{"type":"string","minLength":1,"maxLength":40},"to":{"minItems":1,"maxItems":120,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}}},"required":["from","to"],"additionalProperties":false}},"connect":{"default":[],"description":"Connect two floors: passage (a corridor on one level, a ramp between levels), stairs, elevator or escalator. Leave fromAt/toAt out to place the ends automatically. direction (forward = from → to) defaults to both, escalators to forward; speed (m/s) defaults to the agent's own, escalators to 0.5; capacity (agents at once) defaults to unlimited, escalators to one per 0.4 m of length. Escalator defaults are reported as assumptions: the speed is EN 115-1's general value, the capacity an estimate with no source. An elevator with cars (1–8) runs lift cars on its shaft (the elevator connections stacked at that place): capacity is then people per car, speed the car's (1 m/s when left out), doorSeconds the doors opening plus closing at a stop (4 s) and dwellSeconds the doors held open (2 s); those defaults are estimates with no source, reported as assumptions. Without cars an elevator is ridden like a corridor, capacity agents at once. flowPerMinute lets that many agents start along it per minute, first come first (a ticket gate, a turnstile, a door or a stair, from a site count or a standard you name); those after wait at its entrance, counted as waiting for the connection. Not on a lift with cars.","maxItems":20,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40},"kind":{"type":"string","enum":["passage","stairs","elevator","escalator"]},"from":{"type":"string","minLength":1,"maxLength":40},"to":{"type":"string","minLength":1,"maxLength":40},"width":{"type":"number","minimum":0.5,"maximum":20},"label":{"type":"string","minLength":1,"maxLength":60},"fromAt":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"toAt":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"direction":{"type":"string","enum":["both","forward","backward"]},"speed":{"type":"number","minimum":0.05,"maximum":5},"capacity":{"type":"integer","minimum":1,"maximum":1000},"flowPerMinute":{"type":"number","minimum":0.1,"maximum":6000},"cars":{"type":"integer","minimum":1,"maximum":8},"doorSeconds":{"type":"number","minimum":0,"maximum":60},"dwellSeconds":{"type":"number","minimum":0,"maximum":600}},"required":["kind","from","to"],"additionalProperties":false}},"updateConnections":{"default":[],"description":"null for fromAt/toAt puts that end back to automatic; null for direction/speed/capacity puts it back to the default of the kind; null for flowPerMinute/cars/doorSeconds/dwellSeconds takes them off. A lift's cars, capacity, speed and stop times are read from its lowest connection that gives each: set them on every connection of the shaft (cores does).","maxItems":400,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":40},"kind":{"type":"string","enum":["passage","stairs","elevator","escalator"]},"width":{"type":"number","minimum":0.5,"maximum":20},"label":{"anyOf":[{"type":"string","minLength":1,"maxLength":60},{"type":"null"}]},"fromAt":{"anyOf":[{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},{"type":"null"}]},"toAt":{"anyOf":[{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},{"type":"null"}]},"direction":{"anyOf":[{"type":"string","enum":["both","forward","backward"]},{"type":"null"}]},"speed":{"anyOf":[{"type":"number","minimum":0.05,"maximum":5},{"type":"null"}]},"capacity":{"anyOf":[{"type":"integer","minimum":1,"maximum":1000},{"type":"null"}]},"flowPerMinute":{"anyOf":[{"type":"number","minimum":0.1,"maximum":6000},{"type":"null"}]},"cars":{"anyOf":[{"type":"integer","minimum":1,"maximum":8},{"type":"null"}]},"doorSeconds":{"anyOf":[{"type":"number","minimum":0,"maximum":60},{"type":"null"}]},"dwellSeconds":{"anyOf":[{"type":"number","minimum":0,"maximum":600},{"type":"null"}]}},"required":["id"],"additionalProperties":false}},"disconnect":{"default":[],"maxItems":400,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"structures":{"default":[],"description":"Buildings on the site (a warehouse, an office block, a tower, a car park): create one by a new id, or rename/recolour an existing one (color 0xRRGGBB as a number; null: the theme's). A building groups floors for editing, display and scenario places; routes still follow connections.","maxItems":40,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"name":{"type":"string","minLength":1,"maxLength":80},"color":{"anyOf":[{"type":"integer","minimum":0,"maximum":16777215},{"type":"null"}]}},"required":["id"],"additionalProperties":false}},"buildStructures":{"default":[],"description":"Put up a building of empty storeys over a footprint (x, z: its corner in site metres; width × depth), each storey a floor of that building (storeyHeight for all, or storeyHeights one by one). lift and stairs (site metres, on the footprint) run through every storey; stairs climb along z (or x) and turn back at each landing. Standing on a ground floor area (one of no building) at the same elevation, the footprint becomes a hole in it when it fits inside; it must not overlap another building. entrance connects it to that ground with a doorway; otherwise connect its entrance with a passage (connect places the ends of a building standing in the ground at the middle of its most open side).","maxItems":10,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"name":{"type":"string","minLength":1,"maxLength":80},"color":{"type":"integer","minimum":0,"maximum":16777215},"x":{"type":"number","minimum":0,"maximum":1000},"z":{"type":"number","minimum":0,"maximum":1000},"width":{"type":"number","minimum":0.1,"maximum":500},"depth":{"type":"number","minimum":0.1,"maximum":500},"storeys":{"type":"integer","minimum":1,"maximum":120},"storeyHeight":{"type":"number","minimum":2,"maximum":12},"storeyHeights":{"description":"Each storey's height from the lowest, one per storey (a cinema's 10 m hall under a 9 m one); overrides storeyHeight.","minItems":1,"maxItems":120,"type":"array","items":{"type":"number","minimum":2,"maximum":12}},"level":{"type":"integer","minimum":-5,"maximum":60},"levels":{"description":"Each storey's level from the lowest, rising: put a storey on the level of the floor it bridges to (a cinema's upper floor at 10 m on the mall's L3). level, level+1, … when omitted.","minItems":1,"maxItems":120,"type":"array","items":{"type":"integer","minimum":-5,"maximum":60}},"elevation":{"type":"number","minimum":-30,"maximum":300},"lift":{"description":"Where its lift runs, site metres (on the footprint); cars, capacity (people per car), speed, doorSeconds and dwellSeconds as for cores; parts: true also puts a lift car part on every storey.","type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1000},"z":{"type":"number","minimum":0,"maximum":1000},"cars":{"type":"integer","minimum":1,"maximum":8},"capacity":{"type":"integer","minimum":1,"maximum":1000},"speed":{"type":"number","minimum":0.05,"maximum":5},"doorSeconds":{"type":"number","minimum":0,"maximum":60},"dwellSeconds":{"type":"number","minimum":0,"maximum":600},"parts":{"type":"boolean"}},"required":["x","z"],"additionalProperties":false},"stairs":{"description":"Where its stairs start, site metres: each flight runs rise × 11/7 m along z (or x) and the next turns back, so leave that much room on the footprint; parts: true also puts each flight as a stairs part.","type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1000},"z":{"type":"number","minimum":0,"maximum":1000},"along":{"type":"string","enum":["x","z"]},"parts":{"type":"boolean"}},"required":["x","z"],"additionalProperties":false},"entrance":{"description":"Connect its lowest storey to the ground floor area it stands in (a floor of no building at the same elevation, which its footprint cuts a hole in) with a doorway: a passage of no length in the middle of side (south, north, east or west), else of the side with the most ground in front of it; width 2 m when left out.","anyOf":[{"type":"boolean","const":true},{"type":"object","properties":{"side":{"type":"string","enum":["south","north","east","west"]},"width":{"type":"number","minimum":0.5,"maximum":20}},"additionalProperties":false}]}},"required":["x","z","width","depth","storeys"],"additionalProperties":false}},"duplicateStructures":{"default":[],"description":"Copy a building dx, dz metres away: its floors with their parts and its own stairs, lifts and inner passages. Connections to the rest of the site are not copied.","maxItems":10,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"newId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"name":{"type":"string","minLength":1,"maxLength":80},"color":{"type":"integer","minimum":0,"maximum":16777215},"dx":{"type":"number","minimum":-1000,"maximum":1000},"dz":{"type":"number","minimum":-1000,"maximum":1000}},"required":["id","dx","dz"],"additionalProperties":false}},"moveStructures":{"default":[],"description":"Move a building across the site (dx, dz) or raise it (dy), all its floors together.","maxItems":40,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"dx":{"type":"number","minimum":-1000,"maximum":1000},"dz":{"type":"number","minimum":-1000,"maximum":1000},"dy":{"type":"number","minimum":-100,"maximum":100}},"required":["id"],"additionalProperties":false}},"removeStructures":{"default":[],"description":"Take a building off the site: keep its floors (they belong to no building afterwards) or remove them with their connections.","maxItems":40,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"floors":{"type":"string","enum":["keep","remove"]}},"required":["id","floors"],"additionalProperties":false}},"cores":{"default":[],"description":"A lift or stairs through every storey of a building at one place (site metres): one connection per pair of floors above one another. The lift's connections form one shaft. With cars (1–8), that many cars serve every storey: people call a car at their floor and wait for it (counted as waiting), share it up to capacity people and ride to their floor; doorSeconds (doors opening plus closing) and dwellSeconds (held open) are spent at every stop. Without cars, the lift is ridden floor by floor like a corridor, capacity agents on each connection at once. Stairs start at `at` and each flight runs rise × 11/7 m along z (or x): 4.7 m for a 3 m storey, 6.3 m for 4 m, so leave that much room on the footprint; the next flight turns back to `at`. Only the connections are made unless parts: true puts the lift car or the flights too; connection ends inside other parts in the way are reported by check_space (link_end_blocked).","maxItems":10,"type":"array","items":{"type":"object","properties":{"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"kind":{"type":"string","enum":["elevator","stairs"]},"at":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1000},"z":{"type":"number","minimum":0,"maximum":1000}},"required":["x","z"],"additionalProperties":false},"along":{"type":"string","enum":["x","z"]},"width":{"type":"number","minimum":0.5,"maximum":20},"speed":{"type":"number","minimum":0.05,"maximum":5},"capacity":{"type":"integer","minimum":1,"maximum":1000},"cars":{"type":"integer","minimum":1,"maximum":8},"doorSeconds":{"type":"number","minimum":0,"maximum":60},"dwellSeconds":{"type":"number","minimum":0,"maximum":600},"label":{"type":"string","minLength":1,"maxLength":60},"parts":{"description":"Also put the parts people see: a lift car (elevator part) on every storey it serves, or on each storey the flight (stairs part) that climbs from it. A part id already on a floor is left as it is.","type":"boolean"}},"required":["structure","kind","at"],"additionalProperties":false}},"activate":{"type":"string","minLength":1,"maxLength":40},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"set_space_view","kind":"act","impl":"imperative","description":"Switch active-floor/building scope, 2D/3D, hologram/blueprint/solid appearance, colour theme, the one building of a site shown (structure), or simulation playback. Use playbackTarget=\"process\" after run_process_scenario to play, pause or seek its agents; get_space.processResult.playback reports duration, stale status and trace truncation. Use playbackTarget=\"robot\" for cleaning/transport. Named views (get_space.view.viewpoints, Studio’s Views menu) are kept with the project: open one with viewpoint, keep one with saveViewpoint (the view on screen, or a picture get_view_image drew, passing its viewpoint), remove one with deleteViewpoint. Does not run a simulation or change geometry/results.","title":"Change the visible space view","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"scope":{"type":"string","enum":["floor","building"]},"dimension":{"type":"string","enum":["2d","3d"]},"planLayout":{"description":"In 2D with scope=\"building\": all-levels shows a sheet for every level; level arranges the active level. Use scope=\"floor\" to edit one area. This is display state only.","type":"string","enum":["all-levels","level"]},"structure":{"description":"Show only one building of the site (get_space.building.structures): its floors and the floors of no building, as Buildings on the site > Show only does in Studio; null shows the whole site again. Display state only.","anyOf":[{"type":"string","minLength":1,"maxLength":40},{"type":"null"}]},"mode":{"type":"string","enum":["hologram","blueprint","solid"]},"theme":{"description":"Colour palette ID from capabilities.themes; independent of rendering mode.","type":"string","enum":["default","paper","ivory","cloud","mint","rose","lavender","peach","linen","sandstone","steel","warehouse","garden","poolside","gallery","draft-light","draft-blue","night","graphite","forest","amber","violet","contrast","print"]},"showOverhead":{"description":"3D: false hides roofs and what hangs overhead (parts raised 1.8 m or more, or tagged roof or ceiling) to see the floor beneath; true shows them again. Display state only.","type":"boolean"},"hide":{"description":"Leave parts out of the 2D and 3D drawing by kind or tag ({\"kinds\": [\"chair\"], \"tags\": [\"decor\"]}); null shows every part again. Display only: they stay in the model, its checks and every calculation.","anyOf":[{"type":"object","properties":{"kinds":{"maxItems":120,"type":"array","items":{"type":"string","enum":["wall","column","zone","desk","table","chair","sofa","cabinet","shelf","display","counter","rack","pallet","machine","booth","stage","bed","plant","block","partition","door","window","stairs","elevator","escalator","round_table","bookshelf","locker","whiteboard","wardrobe","kitchen","fridge","rug","checkout","fridge_case","clothes_rack","kiosk","conveyor","workbench","roll_cage","container","tank","forklift","charger","dock_door","seating_row","podium","screen","barrier","building","parking","road","sidewalk","lawn","tree","car","truck","fence","gate","bench","pole","person","toilet","washbasin","urinal","atm","pos_terminal","coffee_machine","oven","dishwasher","microwave","stool","parasol","showcase","menu_board","planter","sign","shopping_cart","cart_corral","bicycle","dock_shelter","dock_leveler","wheel_stop","fire_extinguisher","robot_arm","mobile_robot","pod","sorter","spiral_conveyor","chute","carton_erector","aircraft","jet_bridge","baggage_carousel","security_scanner","metal_detector","self_checkout","platform_trolley","crate_stack","toilet_cubicle","gable_roof","barrel_roof","solid"]}},"tags":{"maxItems":60,"type":"array","items":{"type":"string","minLength":1,"maxLength":24}}},"additionalProperties":false},{"type":"null"}]},"viewpoint":{"description":"Open a named view (its id or name from get_space.view.viewpoints): its floor area, 2D or 3D, scope, plan layout, building shown, and the camera or plan extent it was saved with. It sets those itself: leave out scope, dimension, planLayout and structure.","type":"string","minLength":1,"maxLength":60},"saveViewpoint":{"description":"Keep a view by name, for the user (Studio’s Views menu) and for later calls (viewpoint here, get_view_image.viewpoint): the view on screen after this call’s other changes, or `view`. A name already used is replaced; a project keeps up to 24. Display state only.","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60},"view":{"description":"A view to keep instead of the one on screen: pass get_view_image’s `viewpoint` to keep a picture you drew, with its exact camera.","type":"object","properties":{"floor":{"type":"string","minLength":1,"maxLength":40},"dimension":{"type":"string","enum":["2d","3d"]},"scope":{"type":"string","enum":["floor","building"]},"planLayout":{"type":"string","enum":["all-levels","level"]},"structure":{"type":"string","minLength":1,"maxLength":40},"camera":{"type":"object","properties":{"position":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"}],"items":false,"minItems":3,"maxItems":3},"target":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"}],"items":false,"minItems":3,"maxItems":3}},"required":["position","target"],"additionalProperties":false}},"required":["floor","dimension","scope"],"additionalProperties":false}},"required":["name"],"additionalProperties":false},"deleteViewpoint":{"description":"Remove a named view (its id or name).","type":"string","minLength":1,"maxLength":60},"playing":{"type":"boolean"},"playbackTarget":{"description":"process: the latest current run_process_scenario result; robot: the cleaning/transport result. Omit to keep the current playback target. Switching targets pauses at time 0 unless specified.","type":"string","enum":["robot","process"]},"timeSeconds":{"type":"number","minimum":0,"maximum":604800},"playbackSpeed":{"anyOf":[{"type":"number","const":1},{"type":"number","const":10},{"type":"number","const":20},{"type":"number","const":60}]},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"undo_space_edit","kind":"act","impl":"imperative","description":"Restore the previous room and simulation settings using the same Undo as the visible editor. The local session keeps up to 50 changes. Also restores comparison inputs that the reverted edit cleared. Does not run a simulation. requestId restores only that request when it is the next unchanged history entry; another edit is refused, never skipped.","title":"Undo the last space change","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"requestId":{"description":"Undo/Redo only this request if it is the next unchanged history entry. Never undo another edit to reach it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$"},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_view_image","kind":"answer","impl":"imperative","description":"Look at the space to check what was built. Left empty it draws exactly the user’s current view: 2D or 3D, the same floor area, level or whole building, style and theme, and in 3D their own camera. Choose another with dimension, scope, planLayout, floor, structure, mode, theme and, in 3D, camera: a named view (top, north … north-west, default), or azimuth (compass bearing, clockwise from north: the plan’s top) and elevation, a focus part or point, a distance. viewpoint draws a view the user or an agent saved by name (get_space.view.viewpoints); the result’s viewpoint is this picture’s view, to keep it by name with set_space_view.saveViewpoint. time draws a moment of the latest process run in 3D, as its playback shows it (agents and their loads, equipment and store states, lift cars; heatmap shades where agents stood), to check a run by eye; the user’s current view shows it when they are playing that run back. labels tags zone names (one floor area) or floor area names (a building). 2D is the scaled drawing the Export menu saves: outline and dimensions, zone names with their areas, an area table, scale bar, optional north arrow and a title block with the date and the space hash; format=svg returns its SVG text to keep, in svg. A picture comes back as image content, PNG unless jpeg or webp is asked, within the 1 MB agent-link limit: a larger PNG is sent as JPEG and then made smaller, and image.adjustments says so. The result says what was drawn and from where, and spaceHash names the model version shown (as get_space.building.spaceHash). Drawn off screen from a snapshot: the editor’s view, selection and Undo history do not change. Read-only; free; no AI call.","title":"See the space as a picture","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"viewpoint":{"description":"Draw a named view (its id or name from get_space.view.viewpoints) as it was saved: its floor area, 2D or 3D, scope, layout, building shown and camera. It sets those itself: leave out dimension, scope, planLayout, floor, structure and camera. Style, theme, size and format still apply.","type":"string","minLength":1,"maxLength":60},"dimension":{"description":"2d: a scaled plan drawing; 3d: a picture of the model. Every field left out keeps the user’s current view.","type":"string","enum":["2d","3d"]},"scope":{"description":"floor: one floor area; building: the whole building in 3D, or a level / every level in 2D (planLayout). floor when `floor` is given, building when `structure` is.","type":"string","enum":["floor","building"]},"planLayout":{"description":"2D with scope=building: every level on one sheet, or the level of `floor` with its floor areas side by side.","type":"string","enum":["all-levels","level"]},"floor":{"description":"Floor area to draw (scope=floor), or whose level to draw (level layout); the active one when left out. The editor does not switch.","type":"string","minLength":1,"maxLength":40},"structure":{"description":"Only this building of the site (get_space.building.structures), for scope=building.","type":"string","minLength":1,"maxLength":40},"mode":{"description":"3D rendering style; 2D drawings always use filled plans.","type":"string","enum":["hologram","blueprint","solid"]},"spread":{"description":"3D whole building: metres added between one level and the next, so each storey's plan, its voids and what stands where show one above another (an exploded view); connections stretch to match. 0 (default) draws the floors where they are. Not with time.","type":"number","minimum":0,"maximum":60},"theme":{"description":"Colour palette ID from get_space capabilities.themes.","type":"string","enum":["default","paper","ivory","cloud","mint","rose","lavender","peach","linen","sandstone","steel","warehouse","garden","poolside","gallery","draft-light","draft-blue","night","graphite","forest","amber","violet","contrast","print"]},"showOverhead":{"description":"3D: false leaves out roofs and what hangs overhead (raised 1.8 m or more, or tagged roof or ceiling) to see inside; the current view decides when left out.","type":"boolean"},"camera":{"description":"3D only. Left out: the user’s camera when drawing their current view, else the default view fitted to what is drawn.","type":"object","properties":{"view":{"description":"current: the user’s own camera (when drawing what they see); default: Studio’s usual corner view; top: straight down, north up; north … north-west: from that side, 35° above.","type":"string","enum":["current","default","top","north","north-east","east","south-east","south","south-west","west","north-west"]},"azimuth":{"description":"Compass bearing the camera looks from, degrees clockwise from north (the plan’s top, −z): 0 north, 90 east (+x), 180 south, 270 west.","type":"number","minimum":-360,"maximum":360},"elevation":{"description":"Degrees above the horizon; 90 looks straight down.","type":"number","minimum":5,"maximum":90},"focus":{"description":"Look at one part, framed with some room around it, or at a point {x, z} of the drawn floor area (its metres).","anyOf":[{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60}},"required":["object"],"additionalProperties":false},{"type":"object","properties":{"x":{"type":"number"},"z":{"type":"number"}},"required":["x","z"],"additionalProperties":false}]},"distance":{"description":"Metres from the focus; fitted to what is drawn when left out.","type":"number","minimum":1,"maximum":5000}},"additionalProperties":false},"time":{"description":"3D: draw the latest process run (run_process_scenario) at this moment, in seconds from its start, as its playback shows it: agents and what they carry, equipment and store states, lift cars. \"current\" is the playback time on screen. Left out, a picture of the user’s current view shows that run when they are playing it back; any other picture shows the layout alone. The run must be of the current layout.","anyOf":[{"type":"number","minimum":0,"maximum":604800},{"type":"string","const":"current"}]},"heatmap":{"description":"With time: shade the floors drawn by how many agents stood there over the run (mean or peak), as playback’s heatmap does.","type":"string","enum":["mean","peak"]},"caption":{"default":true,"description":"The title band along the bottom (project, what the picture shows, space version). false: the picture takes the whole width x height with no text of ours on it, for a slide, a page or a video frame of your own. The description that comes back still says what was drawn.","type":"boolean"},"stateTags":{"default":true,"description":"3D with time: tag equipment with its state in words (\"Working 1/2 · 3 waiting\"). false leaves the words out; each part keeps its state colour and a dot.","type":"boolean"},"labels":{"default":true,"description":"3D: tag zone names (one floor area) or floor area names (building). 2D drawings always name zones.","type":"boolean"},"format":{"default":"png","description":"png, jpeg or webp comes back as an image; svg (2D only) as the drawing’s SVG text to save. Over the 1 MB link limit a PNG is sent as JPEG, then made smaller, and the result says so.","type":"string","enum":["png","jpeg","webp","svg"]},"width":{"description":"Pixels; 1600 for 2D, 1280 for 3D when left out.","type":"integer","minimum":256,"maximum":2048},"height":{"description":"Pixels; 800 for 3D, the sheet’s proportions for 2D when left out.","type":"integer","minimum":256,"maximum":2048},"quality":{"default":0.85,"description":"JPEG and WebP quality.","type":"number","minimum":0.4,"maximum":0.95},"paper":{"default":"A3","description":"2D: sheet size; the scale is the largest standard one that fits.","type":"string","enum":["A4","A3","A2","A1"]},"north":{"description":"2D: draw a north arrow pointing this many degrees clockwise from the top of the sheet. The model stores no true north: leave it out for none.","type":"number","minimum":-360,"maximum":360},"dimensions":{"description":"2D floor area or level sheets: also dimension inside the plan, the clear width of aisles between parts (up to 3 m, narrowest first) and each rectangular zone’s sides, where the figures fit. The result lists the aisles in drawing.aisles.","type":"boolean"},"underlay":{"description":"2D: draw the floor areas’ visible underlay pictures under the model, to compare them (on by default for png, jpeg and webp; off for svg, where the picture would be embedded). 3D pictures never show them.","type":"boolean"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"compare_areas","kind":"act","impl":"imperative","description":"The change list and quantity difference between two floor areas (the alternatives of a proposal: present, plan A, plan B) or a floor area and a frozen option (save_process_option), from the drawn model alone. Lists the parts added, removed and moved (grouped, with the distance and direction in metres), and the parts resized, turned, renamed, retagged or recoloured; then the difference in floor area, seats (chairs and stools), other seating, fixtures (furniture and equipment), wall length, each kind of part and each zone tag. Parts are paired by ID, then by a name only one part of the kind carries on each side, then by the nearest of the same kind within maxMove; matching says how many were paired by each rule and lists the pairings by position that were ambiguous (another part nearly as near) with their candidates. Read-only; free; simulates nothing.","title":"Compare two floor areas: what changed","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"from":{"anyOf":[{"type":"string","minLength":1,"maxLength":40},{"type":"object","properties":{"option":{"type":"string","minLength":1,"maxLength":60},"floor":{"type":"string","minLength":1,"maxLength":40}},"required":["option"],"additionalProperties":false}],"description":"The base: a floor area ID (get_space.building.floors), or {option, floor?}: a floor area of a frozen option (list_process_options; its active floor area when floor is left out)."},"to":{"anyOf":[{"type":"string","minLength":1,"maxLength":40},{"type":"object","properties":{"option":{"type":"string","minLength":1,"maxLength":60},"floor":{"type":"string","minLength":1,"maxLength":40}},"required":["option"],"additionalProperties":false}],"description":"The proposal to compare with the base; same forms."},"maxMove":{"default":3,"description":"Farthest, in metres, a part may have moved to be paired with its old self by position (parts sharing an ID or a unique name are paired whatever the distance).","type":"number","minimum":0.05,"maximum":50},"limit":{"default":30,"description":"Changed parts and IDs listed per group; counts stay whole.","type":"integer","minimum":1,"maximum":200}},"required":["from","to"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_view_set","kind":"answer","impl":"imperative","description":"Pictures of several floor areas (the alternatives) in the same views, framed the same way so plan A and plan B sit side by side: an overview, the scaled 2D plan, and, where some floor area has the parts, the entrance (a door tagged or named entrance), reception (a part tagged or named reception), the seating (chairs and so on, from the stage side when there is one) and the stage. Every camera is in floor metres and shared by all the alternatives; list=true says which views the set holds and how they are framed without drawing. Pictures come as image content, view by view (each view for all the alternatives), at most 10 or 1 MB a call: next is where the following call starts (cursor). Default JPEG 1000 × 640; mode, theme, format, quality, size and paper are as get_view_image’s. Nothing on screen changes. Read-only; free; no AI call.","title":"Draw the same views of every alternative","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"floors":{"description":"The alternatives, as floor area IDs, the base first (present, then plan A, plan B). Left out: the floor areas of the active level.","minItems":1,"maxItems":8,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"views":{"description":"Which views: overview, plan (the scaled 2D drawing), entrance, reception, seating, stage. Left out: all of them that the floor areas have the parts for.","minItems":1,"maxItems":6,"type":"array","items":{"type":"string","enum":["overview","plan","entrance","reception","seating","stage"]}},"list":{"description":"Only say which views and pictures the set would hold and how they are framed; draw nothing.","type":"boolean"},"cursor":{"default":0,"description":"Where to start: 0, then each call’s next. A call draws pictures until the link’s 1 MB limit (or 10 pictures), so a big set takes several.","type":"integer","minimum":0,"maximum":1000},"mode":{"type":"string","enum":["hologram","blueprint","solid"]},"theme":{"type":"string","maxLength":40},"format":{"default":"jpeg","type":"string","enum":["jpeg","png","webp"]},"quality":{"default":0.8,"type":"number","minimum":0.4,"maximum":0.95},"width":{"default":1000,"type":"integer","minimum":256,"maximum":2048},"height":{"default":640,"type":"integer","minimum":256,"maximum":2048},"paper":{"default":"A3","type":"string","enum":["A4","A3","A2","A1"]},"caption":{"default":true,"type":"boolean"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_proposal_packet","kind":"answer","impl":"imperative","description":"One self-contained HTML page for a client, from the drawn model of the alternatives (floors, the base first): a cover, the same views of every alternative side by side, the scaled 2D drawing of each, a table of quantities with the difference from the base, what changed (as compare_areas), what the figures rest on (the source and note of each part, the assumptions), the geometry check (check_space, unless includeCheck is false) and any saved computed comparisons (compare_process_options; Pro). It prints to PDF from the browser (A4); its pictures use the light paper theme and solid style unless theme or mode says otherwise. It states no cost, revenue, sales or visitor forecast and leaves out any section with nothing behind it. Over the 1 MB link limit it comes in pieces: content holds one piece with nextOffset; call again with offset=nextOffset until it is null, join the pieces in order and check the SHA-256. Save the joined text as a .html file (with three alternatives it is about 0.8 MB, pictures included: smaller width, height and quality shrink it, and pictures=false leaves them out for a text-only packet of some 10 KB; the user can also save the same page from Studio’s Export menu, Proposal packet). Read-only; free; no AI call.","title":"Make one page to hand over: pictures, quantities, changes","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"floors":{"description":"The alternatives, as floor area IDs, the base first (present, then plan A, plan B). Left out: the floor areas of the active level.","minItems":1,"maxItems":8,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"views":{"description":"Which views: overview, plan (the scaled 2D drawing), entrance, reception, seating, stage. Left out: all of them that the floor areas have the parts for.","minItems":1,"maxItems":6,"type":"array","items":{"type":"string","enum":["overview","plan","entrance","reception","seating","stage"]}},"title":{"type":"string","minLength":1,"maxLength":120},"preparedFor":{"description":"One line under the title: who it is for or by.","type":"string","minLength":1,"maxLength":120},"language":{"default":"en","type":"string","enum":["en","ja"]},"pictures":{"default":true,"description":"false leaves out every picture and drawing: only the tables and text (some 10 KB for three alternatives, small enough to read in a conversation). With them a packet of three alternatives is about 0.8 MB.","type":"boolean"},"includeCheck":{"default":true,"description":"Run check_space on every alternative and add its summary. false leaves the section out.","type":"boolean"},"includeComparisons":{"default":true,"description":"Add the saved computed comparisons (compare_process_options; they exist only where a Pro run was saved). None saved: none added.","type":"boolean"},"maxMove":{"default":3,"type":"number","minimum":0.05,"maximum":50},"width":{"default":880,"type":"integer","minimum":480,"maximum":1600},"height":{"default":560,"type":"integer","minimum":300,"maximum":1000},"quality":{"default":0.72,"type":"number","minimum":0.4,"maximum":0.95},"theme":{"type":"string","maxLength":40},"mode":{"type":"string","enum":["hologram","blueprint","solid"]},"offset":{"description":"Read in pieces from this UTF-16 offset: 0, then each nextOffset. A packet over the 1 MB link limit comes in pieces (the same way as get_process_comparison).","type":"integer","minimum":0,"maximum":100000000},"maxCharacters":{"type":"integer","minimum":1,"maximum":1000000}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"set_underlay","kind":"act","impl":"imperative","description":"Put a picture of the existing site (a floor plan, a scan, a photo) under a floor area to build over, and place it: image sends the file (base64; over 200,000 characters in pieces with uploadId); rectify straightens a photo taken at an angle from four points and their floor points (the picture is drawn again from straight above and replaces it, placed; later points name its pixels); placement sets numbers (top-left corner in floor metres, width in metres, rotation); level straightens a skewed scan (a line of the picture, or \"auto\"); scale sets metres from a known length between two pixels (a dimension line, a scale bar); align puts one or two pixels on floor points (two set scale, turn and place at once). Applied in that order; opacity and visible for the display; remove takes it away. A new picture on a floor area that has one starts afresh (its placement belongs to the old picture); the same picture sent again keeps it. Pixels are the picture’s own (as given, even when the stored copy is made smaller). The picture is saved with the project (files and cloud carry it; the browser keeps it apart), never in the building: calculations, checks and building.spaceHash ignore it, and it is not an edit (no revision, no Undo step). Returns where it lies (corners, metres per pixel, calibrated). Free; no AI call.","title":"Lay a plan picture under a floor area","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"floor":{"description":"Floor area (get_space.building.floors); the active one when left out.","type":"string","minLength":1,"maxLength":40},"image":{"description":"A new picture (PNG, JPEG or WebP, at most 12 MB) for the floor area, replacing its old one but keeping the placement. Over 200000 base64 characters, send it in pieces: the first with offset 0, totalCharacters and sha256, the rest with uploadId and offset; the call with the last piece sets the picture, and may carry the other fields. Pictures over 4096 px or 2 MB are stored smaller; points are still given in the picture's own pixels.","type":"object","properties":{"data":{"type":"string","minLength":1,"maxLength":200000,"pattern":"^[A-Za-z0-9+/]*={0,2}$","description":"Base64 of the picture file (no data: prefix), or of one piece of it: at most 200000 characters a call."},"mimeType":{"type":"string","enum":["image/png","image/jpeg","image/webp"]},"name":{"description":"Its file name.","type":"string","maxLength":180},"totalCharacters":{"description":"For a picture sent in pieces: the whole base64 length, with the first piece (offset 0).","type":"integer","minimum":1,"maximum":16777216},"offset":{"description":"For a piece: where it starts in the whole base64 text.","type":"integer","minimum":0,"maximum":9007199254740991},"uploadId":{"description":"For every piece after the first: the uploadId it returned.","type":"string","maxLength":80},"sha256":{"description":"SHA-256 (hex) of the picture file’s bytes; checked when the last piece arrives.","type":"string","pattern":"^[a-f0-9]{64}$"}},"required":["data"],"additionalProperties":false},"placement":{"description":"Numbers as they are: the unrotated picture’s top-left corner (floor metres), width in metres and turn, as a part is placed.","type":"object","properties":{"x":{"type":"number","minimum":-10000,"maximum":10000},"z":{"type":"number","minimum":-10000,"maximum":10000},"width":{"description":"Metres across the whole picture.","type":"number","minimum":0.01,"maximum":20000},"rotation":{"description":"Degrees counter-clockwise on the plan, about its centre.","type":"number","minimum":-360,"maximum":360}},"additionalProperties":false},"level":{"description":"Straighten a skewed scan: turn the picture so the line from one pixel to another runs along x (horizontal) or z (vertical), 'from' staying put; or 'auto', measured from the drawing's own lines (trace_underlay reports the same skewDegrees).","anyOf":[{"type":"string","const":"auto"},{"type":"object","properties":{"from":{"type":"object","properties":{"x":{"type":"number","minimum":-200000,"maximum":200000},"y":{"type":"number","minimum":-200000,"maximum":200000}},"required":["x","y"],"additionalProperties":false,"description":"A point of the picture in its own pixels, as given: (0, 0) is its top-left corner, x to the right, y down."},"to":{"type":"object","properties":{"x":{"type":"number","minimum":-200000,"maximum":200000},"y":{"type":"number","minimum":-200000,"maximum":200000}},"required":["x","y"],"additionalProperties":false,"description":"A point of the picture in its own pixels, as given: (0, 0) is its top-left corner, x to the right, y down."},"axis":{"default":"nearest","type":"string","enum":["horizontal","vertical","nearest"]}},"required":["from","to"],"additionalProperties":false}]},"scale":{"description":"Set the scale from a known length: two pixels (the ends of a dimension line, a scale bar) and the metres between them; \"from\" stays where it is on the floor.","type":"object","properties":{"from":{"type":"object","properties":{"x":{"type":"number","minimum":-200000,"maximum":200000},"y":{"type":"number","minimum":-200000,"maximum":200000}},"required":["x","y"],"additionalProperties":false,"description":"A point of the picture in its own pixels, as given: (0, 0) is its top-left corner, x to the right, y down."},"to":{"type":"object","properties":{"x":{"type":"number","minimum":-200000,"maximum":200000},"y":{"type":"number","minimum":-200000,"maximum":200000}},"required":["x","y"],"additionalProperties":false,"description":"A point of the picture in its own pixels, as given: (0, 0) is its top-left corner, x to the right, y down."},"metres":{"type":"number","exclusiveMinimum":0,"maximum":20000,"description":"The real distance between them."}},"required":["from","to","metres"],"additionalProperties":false},"align":{"description":"Put pixels on floor points: one point moves the picture; two set its scale and turn as well (no stretching). The quickest way to place a plan whose corner points you know.","type":"object","properties":{"points":{"minItems":1,"maxItems":2,"type":"array","items":{"type":"object","properties":{"pixel":{"type":"object","properties":{"x":{"type":"number","minimum":-200000,"maximum":200000},"y":{"type":"number","minimum":-200000,"maximum":200000}},"required":["x","y"],"additionalProperties":false,"description":"A point of the picture in its own pixels, as given: (0, 0) is its top-left corner, x to the right, y down."},"floor":{"type":"object","properties":{"x":{"type":"number","minimum":-10000,"maximum":10000},"z":{"type":"number","minimum":-10000,"maximum":10000}},"required":["x","z"],"additionalProperties":false,"description":"Floor metres of the floor area (x right, z down the plan)."}},"required":["pixel","floor"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false},"rectify":{"description":"Straighten a photo taken at an angle (a printed plan on a table, a map on a wall), which a scale and a turn cannot put right: the picture is drawn again as seen from straight above, from four of its points and their floor points, and replaces it, placed and scaled (scale \"corners\"). Points in later calls name the new picture’s pixels. Not with level, scale or align in the same call.","type":"object","properties":{"points":{"minItems":4,"maxItems":4,"type":"array","items":{"type":"object","properties":{"pixel":{"type":"object","properties":{"x":{"type":"number","minimum":-200000,"maximum":200000},"y":{"type":"number","minimum":-200000,"maximum":200000}},"required":["x","y"],"additionalProperties":false,"description":"A point of the picture in its own pixels, as given: (0, 0) is its top-left corner, x to the right, y down."},"floor":{"type":"object","properties":{"x":{"type":"number","minimum":-10000,"maximum":10000},"z":{"type":"number","minimum":-10000,"maximum":10000}},"required":["x","z"],"additionalProperties":false,"description":"Floor metres of the floor area (x right, z down the plan)."}},"required":["pixel","floor"],"additionalProperties":false},"description":"Four points of the picture and where they lie on the floor, in the same order round both: the corners of the outer walls or of a room, as far apart as the plan allows."},"marginMetres":{"description":"Floor metres kept round the points (dimension lines, a scale bar); 15% of their span, at least 1 m, when left out.","type":"number","minimum":0,"maximum":1000}},"required":["points"],"additionalProperties":false},"opacity":{"type":"number","minimum":0.05,"maximum":1},"visible":{"type":"boolean"},"remove":{"description":"Take the floor area’s underlay away (alone in the call).","type":"boolean"},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"trace_underlay","kind":"act","impl":"imperative","description":"Read the floor area’s underlay picture with image processing (no AI) and return what is drawn, as candidates to build from, each in floor metres (from the underlay’s placement) and in the picture’s pixels (px): walls (thick lines, or thin filled bars in coloured plans) as centre lines with thickness and a ready box; openings (gaps in a wall line: doors, passages) with width and the walls on each side; rectangles at any angle (parts, zones) with a ready box, fill colour, stroke and the texts inside (stroke dashed with note sides-from-ink: a zone drawn with dashes on open floor, closed by a wall or a counter along a side; note solid-ink: a small part drawn filled with ink, such as a column; with in-wall, one drawn on a wall’s line, wider than the wall); regions (rooms closed by walls with the openings shut, and zones split off by dashed lines) as polygons with area, ready for edit_space add polygon (at most 32 corners: a longer outline comes simplified, noted with the tolerance); long lines (dimension lines with ticks, dashed zone edges); and texts: where words are written, not what they say (read them from the picture yourself). Each has a heuristic confidence (0–1, not a probability) and notes where something may be hidden: label-over-edge or label-over-gap (a label covers part of it), opaque-fill-may-hide-parts (smaller parts drawn under a fill do not show), touches-picture-edge, isolated (a wall no other wall meets, such as a scale bar), faint. skewDegrees is the drawing’s turn in the picture: set_underlay level \"auto\" straightens it. Decide yourself what each candidate is (a counter, a shelf, a zone) by looking at the picture, then build with edit_space (walls with walls, openings with openings at their point, parts with add and the box) and check with measure_underlay_fit. Scale first (set_underlay scale or align) so metres are real. Read-only; free; no AI call.","title":"Trace draft candidates from the underlay","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"floor":{"description":"Floor area (get_space.building.floors); the active one when left out.","type":"string","minLength":1,"maxLength":40},"include":{"description":"The kinds of candidates to return; all when left out.","minItems":1,"maxItems":6,"type":"array","items":{"type":"string","enum":["walls","openings","rectangles","regions","lines","texts"]}},"region":{"description":"Only this box of the picture, in its own pixels (a large picture is traced at full size this way).","type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}},"required":["x","y","width","height"],"additionalProperties":false},"minConfidence":{"default":0.3,"type":"number","minimum":0,"maximum":1},"limit":{"default":400,"description":"Most candidates of each kind (the most confident, larger first).","type":"integer","minimum":1,"maximum":1000}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"measure_underlay_fit","kind":"act","impl":"imperative","description":"For each part of the floor area (or only ids / kinds), read the underlay picture across every edge of its footprint at points along it and find the drawn edge nearest to the model’s (a line’s middle, a wall’s face, the edge of a fill; along a dashed line, the points in its gaps that reach a line further off are left out): offsetMetres per edge (outward positive), and for a box the move and resize that would put it on the drawing; wall ends are not measured (they meet other walls). summary gives the median, 95th percentile, mean and largest distance over all measured points and the share within 1, 2, 5 and 10 cm; parts lists the furthest off first; unmatched parts found no drawn edge within searchMetres (not drawn, hidden under a fill, or further off). A drawing drawn with thick outlines reads a little off at the faces; set the underlay’s scale first. Read-only; free; no AI call.","title":"Measure how far the model is from the underlay","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"floor":{"description":"Floor area (get_space.building.floors); the active one when left out.","type":"string","minLength":1,"maxLength":40},"ids":{"description":"Only these parts.","maxItems":500,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"kinds":{"description":"Only parts of these kinds (wall, zone, shelf …).","maxItems":40,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"searchMetres":{"default":0.25,"description":"How far either side of an edge to look for the drawn one.","type":"number","minimum":0.03,"maximum":1},"spacingMetres":{"default":0.1,"description":"Metres between the points read along an edge.","type":"number","minimum":0.02,"maximum":1},"limit":{"default":40,"description":"Parts listed, the furthest off first (the summary counts all).","type":"integer","minimum":0,"maximum":500}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"read_underlay_with_ai","kind":"answer","impl":"imperative","description":"Send the floor area’s underlay picture to Laydyne’s built-in image reading (spatial-1, the Build from an image pipeline) and return its reading: the room it saw with estimated or dimensioned size, and parts with names, kinds and boxes (visible or inferred). Its metres are its own reading from the room’s top-left corner, not the underlay placement: use it for what things are, and trace_underlay for where. Nothing is built or changed. Needs a Laydyne subscription; counts against the AI allowance and budget, and says what it cost.","title":"Read the underlay with the built-in AI (Pro)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"floor":{"description":"Floor area (get_space.building.floors); the active one when left out.","type":"string","minLength":1,"maxLength":40},"instruction":{"default":"","description":"What to look for, in the user’s words (optional).","type":"string","maxLength":1500}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"select_objects","kind":"act","impl":"imperative","description":"Replace the visible selection with object IDs from the active floor. Pass an empty ids array to clear it. Requires the latest geometry revision; get_space.selectedIds reports the current selection. Does not change geometry or run a simulation.","title":"Select objects in the editor","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"ids":{"maxItems":1000,"type":"array","items":{"type":"string","minLength":1,"maxLength":60}},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","ids"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"redo_space_edit","kind":"act","impl":"imperative","description":"Reapply the last undone edit using the same Redo history as the visible editor. Requires the latest revision and canRedo=true. Does not run a simulation. requestId reapplies only that request when it is the next unchanged future entry; another edit is refused.","title":"Redo the last undone space change","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"requestId":{"description":"Undo/Redo only this request if it is the next unchanged history entry. Never undo another edit to reach it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$"},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"compare_cleaning_deployment","kind":"act","impl":"imperative","description":"Compare 1–8 cleaning robots against a coverage goal in the current site. Provide complete cost assumptions, omit economics to use the current draft, or pass null to clear them. Updates and opens the visible comparison; uses the local calculation engine, not an AI API.","title":"Compare cleaning robot deployment","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"targetCoverage":{"type":"number","minimum":1,"maximum":100},"economics":{"anyOf":[{"type":"object","properties":{"currency":{"type":"string","enum":["USD","JPY","EUR","GBP"]},"years":{"type":"integer","minimum":1,"maximum":10},"workdaysPerYear":{"type":"integer","minimum":1,"maximum":366},"loadedHourlyCost":{"type":"number","exclusiveMinimum":0,"maximum":10000},"currentPaidHoursPerDay":{"type":"number","minimum":0,"maximum":1000},"taskHoursReassignedPerDay":{"type":"number","minimum":0,"maximum":1000},"paidHoursRemovedPerDay":{"type":"number","minimum":0,"maximum":1000},"additionalPaidHoursPerDay":{"type":"number","minimum":0,"maximum":1000},"robotPriceEach":{"type":"number","minimum":0,"maximum":100000000},"setupCost":{"type":"number","minimum":0,"maximum":100000000},"annualRobotCostEach":{"type":"number","minimum":0,"maximum":100000000},"sourceNote":{"type":"string","minLength":1,"maxLength":500}},"required":["currency","years","workdaysPerYear","loadedHourlyCost","currentPaidHoursPerDay","taskHoursReassignedPerDay","paidHoursRemovedPerDay","additionalPaidHoursPerDay","robotPriceEach","setupCost","annualRobotCostEach","sourceNote"],"additionalProperties":false},{"type":"null"}]},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["targetCoverage"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_simulation_catalog","kind":"answer","impl":"imperative","description":"Start a simulation study by checking which phenomena Laydyne can calculate, what data they need, how 3D geometry affects them, and their limits. Lists available operational capabilities and specialist capabilities that require another solver. Includes a recipe for carriers, handling and return trips. An object appearance never grants a calculation capability. Free, read-only, no AI call or simulation.","title":"Read supported calculations and their required inputs","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"check_simulation_readiness","kind":"answer","impl":"imperative","description":"Check required capability IDs from get_simulation_catalog before recommending a model. Optionally inspect a saved scenario for unmodeled carriers, direct-distance moves, return policy and display-only cargo. Does not establish field accuracy or feasibility and does not run a simulation. Unsupported requirements must be addressed by a suitable solver, not replaced with an animation. Free and read-only.","title":"Check calculation requirements and a saved scenario","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"requirements":{"maxItems":15,"type":"array","items":{"type":"string","enum":["spatial_routes","mobile_resources","handling_times","return_trips","resource_queues","shifts_and_arrivals","buffers_and_batches","vertical_transport","collision_avoidance","vehicle_turning","payload_clearance","crop_growth","thermal_energy","sunlight","robot_manipulation"]}},"scenarioId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["requirements"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_process_catalog","kind":"answer","impl":"imperative","description":"Read the declarative process model, full input schema, limits, metrics and the list of editable sample scenarios. With section: \"overview\", read a compact index, then request one complete named section (such as scenarioSchema, primitives, arrivals, resources or metrics) or sample by id. Omitted section and sample returns the complete legacy catalog. Compose arrival streams (fixed, poisson with an hourly rate profile, or at scheduled times), agent classes and pools, shared resources, zones, waits (for resources, or until a time or the next scheduled time), routes through the building (goto), lift cars people call and wait for, stores of parts or kanban cards that jobs take and put (with a reorder that starts a refill), batches that gather jobs into one lot, calls and weighted branches between processes (a call may repeat, as a re-inspection after rework), values computed from parameters, random values with a seed and repeated runs, a warm-up before statistics start, and completion. With sample: an id from samples, it gives that sample in full instead (its scenario, guide, parameters and expected result). This is a read-only catalog; it does not execute a simulation and requires no subscription.","title":"Read simulation primitives and samples","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"section":{"description":"Read a compact overview or one complete named section without the unrelated catalog. Do not combine with sample.","type":"string","enum":["overview","scenarioSchema","primitives","values","expressions","repeat","distributions","arrivals","schedules","observation","randomness","anchors","agents","resources","parallelLinks","oneWayPassages","lifts","line","metrics","lifecycle","behaviour","parameters","samples","limits","assumptions","workflow"]},"sample":{"description":"A sample id from the catalog: gives that sample in full (its scenario to copy and edit, guide, parameters and expected result) instead of the catalog.","type":"string","minLength":1,"maxLength":80}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"list_process_scenarios","kind":"answer","impl":"imperative","description":"Read complete saved simulation definitions by default. id or ids selects saved IDs (unknown IDs fail); selection keeps saved order and the workspace activeId. detail=summary returns only names, parameters, observation window and definition counts (steps counts the saved top-level process steps, not executions), not complete definitions: read detail=full for editing or execution inputs. Saving or reading definitions is free. Running a simulation requires Pro; Free accounts prepare scenarios and read saved results.","title":"Read saved process scenarios","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"ids":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"detail":{"type":"string","enum":["full","summary"]}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_process_drawing","kind":"answer","impl":"imperative","description":"Free. Export a single-floor route drawing from the current saved process result, using only actual first-seed traces. No simulation or AI call runs. Old-engine, incomplete or layout/scenario-mismatched results are refused. Trace and point truncation is explicitly identified. format=html gives a self-contained drawing; json gives SVG and metadata. floor defaults to the active floor; traceIds selects recorded trace IDs. Large text uses nextOffset and UTF-8 SHA-256; repeat unchanged settings and join chunks in order. Imported results are user data, not authenticated measurements.","title":"Read an HTML plan of the recorded process routes","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"format":{"default":"html","type":"string","enum":["html","json"]},"floor":{"type":"string","minLength":1,"maxLength":120},"traceIds":{"minItems":1,"maxItems":40,"type":"array","items":{"type":"string","minLength":1,"maxLength":240}},"locale":{"default":"en","type":"string","enum":["en","ja"]},"title":{"type":"string","minLength":1,"maxLength":180},"offset":{"type":"integer","minimum":0,"maximum":100000000},"maxCharacters":{"type":"integer","minimum":1,"maximum":1000000}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_process_series","kind":"answer","impl":"imperative","description":"Read what the last process run recorded over its observation, without running anything: with no keys, the charts it can give (resources in use and waiting, zone occupancy, jobs waiting at connections and lifts, store levels, jobs in the system) with each one's peak and when; with keys, their values in equal slices of the observation (the most in each slice; a store's level: the least), and with several runs the least, mean and most over the runs in each slice. Free: it reads an existing recorded result without consuming a simulation run. A result for another layout or definition is refused as stale; run again first.","title":"Read how the last run went over time","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"keys":{"description":"Charts to read, as listed without keys (resource.waiting:<id>, zone.occupancy:<id>, run.wip, …).","maxItems":12,"type":"array","items":{"type":"string","minLength":1,"maxLength":120}},"slices":{"default":60,"description":"Equal slices of the observation (6 to 120).","type":"integer","minimum":6,"maximum":120}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_process_state","kind":"answer","impl":"imperative","description":"Read what the last process run recorded at timeSeconds (or find when an equipment state or a store level held, and read the first such moment), without running anything: each equipment binding's state (down: under repair after a failure; setup: changing over to another product family; working; blocked: held while its job waits for something else, such as room in a full buffer; reserved; in_use; or idle), slots in use and jobs waiting; each store's level and cumulative successful puts/takes operation counts from t=0 (not units or initial stock; includes warm-up), with null counts and countersRecorded=false when older data or a record cut leaves them unknown (line production); each lift's cars (the floor each is at or leaving and moving towards, idle, stopped or moving, which way, people in it) and how many wait for a car on each floor; the resources, pools, zones, connections and lifts jobs wait for then (the longest waits first); and, for jobId (or the longest-waiting job), why it waits: what it waits for, what was in use when it began, who holds it and what they are doing, followed through holders who wait themselves, with circular waits named. Native lifecycle instances also return state/owner and recorded coverage; cap or missing records yield null rather than guessed states. Free: it reads an existing recorded result without consuming a simulation run. A result for another layout or definition is refused as stale; run again first.","title":"Read equipment states and wait causes at a time","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"timeSeconds":{"description":"The time to read. May be left out with find: then the start of the first stretch found.","type":"number","minimum":0,"maximum":604800},"find":{"description":"When something held over the run: an equipment binding in a state ({\"equipment\": \"eq-st1\", \"state\": \"blocked\"}), or a store empty, low (at or below its reorder point) or full ({\"store\": \"screws\", \"level\": \"empty\"}). found lists the first 20 stretches, how many there were and their total seconds, so a playback or a later call can go straight to one.","anyOf":[{"type":"object","properties":{"equipment":{"type":"string","minLength":1,"maxLength":120},"state":{"type":"string","enum":["working","blocked","reserved","in_use","idle","down","setup"]}},"required":["equipment","state"],"additionalProperties":false},{"type":"object","properties":{"store":{"type":"string","minLength":1,"maxLength":120},"level":{"type":"string","enum":["empty","low","full"]}},"required":["store","level"],"additionalProperties":false}]},"jobId":{"type":"string","minLength":1,"maxLength":120},"limit":{"type":"integer","minimum":1,"maximum":20}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"edit_equipment","kind":"act","impl":"imperative","description":"Change a part and the scenarios bound to it in one step (one revision, one undo). bind: make part {floor, object} equipment of scenarioId, on resourceId or on a new resource with role equipment and capacity slots. duplicate: copy the bound part (dx/dz metres, or beside it), its own resource and the processes listed on the binding, with their activities, and bind the copy; shared staff and arrivals are not duplicated, so the copy adds nothing until a reached process uses it (findings say so). remove: drop the binding; withBehaviour also drops its resource and listed processes when nothing else refers to them. rebind: move the binding (and the resource place and gotos of its processes) to another part. capacity: set the slots, on the resource (or its parameter). Returns the findings that stop or weaken each scenario (a missing part, unused equipment, unreached processes). Free: editing definitions does not run anything.","title":"Bind, duplicate or remove equipment with its behaviour","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":120},"scenarioId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"action":{"type":"string","enum":["bind","duplicate","remove","rebind","capacity"]},"bindingId":{"type":"string","minLength":1,"maxLength":64},"part":{"type":"object","properties":{"floor":{"type":"string","minLength":1,"maxLength":40},"object":{"type":"string","minLength":1,"maxLength":60}},"required":["floor","object"],"additionalProperties":false},"resourceId":{"type":"string","minLength":1,"maxLength":64},"capacity":{"type":"integer","minimum":1,"maximum":10000},"processIds":{"maxItems":64,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"withBehaviour":{"type":"boolean"},"dx":{"type":"number","minimum":-500,"maximum":500},"dz":{"type":"number","minimum":-500,"maximum":500},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","scenarioId","action"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"put_process_scenario","kind":"act","impl":"imperative","description":"Create or replace a complete declarative scenario by ID and make it active. Compose the primitives and parameters described by get_process_catalog. repeat writes what each building, floor or till has once and saves a copy per binding (the catalog's repeat). result=brief returns only the saved scenario’s summary (not its complete definition) and the activeId; omitted or result=full returns the whole workspace as before. This free operation validates and saves the definition without running it. Uses the same revision and atomic mutation lock as geometry edits.","title":"Save a process simulation definition","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"scenario":{"type":"object","properties":{"version":{"default":2,"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4},{"type":"number","const":5},{"type":"number","const":6},{"type":"number","const":7},{"type":"number","const":8},{"type":"number","const":9},{"type":"number","const":10}]},"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"name":{"type":"string","minLength":1,"maxLength":120},"horizonSeconds":{"type":"number","exclusiveMinimum":0,"maximum":604800},"warmupSeconds":{"description":"Seconds before statistics start (less than horizonSeconds): means, maxima, utilisation, rates and distances cover [warmupSeconds, horizonSeconds]; result.observation gives the window, throughput and work in progress.","type":"number","minimum":0,"maximum":604800},"parameters":{"default":{},"type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"additionalProperties":{"type":"number","minimum":-1000000000,"maximum":1000000000}},"resources":{"default":[],"maxItems":128,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"name":{"type":"string","minLength":1,"maxLength":120},"capacity":{"anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}],"description":"Units: a whole number from 1 to 10000, or {\"parameter\": name} or {\"expr\": ...} whose value is one."},"at":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"pick":{"type":"string","enum":["nearest","random","least_occupied","free"]},"recall":{"description":"The place this job remembered under the name (goto only): a goto or an arrival with remember stored it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"spot":{"description":"Stand at one of the spots inside a zone part (0.8 m apart) instead of its centre: random, or free (one nobody else is at or on the way to).","type":"string","enum":["random","free"]},"within":{"description":"With a tag, in a goto: only its parts on the floor area the job is on (floor), on its level of the same building (level: the hall of the storey it is on), or in its building (structure; the ground when it is in none).","type":"string","enum":["floor","level","structure"]},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]},"open":{"description":"Only the first n parts with the tag (building order: floor, then part id) are candidates: the open tills.","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false}]}},"additionalProperties":false},"mode":{"type":"string","enum":["occupy","transit"]},"role":{"description":"equipment (machine/station slots), zone (an area held by position) or shared (staff pool, no place); older reading when left out.","type":"string","enum":["equipment","zone","shared"]},"queue":{"description":"Where those waiting for it line up in playback: floor-local points (x, z metres) from where the one served stands back along the line, spacing in metres (0.8 by default). Display only: waiting times and order do not change.","type":"object","properties":{"floor":{"type":"string","minLength":1,"maxLength":40},"points":{"minItems":2,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}},"spacing":{"type":"number","minimum":0.3,"maximum":5}},"required":["floor","points"],"additionalProperties":false},"queues":{"description":"More waiting lines at its other entrances (a restroom with two doors, a counter served from both ends), with queue: each one waiting stands on the line nearest to where it is when it starts to wait. Display only.","minItems":1,"maxItems":7,"type":"array","items":{"type":"object","properties":{"floor":{"type":"string","minLength":1,"maxLength":40},"points":{"minItems":2,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}},"spacing":{"type":"number","minimum":0.3,"maximum":5}},"required":["floor","points"],"additionalProperties":false}},"shifts":{"description":"Version 6: the capacity from each time on (a shift, a break, a lunch cover, a room closed at night), times increasing; capacity applies before the first. Units in use when it drops are kept until released (those inside a zone stay until they leave); new requests wait.","minItems":1,"maxItems":96,"type":"array","items":{"type":"object","properties":{"from":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}],"description":"Seconds from the start of the run."},"capacity":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}],"description":"Units from then on: 0 closes it (a break)."}},"required":["from","capacity"],"additionalProperties":false}},"failures":{"description":"Version 6: the resource breaks down now and then (a machine, a lift truck). While it is down it takes no one; a job holding it in a delay step stops working and goes on for the time it had left once it is repaired. Draws come from a stream of the resource's own. Not a zone.","type":"object","properties":{"betweenSeconds":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}],"description":"Seconds from the start, or from a repair, to the next failure: {\"random\": \"exponential\", \"mean\": 7200} for failures two hours apart on average."},"repairSeconds":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}],"description":"Seconds each repair takes."}},"required":["betweenSeconds","repairSeconds"],"additionalProperties":false},"setupSeconds":{"description":"Version 6: a changeover. A job whose acquire brings another family than the last job's holds the resource this many seconds more before its next step (drawn from a stream of the resource's own); the first job, and one of the same family, none.","anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]},"lifecycle":{"type":"object","properties":{"states":{"minItems":1,"maxItems":8,"type":"array","items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"initial":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"transitions":{"minItems":1,"maxItems":16,"type":"array","items":{"type":"array","prefixItems":[{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}],"items":false,"minItems":2,"maxItems":2}}},"required":["states","initial","transitions"],"additionalProperties":false},"perPart":{"description":"Version 6, with at by tag: one resource of this capacity (and shifts) at each part with the tag, named <id>@<part id>: twenty machines, forty desks. An acquire of it takes the one at the part the job is at, or with at {\"recall\": name} at a place the job remembered; release gives back the one it holds. Results list each part's resource. Not a zone, a branch option or a state condition.","type":"boolean"}},"required":["id","capacity"],"additionalProperties":false}},"processes":{"minItems":1,"maxItems":256,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"name":{"type":"string","minLength":1,"maxLength":120},"agent":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"steps":{"minItems":1,"maxItems":128,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"delay"},"id":{"description":"Stable step name, unique within its process; activities refer to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"durationSeconds":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]}},"required":["type","durationSeconds"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"waitUntil"},"id":{"description":"Stable step name, unique within its process; activities refer to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"time":{"description":"Seconds from the start of the run; give time or schedule.","anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"schedule":{"description":"A schedule id: wait for its next time at or after now; give time or schedule.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"acquire"},"id":{"description":"Stable step name, unique within its process; activities refer to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"resourceId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"state":{"type":"object","properties":{"from":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"to":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["from","to"],"additionalProperties":false},"select":{"type":"string","const":"matching_state"},"remember":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"units":{"default":1,"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]},"at":{"description":"A resource per part (perPart): take the one at a place the job remembered (goto or arrival remember), instead of the one at the part it is at.","type":"object","properties":{"recall":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["recall"],"additionalProperties":false},"family":{"description":"On a resource with setupSeconds (version 6): the product family the job brings. Another family than the last job's takes a changeover first.","type":"string","minLength":1,"maxLength":40},"priority":{"description":"Higher is served first among those waiting (0 when left out); equal priorities first come, first served.","anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]},"patience":{"description":"Seconds the job waits at most: then it leaves the line and goes on in otherwise (reneging).","anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]},"balk":{"description":"With this many or more already waiting, the job does not join the line and goes on in otherwise at once (balking).","anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"otherwise":{"description":"The process a job that gives up (patience) or does not join (balk) goes on in; as a branch, it does not come back.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["type","resourceId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"release"},"id":{"description":"Stable step name, unique within its process; activities refer to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"resourceId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"units":{"default":1,"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]},"nextState":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"returnHome":{"type":"boolean"}},"required":["type","resourceId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"state"},"id":{"description":"Stable step name, unique within its process; activities refer to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"resourceId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"from":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"to":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["type","resourceId","from","to"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"move"},"id":{"description":"Stable step name, unique within its process; activities refer to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"from":{"type":"object","properties":{"x":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"y":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"z":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["x","z"],"additionalProperties":false},"to":{"type":"object","properties":{"x":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"y":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"z":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["x","z"],"additionalProperties":false},"speedMetersPerSecond":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["type","from","to","speedMetersPerSecond"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"goto"},"id":{"description":"Stable step name, unique within its process; activities refer to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"to":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"pick":{"type":"string","enum":["nearest","random","least_occupied","free"]},"recall":{"description":"The place this job remembered under the name (goto only): a goto or an arrival with remember stored it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"spot":{"description":"Stand at one of the spots inside a zone part (0.8 m apart) instead of its centre: random, or free (one nobody else is at or on the way to).","type":"string","enum":["random","free"]},"within":{"description":"With a tag, in a goto: only its parts on the floor area the job is on (floor), on its level of the same building (level: the hall of the storey it is on), or in its building (structure; the ground when it is in none).","type":"string","enum":["floor","level","structure"]},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]},"open":{"description":"Only the first n parts with the tag (building order: floor, then part id) are candidates: the open tills.","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false}]}},"additionalProperties":false},"speed":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]},"remember":{"description":"Remember the place this goto chose under the name; a later goto to {\"recall\": name} goes back to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["type","to"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"call"},"id":{"description":"Stable step name, unique within its process; activities refer to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"processId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"count":{"default":1,"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]},"repeat":{"type":"object","properties":{"probability":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}],"description":"Chance (0 to 1) of one more run after each run: drawn from the job's stream each time."},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}],"description":"At most this many more runs."}},"required":["probability","max"],"additionalProperties":false}},"required":["type","processId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"take"},"id":{"description":"Stable step name, unique within its process; activities refer to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"store":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"units":{"default":1,"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]}},"required":["type","store"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"put"},"id":{"description":"Stable step name, unique within its process; activities refer to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"store":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"units":{"default":1,"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]}},"required":["type","store"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"batch"},"id":{"description":"Stable step name, unique within its process; activities refer to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"size":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"processId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"at":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"pick":{"type":"string","enum":["nearest","random","least_occupied","free"]},"recall":{"description":"The place this job remembered under the name (goto only): a goto or an arrival with remember stored it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"spot":{"description":"Stand at one of the spots inside a zone part (0.8 m apart) instead of its centre: random, or free (one nobody else is at or on the way to).","type":"string","enum":["random","free"]},"within":{"description":"With a tag, in a goto: only its parts on the floor area the job is on (floor), on its level of the same building (level: the hall of the storey it is on), or in its building (structure; the ground when it is in none).","type":"string","enum":["floor","level","structure"]},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]},"open":{"description":"Only the first n parts with the tag (building order: floor, then part id) are candidates: the open tills.","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false}]}},"additionalProperties":false}},"required":["type","size","processId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"branch"},"id":{"description":"Stable step name, unique within its process; activities refer to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"by":{"description":"weight (default): random by weight (no option with a weight: equally likely). free: an option whose resource is free (counting jobs on their way to it), else the one with the fewest ahead; ties in turn. state (version 6): the first option whose when holds, the last (without when) otherwise.","type":"string","enum":["weight","free","state"]},"prefer":{"description":"by \"free\": among equally free options, the one whose resource place (at) is the nearest by route.","type":"string","enum":["nearest"]},"reselect":{"description":"by free, plain FIFO resources only: while actually queued, switch at most once per branch traversal after same-time FIFO service, only to a reachable open option with a strictly lower behind rank. No change while moving or holding the resource; not continuous optimization or a waiting-time prediction.","type":"string","const":"once_while_waiting"},"open":{"description":"by \"free\": only the first n options are open (a whole number or a parameter).","anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"options":{"minItems":2,"maxItems":32,"type":"array","items":{"type":"object","properties":{"weight":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]},"processId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"resourceId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"when":{"anyOf":[{"type":"object","properties":{"queue":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"atMost":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"atLeast":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["queue"],"additionalProperties":false},{"type":"object","properties":{"free":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"atMost":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"atLeast":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["free"],"additionalProperties":false},{"type":"object","properties":{"level":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"atMost":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"atLeast":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["level"],"additionalProperties":false},{"type":"object","properties":{"time":{"type":"object","properties":{"from":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"to":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"additionalProperties":false}},"required":["time"],"additionalProperties":false}]}},"required":["processId"],"additionalProperties":false}}},"required":["type","options"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"finish"},"id":{"description":"Stable step name, unique within its process; activities refer to it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["type"],"additionalProperties":false}]}}},"required":["id","steps"],"additionalProperties":false}},"arrivals":{"maxItems":256,"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"processId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"startSeconds":{"default":0,"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"at":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"pick":{"type":"string","enum":["nearest","random","least_occupied","free"]},"recall":{"description":"The place this job remembered under the name (goto only): a goto or an arrival with remember stored it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"spot":{"description":"Stand at one of the spots inside a zone part (0.8 m apart) instead of its centre: random, or free (one nobody else is at or on the way to).","type":"string","enum":["random","free"]},"within":{"description":"With a tag, in a goto: only its parts on the floor area the job is on (floor), on its level of the same building (level: the hall of the storey it is on), or in its building (structure; the ground when it is in none).","type":"string","enum":["floor","level","structure"]},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]},"open":{"description":"Only the first n parts with the tag (building order: floor, then part id) are candidates: the open tills.","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false}]}},"additionalProperties":false},"remember":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"mode":{"type":"string","const":"count"},"count":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"intervalSeconds":{"default":0,"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["id","processId","mode","count"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"processId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"startSeconds":{"default":0,"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"at":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"pick":{"type":"string","enum":["nearest","random","least_occupied","free"]},"recall":{"description":"The place this job remembered under the name (goto only): a goto or an arrival with remember stored it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"spot":{"description":"Stand at one of the spots inside a zone part (0.8 m apart) instead of its centre: random, or free (one nobody else is at or on the way to).","type":"string","enum":["random","free"]},"within":{"description":"With a tag, in a goto: only its parts on the floor area the job is on (floor), on its level of the same building (level: the hall of the storey it is on), or in its building (structure; the ground when it is in none).","type":"string","enum":["floor","level","structure"]},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]},"open":{"description":"Only the first n parts with the tag (building order: floor, then part id) are candidates: the open tills.","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false}]}},"additionalProperties":false},"remember":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"mode":{"type":"string","const":"interval"},"durationSeconds":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"intervalSeconds":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["id","processId","mode","durationSeconds","intervalSeconds"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"processId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"startSeconds":{"default":0,"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"at":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"pick":{"type":"string","enum":["nearest","random","least_occupied","free"]},"recall":{"description":"The place this job remembered under the name (goto only): a goto or an arrival with remember stored it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"spot":{"description":"Stand at one of the spots inside a zone part (0.8 m apart) instead of its centre: random, or free (one nobody else is at or on the way to).","type":"string","enum":["random","free"]},"within":{"description":"With a tag, in a goto: only its parts on the floor area the job is on (floor), on its level of the same building (level: the hall of the storey it is on), or in its building (structure; the ground when it is in none).","type":"string","enum":["floor","level","structure"]},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]},"open":{"description":"Only the first n parts with the tag (building order: floor, then part id) are candidates: the open tills.","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false}]}},"additionalProperties":false},"remember":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"mode":{"type":"string","const":"poisson"},"ratePerHour":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]},"durationSeconds":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]},"profile":{"description":"Instead of ratePerHour and durationSeconds: consecutive segments from startSeconds, each {durationSeconds, ratePerHour} (0 for none).","minItems":1,"maxItems":96,"type":"array","items":{"type":"object","properties":{"durationSeconds":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]},"ratePerHour":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"uniform-int"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"triangular"},"min":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"mode":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"max":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","min","mode","max"],"additionalProperties":false},{"type":"object","properties":{"random":{"type":"string","const":"exponential"},"mean":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["random","mean"],"additionalProperties":false}]}},"required":["durationSeconds","ratePerHour"],"additionalProperties":false}}},"required":["id","processId","mode"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"processId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"startSeconds":{"default":0,"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"at":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"pick":{"type":"string","enum":["nearest","random","least_occupied","free"]},"recall":{"description":"The place this job remembered under the name (goto only): a goto or an arrival with remember stored it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"spot":{"description":"Stand at one of the spots inside a zone part (0.8 m apart) instead of its centre: random, or free (one nobody else is at or on the way to).","type":"string","enum":["random","free"]},"within":{"description":"With a tag, in a goto: only its parts on the floor area the job is on (floor), on its level of the same building (level: the hall of the storey it is on), or in its building (structure; the ground when it is in none).","type":"string","enum":["floor","level","structure"]},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]},"open":{"description":"Only the first n parts with the tag (building order: floor, then part id) are candidates: the open tills.","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false}]}},"additionalProperties":false},"remember":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"mode":{"type":"string","const":"schedule"},"schedule":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"count":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"intervalSeconds":{"default":0,"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}},"required":["id","processId","mode","schedule","count"],"additionalProperties":false}]}},"schedules":{"maxItems":32,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"label":{"type":"string","minLength":1,"maxLength":120},"times":{"minItems":1,"maxItems":1000,"type":"array","items":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]}}},"required":["id","times"],"additionalProperties":false}},"agents":{"maxItems":16,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"oneWayPassages":{"minItems":1,"maxItems":64,"type":"array","items":{"type":"object","properties":{"floor":{"type":"string","minLength":1,"maxLength":64},"object":{"type":"string","minLength":1,"maxLength":64},"direction":{"type":"string","enum":["forward","backward"]}},"required":["floor","object","direction"],"additionalProperties":false},"description":"Building-graph goto/pool crossings of named wall openings (not straight-distance move or simulate_space): [{floor, object, direction: \"forward\" | \"backward\"}]. Forward follows the opening passageHeading; backward opposes it. Exact IDs, at most 64, no duplicates. Real endpoints on a governed opening plane are invalid; physical clearance still applies."},"label":{"type":"string","minLength":1,"maxLength":60},"appearance":{"type":"string","enum":["person","amr","forklift","cleaner","truck","car","item"]},"radius":{"type":"number","minimum":0.1,"maximum":1.5},"speed":{"type":"number","minimum":0.05,"maximum":5},"height":{"type":"number","minimum":0.1,"maximum":4.5},"links":{"maxItems":4,"type":"array","items":{"type":"string","enum":["passage","stairs","elevator","escalator"]}},"avoid":{"description":"Parts this class does not go on or through, though others may: [{\"tag\": \"staff-only\"}] keeps customers out of the counter, [{\"kind\": \"sidewalk\"}] cars off the pavement. By tag, kind or {\"object\", \"floor\"?}. A place on one moves to the nearest point outside it (within 3 m).","maxItems":16,"type":"array","items":{"anyOf":[{"type":"object","properties":{"tag":{"type":"string","minLength":1,"maxLength":40}},"required":["tag"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","enum":["wall","column","zone","desk","table","chair","sofa","cabinet","shelf","display","counter","rack","pallet","machine","booth","stage","bed","plant","block","partition","door","window","stairs","elevator","escalator","round_table","bookshelf","locker","whiteboard","wardrobe","kitchen","fridge","rug","checkout","fridge_case","clothes_rack","kiosk","conveyor","workbench","roll_cage","container","tank","forklift","charger","dock_door","seating_row","podium","screen","barrier","building","parking","road","sidewalk","lawn","tree","car","truck","fence","gate","bench","pole","person","toilet","washbasin","urinal","atm","pos_terminal","coffee_machine","oven","dishwasher","microwave","stool","parasol","showcase","menu_board","planter","sign","shopping_cart","cart_corral","bicycle","dock_shelter","dock_leveler","wheel_stop","fire_extinguisher","robot_arm","mobile_robot","pod","sorter","spiral_conveyor","chute","carton_erector","aircraft","jet_bridge","baggage_carousel","security_scanner","metal_detector","self_checkout","platform_trolley","crate_stack","toilet_cubicle","gable_roof","barrel_roof","solid"]}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"floor":{"type":"string","minLength":1,"maxLength":40}},"required":["object"],"additionalProperties":false}]}},"passThrough":{"description":"Blocking parts this class goes through, though others cannot: [{\"kind\": \"wheel_stop\"}, {\"tag\": \"bollard\"}] let people past what stops cars. By tag, kind or {\"object\", \"floor\"?}.","maxItems":16,"type":"array","items":{"anyOf":[{"type":"object","properties":{"tag":{"type":"string","minLength":1,"maxLength":40}},"required":["tag"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","enum":["wall","column","zone","desk","table","chair","sofa","cabinet","shelf","display","counter","rack","pallet","machine","booth","stage","bed","plant","block","partition","door","window","stairs","elevator","escalator","round_table","bookshelf","locker","whiteboard","wardrobe","kitchen","fridge","rug","checkout","fridge_case","clothes_rack","kiosk","conveyor","workbench","roll_cage","container","tank","forklift","charger","dock_door","seating_row","podium","screen","barrier","building","parking","road","sidewalk","lawn","tree","car","truck","fence","gate","bench","pole","person","toilet","washbasin","urinal","atm","pos_terminal","coffee_machine","oven","dishwasher","microwave","stool","parasol","showcase","menu_board","planter","sign","shopping_cart","cart_corral","bicycle","dock_shelter","dock_leveler","wheel_stop","fire_extinguisher","robot_arm","mobile_robot","pod","sorter","spiral_conveyor","chute","carton_erector","aircraft","jet_bridge","baggage_carousel","security_scanner","metal_detector","self_checkout","platform_trolley","crate_stack","toilet_cubicle","gable_roof","barrel_roof","solid"]}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"floor":{"type":"string","minLength":1,"maxLength":40}},"required":["object"],"additionalProperties":false}]}},"avoidLinks":{"description":"Connections (by id) this class may not use though its kind allows it: a staff-only door, a goods lift.","maxItems":64,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"linkFactors":{"description":"How many times longer this class counts a kind of connection when choosing a route (1 to 20): {\"stairs\": 4} makes people take the escalator unless the stairs save a lot. Only the choice changes: the route is walked at its real length and speed.","type":"object","propertyNames":{"type":"string","enum":["passage","stairs","elevator","escalator"]},"additionalProperties":{"type":"number","minimum":1,"maximum":20}},"areaFactors":{"description":"Ground this class keeps off where it can, counted this many times longer when choosing a route (1 to 20): [{\"parts\": {\"tag\": \"lawn\"}, \"factor\": 3}] walks round a lawn unless the way across saves two thirds of the walk; parking bays, a planted bed. The parts stay passable; the route is walked at its real length and speed.","maxItems":12,"type":"array","items":{"type":"object","properties":{"parts":{"anyOf":[{"type":"object","properties":{"tag":{"type":"string","minLength":1,"maxLength":40}},"required":["tag"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","enum":["wall","column","zone","desk","table","chair","sofa","cabinet","shelf","display","counter","rack","pallet","machine","booth","stage","bed","plant","block","partition","door","window","stairs","elevator","escalator","round_table","bookshelf","locker","whiteboard","wardrobe","kitchen","fridge","rug","checkout","fridge_case","clothes_rack","kiosk","conveyor","workbench","roll_cage","container","tank","forklift","charger","dock_door","seating_row","podium","screen","barrier","building","parking","road","sidewalk","lawn","tree","car","truck","fence","gate","bench","pole","person","toilet","washbasin","urinal","atm","pos_terminal","coffee_machine","oven","dishwasher","microwave","stool","parasol","showcase","menu_board","planter","sign","shopping_cart","cart_corral","bicycle","dock_shelter","dock_leveler","wheel_stop","fire_extinguisher","robot_arm","mobile_robot","pod","sorter","spiral_conveyor","chute","carton_erector","aircraft","jet_bridge","baggage_carousel","security_scanner","metal_detector","self_checkout","platform_trolley","crate_stack","toilet_cubicle","gable_roof","barrel_roof","solid"]}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"floor":{"type":"string","minLength":1,"maxLength":40}},"required":["object"],"additionalProperties":false}]},"factor":{"type":"number","minimum":1,"maximum":20}},"required":["parts","factor"],"additionalProperties":false}},"count":{"anyOf":[{"type":"integer","minimum":1,"maximum":64},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"home":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"pick":{"type":"string","enum":["nearest","random","least_occupied","free"]},"recall":{"description":"The place this job remembered under the name (goto only): a goto or an arrival with remember stored it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"spot":{"description":"Stand at one of the spots inside a zone part (0.8 m apart) instead of its centre: random, or free (one nobody else is at or on the way to).","type":"string","enum":["random","free"]},"within":{"description":"With a tag, in a goto: only its parts on the floor area the job is on (floor), on its level of the same building (level: the hall of the storey it is on), or in its building (structure; the ground when it is in none).","type":"string","enum":["floor","level","structure"]},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]},"open":{"description":"Only the first n parts with the tag (building order: floor, then part id) are candidates: the open tills.","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false}]}},"additionalProperties":false},"homePerUnit":{"description":"With a home by tag: each unit its own part of the tag (its charger, its parking bay) in plan order, starting again from the first when there are more units than parts. Units return there with returnHome.","type":"boolean"},"dispatch":{"type":"string","enum":["first_free","nearest"]},"parking":{"type":"object","properties":{"floor":{"type":"string","minLength":1,"maxLength":40},"points":{"minItems":2,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}},"spacing":{"type":"number","minimum":0.3,"maximum":5}},"required":["floor","points"],"additionalProperties":false},"shifts":{"description":"A pool: units in service from each time on (a shift, a break, fewer vehicles at night), times increasing; count applies before the first and the pool has as many units as the most of them. Free units go off first; a busy unit finishes its job (and its way home with returnHome) before it goes off; units come back in unit order.","minItems":1,"maxItems":96,"type":"array","items":{"type":"object","properties":{"from":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}],"description":"Seconds from the start of the run."},"count":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}],"description":"Units in service from then on: 0 takes them all off (a break)."}},"required":["from","count"],"additionalProperties":false}}},"required":["id","radius","speed"],"additionalProperties":false}},"parallelLinks":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"links":{"minItems":2,"maxItems":32,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}}},"required":["links"],"additionalProperties":false},"description":"Scenario version 9: explicit groups of 2–32 ordinary connection IDs sharing the same two floors and exactly the same local endpoints. At the common entrance, choose once by live jobs ahead, then original crossing seconds, then stable connection ID. No queue reselection, predicted delay or global ETA. Lift cars and overlapping groups are refused."},"equipment":{"maxItems":128,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"label":{"type":"string","minLength":1,"maxLength":120},"part":{"type":"object","properties":{"floor":{"type":"string","minLength":1,"maxLength":40},"object":{"type":"string","minLength":1,"maxLength":60}},"required":["floor","object"],"additionalProperties":false},"resourceId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"processIds":{"maxItems":64,"type":"array","items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}}},"required":["id","part","resourceId"],"additionalProperties":false}},"activities":{"maxItems":512,"type":"array","items":{"type":"object","properties":{"processId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"stepId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"kind":{"type":"string","enum":["work","load","unload","wait","convey"]},"equipmentId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"cargo":{"type":"string","enum":["box","tote","pallet","bag","pod","roll_cage","trolley","luggage"]},"path":{"description":"A convey activity: {floor, points: [{x, z}, …]} the product travels along during the delay, first point to last, drawn as an item when nothing carries it (a conveyor, a chute). Display only.","type":"object","properties":{"floor":{"type":"string","minLength":1,"maxLength":40},"points":{"minItems":2,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}}},"required":["floor","points"],"additionalProperties":false},"label":{"type":"string","minLength":1,"maxLength":120}},"required":["processId","stepId","kind"],"additionalProperties":false}},"lifts":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"link":{"type":"string","minLength":1,"maxLength":40,"description":"Any elevator connection of the shaft: its cars serve every elevator connection stacked with it."},"cars":{"description":"Cars serving the shaft (1–8).","anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"capacity":{"description":"People one car holds; unlimited when neither this nor the connections say.","anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"doorSeconds":{"description":"The doors opening plus closing at a stop, seconds.","anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"dwellSeconds":{"description":"The doors held open at a stop, seconds.","anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"queues":{"description":"Where those waiting for a car stand in playback, one line per floor of the shaft (its first point by the lift doors). Display only.","maxItems":120,"type":"array","items":{"type":"object","properties":{"floor":{"type":"string","minLength":1,"maxLength":40},"points":{"minItems":2,"maxItems":32,"type":"array","items":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false}},"spacing":{"type":"number","minimum":0.3,"maximum":5}},"required":["floor","points"],"additionalProperties":false}}},"required":["link"],"additionalProperties":false}},"stores":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"name":{"type":"string","minLength":1,"maxLength":120},"initial":{"default":0,"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"capacity":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"at":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"pick":{"type":"string","enum":["nearest","random","least_occupied","free"]},"recall":{"description":"The place this job remembered under the name (goto only): a goto or an arrival with remember stored it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"spot":{"description":"Stand at one of the spots inside a zone part (0.8 m apart) instead of its centre: random, or free (one nobody else is at or on the way to).","type":"string","enum":["random","free"]},"within":{"description":"With a tag, in a goto: only its parts on the floor area the job is on (floor), on its level of the same building (level: the hall of the storey it is on), or in its building (structure; the ground when it is in none).","type":"string","enum":["floor","level","structure"]},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]},"open":{"description":"Only the first n parts with the tag (building order: floor, then part id) are candidates: the open tills.","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false}]}},"additionalProperties":false},"reorder":{"type":"object","properties":{"point":{"anyOf":[{"type":"number","minimum":-1000000000,"maximum":1000000000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false},{"type":"object","properties":{"expr":{"type":"string","minLength":1,"maxLength":200,"description":"Arithmetic over parameters: + - * /, parentheses, min(a, b, …), max(…), round(x), floor(x), ceil(x); names are parameter ids made of letters, digits and _."}},"required":["expr"],"additionalProperties":false}]},"processId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"at":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"pick":{"type":"string","enum":["nearest","random","least_occupied","free"]},"recall":{"description":"The place this job remembered under the name (goto only): a goto or an arrival with remember stored it.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"spot":{"description":"Stand at one of the spots inside a zone part (0.8 m apart) instead of its centre: random, or free (one nobody else is at or on the way to).","type":"string","enum":["random","free"]},"within":{"description":"With a tag, in a goto: only its parts on the floor area the job is on (floor), on its level of the same building (level: the hall of the storey it is on), or in its building (structure; the ground when it is in none).","type":"string","enum":["floor","level","structure"]},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]},"open":{"description":"Only the first n parts with the tag (building order: floor, then part id) are candidates: the open tills.","anyOf":[{"type":"integer","minimum":1,"maximum":10000},{"type":"object","properties":{"parameter":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"}},"required":["parameter"],"additionalProperties":false}]}},"additionalProperties":false}},"required":["point","processId"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}},"maxEvents":{"default":100000,"type":"integer","minimum":1,"maximum":250000},"traceLimit":{"default":500,"type":"integer","minimum":0,"maximum":10000},"seed":{"type":"integer","minimum":0,"maximum":2147483647},"runs":{"type":"integer","minimum":1,"maximum":50}},"required":["id","name","horizonSeconds","processes","arrivals"],"additionalProperties":false},"result":{"type":"string","enum":["full","brief"]},"repeat":{"description":"Items written once and copied for each binding of their variables, then saved as the copies after the scenario's own (a repeat's binding by binding): {\"forEach\": {\"b\": [\"A\", \"B\", \"C\", \"D\"]}, \"processes\": [{\"id\": \"parcel-{b}\", \"steps\": [{\"type\": \"goto\", \"to\": {\"tag\": \"lobby\", \"structure\": \"{b}\"}}, …]}], \"resources\": [{\"id\": \"boxes-{b}\", \"capacity\": 2}]}. {name} in any string value becomes the value (\"{level}\" alone becomes a number when the value is one); keys stay. Lists: resources, processes, arrivals, equipment, activities, lifts, stores. The scenario may leave processes empty when a repeat gives them. list_process_scenarios shows the copies; resend the repeat to change them all.","maxItems":16,"type":"array","items":{"type":"object","properties":{"forEach":{"anyOf":[{"type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,31}$"},"additionalProperties":{"minItems":1,"maxItems":256,"type":"array","items":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9_.-]{1,64}$"},{"type":"number","minimum":-1000000000,"maximum":1000000000}]}}},{"minItems":1,"maxItems":256,"type":"array","items":{"type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,31}$"},"additionalProperties":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9_.-]{1,64}$"},{"type":"number","minimum":-1000000000,"maximum":1000000000}]}}}],"description":"The bindings: {\"b\": [\"A\", \"B\"], \"level\": [3, 4]} takes every combination (A3, A4, B3, B4); a list of objects ([{\"b\": \"A\", \"level\": 3}, {\"b\": \"B\", \"level\": 5}]) takes exactly those."},"resources":{"description":"Items as in scenario.resources, with {name} where a binding's value goes.","maxItems":64,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"processes":{"description":"Items as in scenario.processes, with {name} where a binding's value goes.","maxItems":64,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"arrivals":{"description":"Items as in scenario.arrivals, with {name} where a binding's value goes.","maxItems":64,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"equipment":{"description":"Items as in scenario.equipment, with {name} where a binding's value goes.","maxItems":64,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"activities":{"description":"Items as in scenario.activities, with {name} where a binding's value goes.","maxItems":64,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"lifts":{"description":"Items as in scenario.lifts, with {name} where a binding's value goes.","maxItems":64,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"stores":{"description":"Items as in scenario.stores, with {name} where a binding's value goes.","maxItems":64,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}},"required":["forEach"],"additionalProperties":false}},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","scenario"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"update_process_parameters","kind":"act","impl":"imperative","description":"Merge a nonempty map of existing parameter keys into one saved scenario, or copy its complete definition to an unused copyAs.id/name and merge there. Every other process, arrival, resource, schedule, physical definition and condition is retained; other scenarios and frozen options/studies stay unchanged. Makes the saved scenario active. Validates values, expressions, places and workspace limits before one atomic save through the same host, revision, mutation lock, operationId and Undo path as put_process_scenario. A changed definition invalidates the latest live run; archived results are retained, not reevaluated. Returns only the saved scenario summary, activeId, actual old/new parameter changes, optional copy source and warnings. Free; does not run a simulation. An unchanged already-active definition needs no new Undo entry.","title":"Update saved process parameters","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"parameters":{"type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"additionalProperties":{"type":"number","minimum":-1000000000,"maximum":1000000000}},"copyAs":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"name":{"type":"string","minLength":1,"maxLength":120}},"required":["id","name"],"additionalProperties":false},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","id","parameters"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"delete_process_scenario","kind":"transact","impl":"imperative","description":"Remove a scenario definition by ID. Read list_process_scenarios first for IDs and the latest revision. Does not modify the spatial model or execute a simulation.","title":"Delete a saved process scenario","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"run_process_scenario","kind":"act","impl":"imperative","description":"Execute a saved declarative scenario locally using the deterministic simulation engine. Running a simulation requires Pro; Free accounts prepare scenarios and read saved results. Returns measured metrics, resource utilization, assumptions and truncation or deadlock warnings, and the jobs that stopped blocked. Resource wait mean/max are result.measures entries with id resource.wait.mean/resource.wait.max and ref the resource ID (seconds; mean may be null when no requests); not fields on result.resources[]; with runs above 1, spread (also on each measure) gives the min, mean, max of each measure, population stdev and n (runs with a value); with warmupSeconds, result.observation gives the statistics window, throughput and work in progress. detail=full adds the per-job timelines, bounded movement traces, series and replicates (every measure per run). On a site with buildings, byStructure sums each building up: its connections (crossings, the mean wait per crossing, the longest wait and queue, the slowest three), its entrances and its zones. parameters gives some of the scenario's own parameters other values for this run only, without saving or resending the definition ({\"staff\": 3}); result.overrides lists them. result.spaceHash is the layout it was computed for: once get_space.building.spaceHash differs, the result is stale. No application AI API call.","title":"Run a saved process scenario","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"parameters":{"description":"Values for some of the scenario's own parameters, for this run only (the saved definition does not change): {\"boxPct\": 40}. The result lists them as overrides.","type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"additionalProperties":{"type":"number","minimum":-1000000000,"maximum":1000000000}},"traceWindow":{"description":"Record first-run movement only on this floor in this time window; aggregate metrics and simulation work stay unchanged. Outside this scope movement is not recorded. Focused heatmaps are unavailable. Agent/point caps make the entire window partial.","type":"object","properties":{"floorId":{"type":"string","minLength":1,"maxLength":160},"fromSeconds":{"type":"number","minimum":0},"toSeconds":{"type":"number","minimum":0}},"required":["floorId","fromSeconds","toSeconds"],"additionalProperties":false},"detail":{"default":"summary","description":"summary (the default): measures, metrics, resources, connections, agents, warnings and the jobs that stopped blocked, without the per-job timelines, movement traces, series and per-run replicates; full adds those (up to about 1 MB).","type":"string","enum":["summary","full"]},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"compare_process_scenarios","kind":"act","impl":"imperative","description":"Run a baseline and a candidate on the same building in one bounded calculation. Requires a simulation subscription. The observation window (horizonSeconds and warmupSeconds), arrival definitions, starting seed and run count must match. baselineParameters and candidateParameters give either side other parameter values without saving or resending a definition; leave out candidateId to compare one scenario with itself under other values ({\"baselineId\": \"store\", \"candidateParameters\": {\"staff\": 3}}). When an arrival parameter differs, the comparison runs and says so in comparison.differentArrivals: the candidate faces other demand, so its differences are not the effect of the option alone. Returns compact first-run statuses, warnings, assumptions, and candidate-minus-baseline measures. With repeated runs, differences are paired by seed; a bound or missing value has no numeric delta. Does not change the spatial model. The candidate becomes the active scenario and its trace is shown in Studio when it is the saved definition. The complete frozen inputs and result are saved in the project; use list_process_options and get_process_comparison to reopen or export them.","title":"Compare two saved process scenarios","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"baselineId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"candidateId":{"description":"The saved scenario to compare; baselineId when left out.","type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"baselineParameters":{"description":"Values for some of the baseline's parameters, not saved.","type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"additionalProperties":{"type":"number","minimum":-1000000000,"maximum":1000000000}},"candidateParameters":{"description":"Values for some of the candidate's parameters, not saved.","type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"additionalProperties":{"type":"number","minimum":-1000000000,"maximum":1000000000}},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","baselineId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"sweep_process_parameters","kind":"act","impl":"imperative","description":"Run a saved scenario at every combination of values of one or two of its parameters (openDocks 6, 8 and 10; staff by arrival rate), each point on the same seeds, without saving or resending the definition. Returns, per point, each measure's mean over the runs with its 95 % confidence interval (Student's t), and its difference from the baseline point paired run by run, with that interval and withinNoise (the interval takes in 0: these runs cannot tell the two apart). A value that is a bound (an elevator without cars) gives no difference. Requires a simulation subscription. Points left when its 20 s budget runs out are named in notRun: sweep them next. The shown result and comparison do not change; Studio shows the sweep in the simulation panel.","title":"Sweep parameter values with confidence intervals","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"parameters":{"type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"additionalProperties":{"minItems":1,"maxItems":25,"type":"array","items":{"type":"number","minimum":-1000000000,"maximum":1000000000}},"description":"One or two of the scenario's own parameters, each with the values to try ({\"openDocks\": [6, 8, 10]}); every combination is a point, at most 25 with the baseline, and points × runs at most 500."},"baseline":{"description":"The point differences are taken from (values of the swept parameters); the scenario's own values when left out. It is run too when not among the points.","type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"additionalProperties":{"type":"number","minimum":-1000000000,"maximum":1000000000}},"runs":{"description":"Runs per point, on seeds seed, seed + 1, … at every point (the scenario's runs when left out). Intervals need 2 or more; 5 to 20 is usual.","type":"integer","minimum":1,"maximum":50},"measures":{"description":"Measures to report by key (an id such as run.wait.mean, or id:ref such as resource.wait.mean:docks; an id alone takes all its refs). Left out: the run measures and those of the resources and pools the swept parameters set.","minItems":1,"maxItems":40,"type":"array","items":{"type":"string","minLength":1,"maxLength":120}},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","id","parameters"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"list_process_options","kind":"answer","impl":"imperative","description":"Read immutable layout-and-scenario options and saved comparison IDs, fingerprints and current-candidate freshness. Each option owns a full copy of its building and definition, independent of live edits or Undo. Includes archived inputs kept by comparisons and studies. Order is not chronological: use savedOptionId from save_process_option, or match id and createdAt; never infer newest from the last entry. Free; does not run simulations. get_process_comparison returns full archived inputs and results.","title":"List frozen layouts and saved comparisons","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_process_comparison","kind":"answer","impl":"imperative","description":"Read a self-contained saved comparison, including both frozen buildings and scenarios, engine version, input fingerprints, metrics, paired deltas, assumptions and warnings. format=html returns an escaped standalone report; json returns the complete record. One that is over the 1 MB link limit comes in pieces (as does any read given offset): content holds one piece of its text (the record as JSON text for json) with nextOffset; call again with offset=nextOffset until it is null, join the pieces in order and check sha256. Free; neither runs simulation nor grants authenticity to imported results. Hashes are reproducibility fingerprints, not security signatures.","title":"Read or export a saved process comparison","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"format":{"default":"json","type":"string","enum":["json","html"]},"offset":{"description":"Read in pieces from this UTF-16 offset: 0, then each nextOffset.","type":"integer","minimum":0,"maximum":100000000},"maxCharacters":{"description":"At most this many characters per piece; a piece also stays within the 1 MB link limit.","type":"integer","minimum":1,"maximum":1000000}},"required":["id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"save_process_option","kind":"act","impl":"imperative","description":"Save an immutable copy of the current complete building and a saved scenario. Capture baseline, edit the live model, then capture candidate. Reuses all free modeling operations; no simulation is executed. Up to 10 options. Captures copies, never mutable project or cloud references. Returns savedOptionId: use it to compare this exact frozen option; list order does not identify the newest option.","title":"Freeze the current layout and a scenario","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"scenarioId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"name":{"type":"string","minLength":1,"maxLength":120},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","scenarioId","name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"delete_saved_process_item","kind":"transact","impl":"imperative","description":"Remove one saved option, comparison or decision study by ID, with normal Undo. Removing an option does not affect saved comparisons or studies because they contain their own frozen inputs. Export needed results before deleting them. Does not edit the building or run simulation.","title":"Remove a frozen option, comparison or study","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"kind":{"type":"string","enum":["options","comparisons","studies"]},"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","kind","id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"compare_process_options","kind":"act","impl":"imperative","description":"Run two immutable saved layouts with their own scenario definitions. Requires Pro. Arrivals and their parameters, observation window, seed and run count must match (the process an arrival starts may differ: a new routing process compares). Scenario IDs may be the same across different layouts. Saves a self-contained result (up to 5) in the project, without replacing the live layout. Returns candidate-minus-baseline deltas, warnings and assumptions. Option IDs from saved comparisons can also be rerun after their separate option entry was deleted. Read get_process_comparison to export complete inputs/results.","title":"Compare two frozen layout and scenario options","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"baselineId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"candidateId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","baselineId","candidateId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"list_simulation_studies","kind":"answer","impl":"imperative","description":"Read the purpose, frozen option IDs, result status and recommendation of each saved study. Free; no calculations or AI calls. Studies remain independent of live edits. Imported results are user data, not authenticated measurements.","title":"List saved decision studies","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_simulation_study","kind":"answer","impl":"imperative","description":"Read frozen options, objectives, constraints, input sources, per-run observations, diagnostics and a deterministic assessment. Free. format=json (default) gives the complete record; html creates a self-contained decision report with each saved layout’s 2D drawings, quantities, constraints, choice/reasons and open conditions. For HTML, floors selects drawing sheets only; assessment and quantities remain whole-building. Old-engine or incomplete results do not yield a current recommendation. Large text uses nextOffset and SHA-256; repeat unchanged settings. Fingerprints establish consistency, not authenticity of imported results. Live edits cannot enter the archived study.","title":"Read a saved study and the evidence behind its recommendation","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"format":{"default":"json","type":"string","enum":["json","html"]},"locale":{"default":"en","type":"string","enum":["en","ja"]},"title":{"type":"string","minLength":1,"maxLength":180},"floors":{"minItems":1,"maxItems":120,"type":"array","items":{"type":"string","minLength":1,"maxLength":160}},"offset":{"type":"integer","minimum":0,"maximum":100000000},"maxCharacters":{"type":"integer","minimum":1,"maximum":1000000}},"required":["id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"run_simulation_study","kind":"act","impl":"imperative","description":"Run 2–10 frozen options under the same demand, window and seeds, then evaluate objectives and hard constraints. Requires Pro. Saves the question, assumptions, inputs and observations in the project (up to 5 studies); leaves the live layout unchanged. Priorities follow objective order. Never supplies missing costs, predicts unsupported phenomena, or generates candidate layouts. Unsupported/missing model requirements are rejected; invalid or incomplete results yield no recommendation. Recommendations apply only to evaluated alternatives and tested seeds. Read get_simulation_catalog first; get_simulation_study exports complete evidence. Undo removes the saved study.","title":"Evaluate saved layouts for an explicit decision","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":80,"description":"Use revision from the most recent get_space or successful edit."},"study":{"type":"object","properties":{"version":{"default":1,"type":"number","const":1},"engine":{"default":"process","type":"string","const":"process"},"question":{"type":"string","minLength":1,"maxLength":600},"baselineId":{"type":"string","minLength":1,"maxLength":64},"candidateIds":{"minItems":1,"maxItems":9,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"requirements":{"default":[],"maxItems":15,"type":"array","items":{"type":"string","enum":["spatial_routes","mobile_resources","handling_times","return_trips","resource_queues","shifts_and_arrivals","buffers_and_batches","vertical_transport","collision_avoidance","vehicle_turning","payload_clearance","crop_growth","thermal_energy","sunlight","robot_manipulation"]}},"objectives":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"object","properties":{"key":{"type":"string","minLength":1,"maxLength":160},"direction":{"type":"string","enum":["minimize","maximize"]}},"required":["key","direction"],"additionalProperties":false}},"constraints":{"default":[],"maxItems":12,"type":"array","items":{"type":"object","properties":{"key":{"type":"string","minLength":1,"maxLength":160},"operator":{"type":"string","enum":["atMost","atLeast"]},"value":{"type":"number"},"aggregation":{"default":"everyRun","type":"string","enum":["everyRun","mean"]}},"required":["key","operator","value"],"additionalProperties":false}},"reportMetrics":{"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":160}},"inputs":{"default":[],"maxItems":12,"type":"array","items":{"type":"object","properties":{"key":{"type":"string","pattern":"^input\\.[a-zA-Z][a-zA-Z0-9_-]{0,50}$"},"label":{"type":"string","minLength":1,"maxLength":160},"unit":{"type":"string","minLength":1,"maxLength":40},"values":{"minItems":2,"maxItems":10,"type":"array","items":{"type":"object","properties":{"optionId":{"type":"string","minLength":1,"maxLength":64},"value":{"type":"number"}},"required":["optionId","value"],"additionalProperties":false}},"source":{"type":"object","properties":{"subject":{"type":"string","minLength":1,"maxLength":160},"kind":{"type":"string","enum":["measured","reference","assumed"]},"note":{"type":"string","minLength":1,"maxLength":1200}},"required":["subject","kind","note"],"additionalProperties":false}},"required":["key","label","unit","values","source"],"additionalProperties":false}},"evidence":{"minItems":1,"maxItems":40,"type":"array","items":{"type":"object","properties":{"subject":{"type":"string","minLength":1,"maxLength":160},"kind":{"type":"string","enum":["measured","reference","assumed"]},"note":{"type":"string","minLength":1,"maxLength":1200}},"required":["subject","kind","note"],"additionalProperties":false}}},"required":["question","baselineId","candidateIds","objectives","evidence"],"additionalProperties":false},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","study"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"export_project","kind":"act","impl":"imperative","description":"Free project backup, including all areas, views, scenarios, saved comparisons, decision inputs and chat (includeMessages=false omits chat). Call without exportId at offset 0 to freeze a snapshot; fetch the next chunks with the same exportId and nextOffset until nextOffset is null (complete=true). A chunk is as large as fits the 1 MB link limit; pass a smaller maxCharacters to read chunks into a model context. Concatenate data strings in order and save UTF-8 JSON; verify totalBytes and SHA-256. Offsets count UTF-16 characters. One snapshot per tab, expires after 10 idle minutes. It stays frozen while the live project changes. Transient simulation traces are not saved. After a large creation or change, export and save the file on the user’s computer. Named local projects keep browser copies; cloud saving in Studio is Pro. Check persistence to confirm saving succeeded.","title":"Export the whole project","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"exportId":{"type":"string","minLength":1,"maxLength":100},"offset":{"default":0,"type":"integer","minimum":0,"maximum":50000000},"maxCharacters":{"default":1000000,"description":"At most this many characters per chunk; a chunk also stays within the 1 MB link limit. Leave it out for the fewest calls.","type":"integer","minimum":1,"maximum":1000000},"includeMessages":{"description":"false leaves the chat out. Set when starting an export; later calls may repeat the same value.","type":"boolean"},"includeUnderlayPictures":{"description":"false leaves the underlay pictures out (their placement stays): a much smaller file. Restoring it in this browser still finds the pictures it keeps. Set when starting an export; later calls may repeat the same value.","type":"boolean"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"import_project","kind":"act","impl":"imperative","description":"Free, atomic, undoable project restore; never runs a simulation. To upload a saved UTF-8 JSON file, action=write with expectedRevision, offset=0, data (up to 200,000 UTF-16 characters, and within the 256 KiB request as a JSON string: fewer with non-ASCII text), totalCharacters, totalBytes and sha256. Continue writes using transferId and nextOffset; identical chunk retries are safe. Live state stays unchanged until action=commit with transferId after all chunks arrive. action=cancel releases a staged import. action=restore with exportId restores this tab’s frozen export directly. Use current expectedRevision for every action. Any intervening project edit invalidates a staged import. Locks are protected; invalid or damaged saved fields are rejected. Do not manufacture measured-dimension or robot confirmations: preserve them only when restoring a saved project. When a floor’s robot dock or destination had to move to fit, relocatedRobotStations names the floors and stationNote says why (only the cleaning and two-station transport simulation uses them; no part, wall, door or scenario changes).","title":"Restore the whole project","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":100},"action":{"type":"string","enum":["write","commit","cancel","restore"]},"transferId":{"type":"string","minLength":1,"maxLength":100},"exportId":{"type":"string","minLength":1,"maxLength":100},"offset":{"type":"integer","minimum":0,"maximum":50000000},"data":{"type":"string","minLength":1,"maxLength":200000},"totalCharacters":{"type":"integer","minimum":1,"maximum":50000000},"totalBytes":{"type":"integer","minimum":1,"maximum":50000000},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","action"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_project_schema","kind":"answer","impl":"imperative","description":"Free and read-only. The saved project format as JSON Schema (draft 2020-12), one part at a time: project, building, floor, space (a floor’s scene), part, link (connection), structure (a building on the site), scenario, anchor, and changes (the input of apply_changes). part=overview (default) gives the rules a file follows (coordinate frames: site metres for floors, floor-local metres for everything on a floor and for connection ends; ids; versions; limits; default part sizes), the rules of apply_changes, and the authoring kit: a dependency-free Node.js module at /sdk/laydyne-kit.mjs (types /sdk/laydyne-kit.d.ts) that builds floors, buildings, connections and scenarios, checks them with the app’s own schemas and checks, and writes a project or a change set. Use it to generate large or rule-based models in a program.","title":"Read the saved project format","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"part":{"default":"overview","description":"overview (default): the rules, coordinate frames, ids, limits, part sizes and the authoring kit. Or one part of the format as a JSON Schema: project, building, floor, space (a floor’s scene), part, link (connection), structure (building on the site), scenario, anchor, changes (the input of apply_changes).","type":"string","enum":["overview","project","building","floor","space","part","link","structure","scenario","anchor","changes"]}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"apply_changes","kind":"act","impl":"imperative","description":"Free. Apply a change set in the saved format (get_project_schema part=changes) in one atomic, undoable step: floors (whole floors with every part), structures (buildings on the site), links (connections) and scenarios are put (added, or replaced by id) or removed, and floors.patch changes a floor part by part (fields to set; parts put or removed by id); everything the set does not name stays as it is, including other floors, other parts of a patched floor and edits made in Studio. dryRun: true validates and checks without changing anything and returns errors with paths, the summary (added, replaced, patched, unchanged and removed items; parts lost or overwritten on replaced floors; connections removed with their floors; ends pulled onto smaller floors; robot stations moved), the geometry checks of the floors and connections it touches (overlaps, narrow passages, doors that open nothing, parts off the floor, floors overlapping, floors over the routing side, steep or misaligned connections; reach: true adds unreachable zones), the current fingerprints and those after the change. base {floors|links|structures|scenarios: {id: fingerprint | null}} refuses the change when a whole item differs from the version it was made from (someone edited it); a patch's own base does so only for the fields and parts it changes, so the user's edits elsewhere on the floor stay and conflicts lists exactly which parts (by id) and fields were edited on both sides. Fingerprints are of items as the app keeps them (parts normalized, robot stations where the robot fits): the fingerprint of what you send, of the applied item and of an export read back are the same. Removing a floor removes its connections; scenarios must name places that exist afterwards; locked parts cannot change; removeUnlisted: true makes the site and scenarios exactly the set. Change sets over about 200 KB: action=write chunks (offset, data of up to 200000 UTF-16 characters; the first with totalCharacters, totalBytes and sha256; then transferId), then apply (or dryRun) with transferId. An apply is one revision and one Undo step, and returns the summary, checks and fingerprints. The authoring kit's diff(previous, next) writes these change sets, patches with their base included. Never runs a simulation. With request:{id,baseRevision}, set id to baseRevision.length + \":\" + baseRevision + \":\" + a request name (within 100 characters), keep both fixed from the initial read and send operationId=id unchanged for the commit (do not add a helper prefix; different IDs for previews/uploads). This binding guarantees Studio UUID:counter revisions; overly long revisions/IDs are refused, never truncated. One changeset is one request; its ID can be passed to undo_space_edit/redo_space_edit, which refuse another history entry. Optional request.scope:{floorId,partIds,attributes} allows only changes to those existing parts on that floor and those attributes (x,z,y,w,d,h,rotation,color), with unique partIds (1-100) and attributes. Dry-run and commit compare actual stored data, including array order: no additions/removals, other inputs, metadata, locked changes or collateral normalization (rotation w/d/footprint or robot stations). Scope violation refuses the whole changeset and reports up to four paths/part IDs/attributes. Unsupported hosts refuse scoped requests. plan:true proposes this exact request for human approval in Studio (no agent approval tool). Pending plans block agent writes; manual edits make the plan stale. This does not group separate live calls. External callers must supply request.scope explicitly; copied selection context alone does not enforce it. Do not replace baseRevision to retry after journal expiry/reload.","title":"Put, patch or remove floors, buildings, connections and scenarios by id","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"description":"Use revision from the most recent get_space or change. Needed to apply or dry-run; not to write or cancel an upload.","type":"string","minLength":1,"maxLength":100},"action":{"default":"apply","description":"request_begin opens a live group with fixed request and baseRevision; request_commit closes its confirmed prefix into one Undo; request_abort reverses only that unchanged known prefix (groupId). Separate operation IDs for each control. Children use requestGroupId, independent operationId and owned expectedRevision; only edit_space/apply_changes/put_process_scenario/delete_process_scenario/edit_equipment are supported. No simulation, import, other mutations or Plan inside a group. Unknown/reload requires explicit Studio recovery, never blind retry. apply (default): apply changes, or the upload named by transferId. write: stage one chunk of a large change set. cancel: drop the staged upload.","type":"string","enum":["apply","write","cancel","request_begin","request_commit","request_abort"]},"dryRun":{"default":false,"description":"Validate and check without changing anything: errors, summary, checks and fingerprints.","type":"boolean"},"plan":{"description":"Propose one fixed request for human approval in Studio. Requires request. Agent tools cannot approve it; normal edits without plan are unchanged.","type":"boolean"},"request":{"description":"One changeset is one request: id is `${baseRevision.length}:${baseRevision}:<name>` (100 characters maximum including the prefix); keep id and baseRevision fixed from its first read. Commit operationId must exactly equal id (do not add a helper prefix); preview/upload operation IDs must differ. This binding is guaranteed for Studio UUID:counter revisions; overly long revisions/IDs are rejected, never truncated. After journal expiry or reload never replace baseRevision to retry. Request-specific Undo/Redo refuses another history entry. Optional scope:{floorId,partIds,attributes} permits only these existing parts and attributes, compared against actual stored data; collateral normalization, other inputs, additions, removals, array reordering and locked changes are refused. plan:true stages this fixed request for human approval in Studio; while pending, all agent writes are blocked until the person approves or cancels. External callers must supply request.scope explicitly; copied selection context alone does not enforce it.","type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$"},"baseRevision":{"type":"string","minLength":1,"maxLength":100},"scope":{"type":"object","properties":{"floorId":{"type":"string","minLength":1,"maxLength":100},"partIds":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"uniqueItems":true},"attributes":{"minItems":1,"maxItems":8,"type":"array","items":{"type":"string","enum":["x","z","y","w","d","h","rotation","color"]},"uniqueItems":true}},"required":["floorId","partIds","attributes"],"additionalProperties":false}},"required":["id","baseRevision"],"additionalProperties":false},"groupId":{"description":"Fixed request ID for request_commit/request_abort. Read get_space.authoringRequestGroup before deciding. Abort restores only a known unchanged successful prefix.","type":"string","minLength":1,"maxLength":100},"changes":{"description":"The change set (get_project_schema part=changes): {site, structures, floors, links, scenarios: {put, remove}, removeUnlisted, base}.","type":"object","properties":{"site":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"floors":{"type":"object","properties":{"put":{"description":"Whole floors in the saved format (get_project_schema part=floor), parts included.","maxItems":40,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"remove":{"maxItems":40,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"patch":{"description":"Floors changed part by part, keeping edits made in Studio: {id, level?, x?, …, scene?: {fields}, parts?: {put: [parts], remove: [ids]}, base?: {fields as they were, parts: {id: fingerprint | null}}} (part=changes).","maxItems":40,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}},"additionalProperties":false},"structures":{"type":"object","properties":{"put":{"description":"Buildings on the site (part=structure).","maxItems":40,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"remove":{"maxItems":40,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}},"additionalProperties":false},"links":{"type":"object","properties":{"put":{"description":"Connections (part=link).","maxItems":100,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"remove":{"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}}},"additionalProperties":false},"scenarios":{"type":"object","properties":{"put":{"description":"Process scenarios (part=scenario).","maxItems":20,"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"remove":{"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"activeId":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]}},"additionalProperties":false},"removeUnlisted":{"type":"boolean"},"base":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"additionalProperties":false},"transferId":{"type":"string","minLength":1,"maxLength":100},"offset":{"type":"integer","minimum":0,"maximum":50000000},"data":{"type":"string","minLength":1,"maxLength":200000},"totalCharacters":{"type":"integer","minimum":1,"maximum":50000000},"totalBytes":{"type":"integer","minimum":1,"maximum":50000000},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"minClearance":{"default":0.9,"description":"Report passages narrower than this many metres.","type":"number","minimum":0.3,"maximum":5},"reach":{"default":false,"description":"Also check, on the floors the change touches, which zones a pedestrian cannot reach from any gate (routing; slower on large sites).","type":"boolean"},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_design_workspace","kind":"answer","impl":"imperative","description":"Read the purpose, source material, provided/assumed/unknown facts, fixed parts and independent saved layout options. Free, including projects with no simulation scenario. An option is immutable; restore it to continue editing and save another option. Unconfirmed facts are not treated as verified measurements.","title":"Read the project brief and design options","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"put_design_brief","kind":"act","impl":"imperative","description":"Save purpose, decision, recipient, source IDs, provided/assumed/unknown facts, text requirements, measurable criteria and fixed parts/floors/connections. A short purpose is enough to start. Criteria check counts, area, geometry and static routes; requirement indexes bind text to a measurable condition. Static routes support fixed points/parts/connection ends or nearest tagged parts, not runtime selection. Keep unknown dimensions and costs unknown. Sources are never fetched. Replaces the live brief in one undoable edit; saved options retain their brief. null clears it.","title":"Keep the purpose, sources and open questions","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":100},"brief":{"anyOf":[{"type":"object","properties":{"purpose":{"type":"string","minLength":1,"maxLength":2000},"decision":{"type":"string","maxLength":1000},"preparedFor":{"type":"string","maxLength":180},"sources":{"default":[],"maxItems":40,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"title":{"type":"string","minLength":1,"maxLength":180},"kind":{"type":"string","enum":["drawing","measurement","request","reference","assumption"]},"reference":{"type":"string","maxLength":1000},"note":{"type":"string","maxLength":2000}},"required":["id","title","kind"],"additionalProperties":false}},"facts":{"default":[],"maxItems":100,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"label":{"type":"string","minLength":1,"maxLength":300},"value":{"type":"string","maxLength":1000},"status":{"type":"string","enum":["provided","assumed","unknown"]},"sourceId":{"type":"string","minLength":1,"maxLength":64},"decisionCritical":{"default":false,"type":"boolean"},"target":{"type":"object","properties":{"floor":{"type":"string","minLength":1,"maxLength":40},"object":{"type":"string","minLength":1,"maxLength":64}},"required":["floor","object"],"additionalProperties":false}},"required":["id","label","status"],"additionalProperties":false}},"requirements":{"default":[],"maxItems":40,"type":"array","items":{"type":"string","minLength":1,"maxLength":1000}},"fixedParts":{"default":[],"maxItems":200,"type":"array","items":{"type":"object","properties":{"floor":{"type":"string","minLength":1,"maxLength":40},"object":{"type":"string","minLength":1,"maxLength":64}},"required":["floor","object"],"additionalProperties":false}},"criteria":{"maxItems":30,"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"label":{"type":"string","minLength":1,"maxLength":300},"requirement":{"type":"integer","minimum":0,"maximum":39},"type":{"type":"string","const":"count"},"floor":{"type":"string","minLength":1,"maxLength":40},"kinds":{"minItems":1,"maxItems":40,"type":"array","items":{"type":"string","enum":["wall","column","zone","desk","table","chair","sofa","cabinet","shelf","display","counter","rack","pallet","machine","booth","stage","bed","plant","block","partition","door","window","stairs","elevator","escalator","round_table","bookshelf","locker","whiteboard","wardrobe","kitchen","fridge","rug","checkout","fridge_case","clothes_rack","kiosk","conveyor","workbench","roll_cage","container","tank","forklift","charger","dock_door","seating_row","podium","screen","barrier","building","parking","road","sidewalk","lawn","tree","car","truck","fence","gate","bench","pole","person","toilet","washbasin","urinal","atm","pos_terminal","coffee_machine","oven","dishwasher","microwave","stool","parasol","showcase","menu_board","planter","sign","shopping_cart","cart_corral","bicycle","dock_shelter","dock_leveler","wheel_stop","fire_extinguisher","robot_arm","mobile_robot","pod","sorter","spiral_conveyor","chute","carton_erector","aircraft","jet_bridge","baggage_carousel","security_scanner","metal_detector","self_checkout","platform_trolley","crate_stack","toilet_cubicle","gable_roof","barrel_roof","solid"]}},"tags":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"limit":{"type":"object","properties":{"operator":{"type":"string","enum":["atLeast","atMost","equal"]},"value":{"type":"number","minimum":0}},"required":["operator","value"],"additionalProperties":false},"objective":{"type":"string","enum":["minimize","maximize"]}},"required":["id","label","type"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"label":{"type":"string","minLength":1,"maxLength":300},"requirement":{"type":"integer","minimum":0,"maximum":39},"type":{"type":"string","const":"floorArea"},"floor":{"type":"string","minLength":1,"maxLength":40},"limit":{"type":"object","properties":{"operator":{"type":"string","enum":["atLeast","atMost","equal"]},"value":{"type":"number","minimum":0}},"required":["operator","value"],"additionalProperties":false},"objective":{"type":"string","enum":["minimize","maximize"]}},"required":["id","label","type"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"label":{"type":"string","minLength":1,"maxLength":300},"requirement":{"type":"integer","minimum":0,"maximum":39},"type":{"type":"string","const":"route"},"from":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]}},"additionalProperties":false,"description":"A fixed point, part, connection end or nearest tagged part. Points need a floor. Runtime selectors (open, pick, within, spot, recall) are not supported."},"to":{"type":"object","properties":{"object":{"type":"string","minLength":1,"maxLength":60},"tag":{"type":"string","pattern":"^[a-z0-9_-]{1,24}$"},"point":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":500},"z":{"type":"number","minimum":0,"maximum":500}},"required":["x","z"],"additionalProperties":false},"link":{"type":"string","minLength":1,"maxLength":40},"end":{"type":"string","enum":["from","to"]},"floor":{"type":"string","minLength":1,"maxLength":40},"structure":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,39}$"},"side":{"description":"Stand beside a part that is in the way on this side instead of the nearest free point: north (towards smaller z), south, east or west on the plan; or front (the side it faces: a counter’s customer side, a machine’s working side) or back, for parts with a front (get_part_catalog front: true), turning with the part.","type":"string","enum":["north","south","east","west","front","back"]}},"additionalProperties":false,"description":"A fixed point, part, connection end or nearest tagged part. Points need a floor. Runtime selectors (open, pick, within, spot, recall) are not supported."},"agent":{"type":"object","properties":{"radius":{"type":"number","minimum":0.1,"maximum":1.5},"height":{"type":"number","minimum":0.1,"maximum":3},"speed":{"type":"number","exclusiveMinimum":0,"maximum":20},"links":{"maxItems":4,"type":"array","items":{"type":"string","enum":["passage","stairs","elevator","escalator"]}}},"required":["radius","height","speed","links"],"additionalProperties":false},"maxMetres":{"type":"number","minimum":0},"objective":{"type":"string","enum":["minimize","maximize"]}},"required":["id","label","type","from","to","agent"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"label":{"type":"string","minLength":1,"maxLength":300},"requirement":{"type":"integer","minimum":0,"maximum":39},"type":{"type":"string","const":"geometry"},"minClearance":{"type":"number","minimum":0.3,"maximum":5}},"required":["id","label","type","minClearance"],"additionalProperties":false}]}},"fixedFloors":{"maxItems":40,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"fixedConnections":{"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}}},"required":["purpose"],"additionalProperties":false},{"type":"null"}]},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","brief"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"save_design_option","kind":"act","impl":"imperative","description":"Freeze the current building, brief, drawings, view and process definitions as one named option. Free; no simulation or AI call. Or supply createdAt and variants [{id,name,changes}] to save independent layouts from this same live base in one atomic append. Batch changes are existing ChangeSets with only part patches on existing floors; fixed/locked data and all other context stay unchanged. Up to 10 options total including existing options/baseline; all variants validate before any save. dryRun checks without saving; geometry findings/failed criteria stay visible rather than becoming invented passes. Batch keeps the live model, results, view and activeOptionId; each saved option uses the one commit-time view. Use separate preview and commit operationIds; identical commit retries reuse their ID and explicit original expectedRevision (never let the SDK refresh it). Only a known failed batch may execute again with that identical pinned payload; applied/running/unknown return the existing outcome. No automatic retry after unknown. Large batches must fit the existing request/project limits; use the local kit prepareLayoutSweep and compact deltas.","title":"Save an independent layout option","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":100},"name":{"type":"string","minLength":1,"maxLength":120},"id":{"type":"string","minLength":1,"maxLength":64},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"variants":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","minLength":1,"maxLength":120},"changes":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["id","name","changes"],"additionalProperties":false}},"dryRun":{"type":"boolean"},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"restore_design_option","kind":"act","impl":"imperative","description":"Restore an independent option into the live editor, with its building, brief, source drawings, views and process definitions. Existing saved options and archived process comparisons remain immutable. Clears live results and robot comparison inputs from the previous model. One undo step restores the previous project. Locked parts remain protected. Save current work as another option first if needed. Free; no simulation is required or run.","title":"Continue editing a saved layout option","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":100},"id":{"type":"string","minLength":1,"maxLength":64},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"delete_design_option","kind":"transact","impl":"imperative","description":"Remove one option from this project, without changing the live model or brief. Undo restores it. Export the project to keep a copy before removing an option. Free.","title":"Remove a saved layout option","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":100},"id":{"type":"string","minLength":1,"maxLength":64},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_design_option","kind":"answer","impl":"imperative","description":"Read an immutable layout option, including all floors, source and scale metadata, facts and any process definitions. The input hash covers names, notes and source metadata as well as the geometry; it is a consistency check, not evidence of authenticity. Source image bytes are omitted; export_project includes them. Large JSON is returned in chunks with nextOffset and SHA-256.","title":"Read a saved layout and its sources","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"offset":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxCharacters":{"type":"integer","minimum":1,"maximum":750000}},"required":["id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_design_packet","kind":"answer","impl":"imperative","description":"Create one self-contained HTML handoff from 2–10 independent saved design options, baseline first. Each option keeps its actual buildings/floors: alternatives are never treated as extra floors. Always includes scaled 2D drawings, purpose, recipient, sources, assumptions/unknowns, shared quantities, a complete part inventory, stable-ID changes (including unambiguous cross-floor transfers), fixed-part differences and geometry findings. All carry the saved inputHash; live edits cannot enter the packet. Optional 3D pictures use the frozen building or are explicitly omitted. format=json returns the structured packet; inventory-csv returns all parts with option/inputHash, ID, floor, kind, tags, source, notes and dimensions. No source URLs are fetched and no legal compliance, ROI, recommendation or simulation result is invented. Free. Large text uses nextOffset and UTF-8 SHA-256; repeat unchanged optionIds/settings, then join the content chunks.","title":"Export a comparison of complete saved layouts","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"optionIds":{"minItems":2,"maxItems":10,"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"description":"Saved design option IDs, baseline first, followed by the alternatives."},"title":{"type":"string","minLength":1,"maxLength":180},"floors":{"description":"Optional floor IDs for drawing sheets and inventory rows. Evaluations, building quantities and change checks still cover the complete saved options. The report states this scope; omitted floors are not deleted from the project.","minItems":1,"maxItems":120,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}},"locale":{"default":"en","type":"string","enum":["en","ja"]},"pictures":{"default":false,"description":"Include an optional 3D overview of each frozen option. Scaled 2D drawings are always included in HTML, even when false. Unavailable or inconsistent 3D pictures are explicitly omitted.","type":"boolean"},"format":{"default":"html","type":"string","enum":["html","json","inventory-csv"]},"offset":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxCharacters":{"type":"integer","minimum":1,"maximum":750000}},"required":["optionIds"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"compare_design_options","kind":"act","impl":"imperative","description":"Compare two immutable complete layouts, without a simulation scenario. Reports each option’s drawing version, quantities, building checks (including overlapping floors), floor additions/removals, per-floor part changes and changes to the baseline’s fixed parts. Uses stable floor IDs; distinct IDs are additions/removals, not guessed matches. Unknown facts remain visible. This descriptive comparison makes no automatic recommendation or ROI claim. Free. Large results use JSON chunks.","title":"Compare saved layouts and fixed conditions","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"baselineId":{"type":"string","minLength":1,"maxLength":64},"candidateId":{"type":"string","minLength":1,"maxLength":64},"offset":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxCharacters":{"type":"integer","minimum":1,"maximum":750000}},"required":["baselineId","candidateId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"evaluate_design_options","kind":"act","impl":"imperative","description":"Free static evaluation of 2–10 frozen design options, baseline first. Applies the baseline brief criteria and fixed conditions to all alternatives. Counts, floor areas, geometry checks and static route lengths; no process scenario or simulation required. Unmapped text requirements, critical unknowns, unsupported routes and adjusted exact points prevent a recommendation. Objectives return non-dominated alternatives; a unique survivor may be recommended only among tested drawings. This is conditional on the supplied criteria, not a field, safety or legal guarantee. Results include evaluator version and saved input hashes; JSON chunks are supported.","title":"Check saved layouts against the same explicit conditions","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"optionIds":{"minItems":2,"maxItems":10,"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"description":"Saved design option IDs, baseline first, followed by the alternatives."},"offset":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxCharacters":{"type":"integer","minimum":1,"maximum":750000}},"required":["optionIds"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"save_design_cost_comparison","kind":"act","impl":"imperative","description":"Free, undoable cost comparison bound to two saved design option versions. Save every price, quantity, currency and operating-day input with its source and provided/assumed/unknown status. Demand/deadline keys and meetsConditions are caller-supplied statements, not automatic verification of service performance; cite the actual evaluation. Uses an explicit shared cost scope and never turns unknown values or absent initial/operating scope into zero. Cancellation conditions separate modeled savings from spending that can really be removed. Preparation effort and freed task hours stay separate from cash. Saves inputs and arithmetic, up to 5 records. No revenue, realized ROI or missing price is inferred.","title":"Save attributed cost conditions for two layout options","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":100},"id":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","minLength":1,"maxLength":160},"input":{"type":"object","properties":{"basis":{"type":"string","enum":["synthetic","field_inputs"]},"currency":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"string","pattern":"^[A-Z]{3}$"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"string","pattern":"^[A-Z]{3}$"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]},"workdaysPerYear":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"integer","minimum":1,"maximum":366},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"integer","minimum":1,"maximum":366},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]},"baseline":{"type":"object","properties":{"optionId":{"type":"string","minLength":1,"maxLength":100},"demandKey":{"type":"string","minLength":1,"maxLength":100},"deadlineKey":{"type":"string","minLength":1,"maxLength":100},"meetsConditions":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"boolean"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"boolean"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]},"costs":{"minItems":1,"maxItems":40,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"label":{"type":"string","minLength":1,"maxLength":200},"period":{"type":"string","enum":["initial","operating_day"]},"unit":{"type":"string","minLength":1,"maxLength":100},"unitPrice":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"number","minimum":0,"maximum":1000000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"number","minimum":0,"maximum":1000000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]},"quantity":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]}},"required":["id","label","period","unit","unitPrice","quantity"],"additionalProperties":false}},"taskHoursSavedPerOperatingDay":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]}},"required":["optionId","demandKey","deadlineKey","meetsConditions","costs"],"additionalProperties":false},"candidate":{"type":"object","properties":{"optionId":{"type":"string","minLength":1,"maxLength":100},"demandKey":{"type":"string","minLength":1,"maxLength":100},"deadlineKey":{"type":"string","minLength":1,"maxLength":100},"meetsConditions":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"boolean"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"boolean"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]},"costs":{"minItems":1,"maxItems":40,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"label":{"type":"string","minLength":1,"maxLength":200},"period":{"type":"string","enum":["initial","operating_day"]},"unit":{"type":"string","minLength":1,"maxLength":100},"unitPrice":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"number","minimum":0,"maximum":1000000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"number","minimum":0,"maximum":1000000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]},"quantity":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]}},"required":["id","label","period","unit","unitPrice","quantity"],"additionalProperties":false}},"taskHoursSavedPerOperatingDay":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]}},"required":["optionId","demandKey","deadlineKey","meetsConditions","costs"],"additionalProperties":false},"cancellations":{"default":[],"maxItems":40,"type":"array","items":{"type":"object","properties":{"costId":{"type":"string","minLength":1,"maxLength":100},"possible":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"boolean"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"boolean"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]}},"required":["costId","possible"],"additionalProperties":false}},"toolUse":{"type":"object","properties":{"previous":{"type":"object","properties":{"humanMinutes":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]},"aiMinutes":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]}},"required":["humanMinutes","aiMinutes"],"additionalProperties":false},"withTool":{"type":"object","properties":{"humanMinutes":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]},"aiMinutes":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","const":"provided"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"assumed"},"value":{"type":"number","minimum":0,"maximum":1000000},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","value","source"],"additionalProperties":false},{"type":"object","properties":{"status":{"type":"string","const":"unknown"},"source":{"type":"string","minLength":1,"maxLength":2000}},"required":["status","source"],"additionalProperties":false}]}},"required":["humanMinutes","aiMinutes"],"additionalProperties":false}},"required":["previous","withTool"],"additionalProperties":false}},"required":["basis","currency","workdaysPerYear","baseline","candidate"],"additionalProperties":false},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","name","input"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_design_cost_comparison","kind":"answer","impl":"imperative","description":"Read a frozen cost comparison with sources, unknowns and exact design version bindings. Live edits do not change it. If a bound option was removed or its ID reused, status says so; never treat this archived arithmetic as evidence for another version. JSON chunks supported.","title":"Read saved cost inputs and conditional results","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"offset":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxCharacters":{"type":"integer","minimum":1,"maximum":750000}},"required":["id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"delete_design_cost_comparison","kind":"transact","impl":"imperative","description":"Remove one archived cost comparison. Leaves the live model, saved options and other comparisons unchanged. Undo restores it. Export the project first to keep a copy.","title":"Remove a saved cost comparison","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":100},"id":{"type":"string","minLength":1,"maxLength":64},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"list_local_projects","kind":"answer","impl":"imperative","description":"Free. List saved project names, IDs, stored revisions, sizes and counts in the current account browser storage. Query filters names. This is local to this browser; it does not list cloud projects or other accounts. Read metadata before replacing or opening a project.","title":"Find named projects saved in this browser","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"query":{"type":"string","maxLength":120}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_local_project","kind":"answer","impl":"imperative","description":"Free. Read a saved local project, including independent options, conditions and saved results. Messages and source image bytes are omitted by default; explicit flags include them. Large JSON uses bounded chunks and SHA-256. Reuse the same stored expectedProjectRevision across chunks so another tab cannot mix versions. Does not open the project, fetch URLs or access cloud storage.","title":"Read a named browser project without changing the editor","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":100},"expectedProjectRevision":{"type":"integer","minimum":1,"maximum":9007199254740991},"includeMessages":{"default":false,"type":"boolean"},"includeUnderlayPictures":{"default":false,"type":"boolean"},"offset":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxCharacters":{"type":"integer","minimum":1,"maximum":750000}},"required":["id","expectedProjectRevision"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"save_local_project","kind":"act","impl":"imperative","description":"Free. Save the full current project with pictures, messages and saved results in this account browser storage. Omit id to create a new named project. Replacing an existing project requires its id and expectedProjectRevision from list_local_projects; same-name duplicates are refused. expectedRevision protects the current workspace. Use operationId for retry safety. Does not upload to cloud. Storage failure leaves existing saved projects unchanged; export_project provides an independent backup.","title":"Save the current project under a browser-local name","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":100},"name":{"type":"string","minLength":1,"maxLength":120},"id":{"type":"string","minLength":1,"maxLength":100},"expectedProjectRevision":{"type":"integer","minimum":0,"maximum":9007199254740991},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"open_local_project","kind":"act","impl":"imperative","description":"Free. Open the selected saved revision into Studio without running simulation. First preserves the entire current workspace as a separate recovery project in browser storage; if this fails, nothing opens. Undo also restores the prior workspace. Locked parts remain protected. Uses current expectedRevision and the target expectedProjectRevision; safe retries use operationId. Does not change the original saved snapshot or cloud storage.","title":"Continue work from a named browser project","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expectedRevision":{"type":"string","minLength":1,"maxLength":100},"id":{"type":"string","minLength":1,"maxLength":100},"expectedProjectRevision":{"type":"integer","minimum":1,"maximum":9007199254740991},"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"Your own unique name for this change, such as a UUID; optional. Sending the same call again with the same operationId returns the earlier result (replayed: true) instead of applying it twice, and get_operation tells whether it applied. Use a new one for each new change."},"requestGroupId":{"type":"string","minLength":1,"maxLength":100,"description":"Attach this live edit to an open request group. Requires a fixed operationId and the current owned expectedRevision. Only the advertised five editing tools support groups."}},"required":["expectedRevision","id","expectedProjectRevision"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]},{"name":"get_operation","kind":"answer","impl":"imperative","description":"Read whether a change sent with an operationId applied, failed or is still running in this Studio tab, and the result it returned. Every change through the MCP link has one (your own, or the one a timeout names). The tab remembers its last 50 changes for 15 minutes; a reload forgets that transient journal. A native request checkpoint can still report a saved request.id committed earlier and its undone cursor, without reconstructing the original response or revision. Read get_space for the current Plan and checkpoint availability before a new change; never reapply a saved request with a new ID to recover its reply. unknown: the tab has no record (the change never reached it, it is older, or the tab was reloaded) or could not confirm it; read get_space before deciding. revision is the one the change made; currentRevision the one to send with the next change. Read-only; free.","title":"Check what became of a change","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"operationId":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$","description":"The operationId sent with the change, or the one a timeout named."}},"required":["operationId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/studio","pages":["/studio"]}],"category":"Productivity & Business","favicon":"/favicons/laydyne.com.png","apiSurface":"spec","toolCount":64}}