{"ok":true,"site":{"host":"lares-woad.vercel.app","url":"https://lares-woad.vercel.app/","type":"live","desc":"Plan a room, check clearances, and price the result.","tools":[{"name":"get_room","kind":"answer","impl":"imperative","description":"Read the current room: its size in millimetres, its walls, every door and window with its position and swing, and any fixed obstructions. The studio starts empty. If defined is false, call define_room from the user's description before placing anything.","annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_placements","kind":"answer","impl":"imperative","description":"Read everything currently placed in the room, with each item's placement id, product, position, rotation and derived footprint. Use the placement ids to move, rotate, swap or remove items.","annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"search_catalog","kind":"answer","impl":"imperative","description":"Find products, filtered by what will physically fit. Give maxWidthMm and maxDepthMm to get only items that fit that floor area in either orientation, and set includeClearances to also require room for their door swings and chair pull-out. Filter further by category, price ceiling and style tags.","annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"Free-text match against product names, blurbs and style tags.","maxLength":120},"categories":{"type":"array","description":"Restrict results to these categories.","items":{"type":"string","enum":["sofa","armchair","coffee_table","dining_table","dining_chair","bed","bedside_table","wardrobe","bookshelf","desk","office_chair","rug","floor_lamp","sideboard","tv_unit"],"description":"Product category."},"maxItems":15},"maxWidthMm":{"type":"integer","description":"Longest footprint side the item may have, in millimetres. Items are tested in both orientations.","minimum":100,"maximum":20000},"maxDepthMm":{"type":"integer","description":"Shortest footprint side the item may have, in millimetres.","minimum":100,"maximum":20000},"minWidthMm":{"type":"integer","description":"Smallest acceptable longest side, in millimetres — use this to avoid returning items that are too small for the space.","minimum":100,"maximum":20000},"maxHeightMm":{"type":"integer","description":"Height ceiling in millimetres.","minimum":10,"maximum":4000},"maxPriceCents":{"type":"integer","description":"Price ceiling in Australian cents. $1,500 is 150000.","minimum":0,"maximum":10000000},"minPriceCents":{"type":"integer","description":"Price floor in Australian cents.","minimum":0,"maximum":10000000},"styleTags":{"type":"array","description":"Style tags to match, so requests like 'something in warmer timber' can be honoured.","items":{"type":"string","enum":["warm timber","light oak","walnut","black metal","brushed brass","linen","boucle","leather","minimal","mid-century","scandinavian","industrial","coastal","rattan","velvet","compact"]},"maxItems":8},"includeClearances":{"type":"boolean","description":"When true, maxWidthMm and maxDepthMm must accommodate the item plus the clearance it needs to be usable, not just its bare footprint."},"mustFitThroughMm":{"type":"integer","description":"Narrowest doorway the item has to be carried through, in millimetres. Defaults to the room's narrowest door when omitted.","minimum":300,"maximum":4000},"limit":{"type":"integer","description":"Maximum number of results to return.","minimum":1,"maximum":50,"default":12}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"check_layout","kind":"answer","impl":"imperative","description":"Validate the current layout against real circulation standards and return every violation as a structured finding with a code, a severity, the placements involved, and the measured against required millimetres. Call this after placing or moving anything to see whether the change works. Requires a defined room.","annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_cost_breakdown","kind":"answer","impl":"imperative","description":"Read the itemised cost of everything currently placed, subtotalled by category and compared against the budget if one is set.","annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"define_room","kind":"act","impl":"imperative","description":"The studio starts empty. Create or replace the room from a description of the space: its size in millimetres, its doors and windows, and any fixed obstructions such as a bulkhead or a column. Call this first, before furnishing. Doors record their hinge side and swing so the arc can be kept clear.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"What to call the room, e.g. 'Living room'.","maxLength":60},"widthMm":{"type":"integer","description":"East-west size of the room in millimetres. 4.2 metres is 4200.","minimum":1000,"maximum":20000},"depthMm":{"type":"integer","description":"North-south size of the room in millimetres. 3.8 metres is 3800.","minimum":1000,"maximum":20000},"openings":{"type":"array","description":"Every door and window in the room.","items":{"type":"object","description":"A door or window in one of the room's walls.","properties":{"type":{"type":"string","enum":["door","window"],"description":"Door or window."},"wall":{"type":"string","enum":["north","east","south","west"],"description":"Which wall the opening sits in."},"offsetMm":{"type":"integer","description":"Distance in millimetres from the clockwise start of that wall to the near edge of the opening. Walls run clockwise from the north-west corner.","minimum":0,"maximum":20000},"widthMm":{"type":"integer","description":"Width of the opening in millimetres.","minimum":300,"maximum":6000},"heightMm":{"type":"integer","description":"Head height for a door, or sill-to-head height for a window, in millimetres.","minimum":300,"maximum":3000},"hingeSide":{"type":"string","enum":["start","end"],"description":"Doors only. 'start' hinges at the end of the opening nearest the wall's clockwise start; 'end' hinges at the far end."},"swingDirection":{"type":"string","enum":["inward","outward"],"description":"Doors only. 'inward' swings into this room and its arc must be kept clear; 'outward' swings away."}},"required":["type","wall","offsetMm","widthMm"],"additionalProperties":false},"maxItems":12},"obstructions":{"type":"array","description":"Fixed things furniture cannot occupy.","items":{"type":"object","description":"A fixed thing furniture cannot occupy, such as a bulkhead or a column.","properties":{"label":{"type":"string","description":"Short natural-language label, e.g. 'corner bulkhead'.","maxLength":80},"kind":{"type":"string","enum":["bulkhead","column","radiator","stair","fireplace","other"],"description":"What kind of fixed thing it is."},"x":{"type":"integer","description":"Millimetres east of the room's north-west corner.","minimum":0,"maximum":20000},"y":{"type":"integer","description":"Millimetres south of the room's north-west corner.","minimum":0,"maximum":20000},"widthMm":{"type":"integer","description":"East-west size in millimetres.","minimum":50,"maximum":20000},"depthMm":{"type":"integer","description":"North-south size in millimetres.","minimum":50,"maximum":20000}},"required":["label","kind","x","y","widthMm","depthMm"],"additionalProperties":false},"maxItems":12},"keepPlacements":{"type":"boolean","description":"Keep the existing furniture when redefining the room. Leave this off when describing a new room, since old coordinates will rarely still make sense."}},"required":["widthMm","depthMm"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"furnish_room","kind":"act","impl":"imperative","description":"Furnish the current room for a function (living_room, bedroom, home_office, dining) and optional style theme. Picks matching catalog products, places a starter layout in the 3D studio, and returns clearance findings so you can inspect and refine. Requires a defined room — call define_room first if the studio is empty. Prefer this over hand-placing every item when the user says 'furnish my living room in warm timber'.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"roomFunction":{"type":"string","enum":["living_room","bedroom","home_office","dining"],"description":"How the room will be used."},"theme":{"type":"string","enum":["warm timber","light oak","walnut","black metal","brushed brass","linen","boucle","leather","minimal","mid-century","scandinavian","industrial","coastal","rattan","velvet","compact"],"description":"Optional style tag to bias product picks, e.g. 'warm timber' or 'scandinavian'."},"budgetCents":{"type":"integer","description":"Optional spending limit in Australian cents. Also sets the studio budget.","minimum":0,"maximum":10000000},"replaceExisting":{"type":"boolean","description":"Replace current placements (default true) rather than adding to them."}},"required":["roomFunction"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"place_item","kind":"act","impl":"imperative","description":"Add a catalog product to the room at a position and rotation. Returns the new placement together with every clearance finding the placement introduced, so a bad position can be corrected immediately. Requires a defined room.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"productId":{"type":"string","description":"Catalog product id, as returned by search_catalog.","maxLength":60},"x":{"type":"integer","description":"Millimetres east of the room's north-west corner, to the item's west edge.","minimum":0,"maximum":20000},"y":{"type":"integer","description":"Millimetres south of the room's north-west corner, to the item's north edge.","minimum":0,"maximum":20000},"rotation":{"type":"integer","enum":[0,90,180,270],"description":"Clockwise rotation in degrees. At 0 the product's front faces south (down the plan); 90 turns it to face west."},"note":{"type":"string","description":"Optional note about intent, e.g. 'faces the window'.","maxLength":120}},"required":["productId","x","y","rotation"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"move_item","kind":"act","impl":"imperative","description":"Move an existing placement to a new position, keeping its product and rotation. Returns the clearance findings the new position introduced.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"placementId":{"type":"string","description":"Id of an existing placement, as returned by list_placements or place_item (for example 'pl-003').","maxLength":40},"x":{"type":"integer","description":"New millimetres east of the room's north-west corner.","minimum":0,"maximum":20000},"y":{"type":"integer","description":"New millimetres south of the room's north-west corner.","minimum":0,"maximum":20000}},"required":["placementId","x","y"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"rotate_item","kind":"act","impl":"imperative","description":"Turn an existing placement to a new rotation, keeping its north-west corner where it is. Returns the clearance findings the new orientation introduced.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"placementId":{"type":"string","description":"Id of an existing placement, as returned by list_placements or place_item (for example 'pl-003').","maxLength":40},"rotation":{"type":"integer","enum":[0,90,180,270],"description":"Clockwise rotation in degrees. At 0 the product's front faces south (down the plan); 90 turns it to face west."}},"required":["placementId","rotation"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_item","kind":"act","impl":"imperative","description":"Take an item out of the room. Returns the remaining placements and the findings that are still outstanding.","annotations":{"readOnlyHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{"placementId":{"type":"string","description":"Id of an existing placement, as returned by list_placements or place_item (for example 'pl-003').","maxLength":40}},"required":["placementId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"swap_product","kind":"act","impl":"imperative","description":"Replace the product in an existing placement while keeping its position and rotation. Use this for 'swap that for something cheaper' or 'the same but in warmer timber'.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"placementId":{"type":"string","description":"Id of an existing placement, as returned by list_placements or place_item (for example 'pl-003').","maxLength":40},"productId":{"type":"string","description":"Catalog product id, as returned by search_catalog.","maxLength":60}},"required":["placementId","productId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"apply_layout","kind":"act","impl":"imperative","description":"Place a whole proposed layout in one call. Use this when furnishing a room from scratch, then read the returned findings to see which items need adjusting.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"items":{"type":"array","description":"The items to place, in the order they should be added.","minItems":1,"maxItems":30,"items":{"type":"object","properties":{"productId":{"type":"string","description":"Catalog product id, as returned by search_catalog.","maxLength":60},"x":{"type":"integer","description":"Millimetres east of the room's north-west corner.","minimum":0,"maximum":20000},"y":{"type":"integer","description":"Millimetres south of the room's north-west corner.","minimum":0,"maximum":20000},"rotation":{"type":"integer","enum":[0,90,180,270],"description":"Clockwise rotation in degrees. At 0 the product's front faces south (down the plan); 90 turns it to face west."},"note":{"type":"string","description":"Optional note about intent.","maxLength":120}},"required":["productId","x","y","rotation"],"additionalProperties":false}},"replaceExisting":{"type":"boolean","description":"Clear the room before applying, rather than adding to what is already placed."}},"required":["items"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_budget","kind":"act","impl":"imperative","description":"Set or clear the spending limit the layout is priced against. Pass budgetCents to set it, or omit it to remove the limit.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"budgetCents":{"type":"integer","description":"Budget in Australian cents, so a $3,000 budget is 300000. Omit to clear the budget.","minimum":0,"maximum":10000000}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"checkout","kind":"transact","impl":"imperative","description":"Stage the current layout for purchase. This does not complete the purchase: it opens a confirmation panel in the page and returns a state of 'awaiting_confirmation'. The shopper must press Confirm purchase themselves. Call checkout_status afterwards to see what they decided.","annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"checkout_status","kind":"answer","impl":"imperative","description":"Read whether a staged purchase is still waiting on the shopper, was confirmed by them, or was declined.","annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Commerce","favicon":"/favicons/lares-woad.vercel.app.ico","apiSurface":"spec","toolCount":16}}