{"ok":true,"site":{"host":"agenticroom.setyongr.chatgpt.site","url":"https://agenticroom.setyongr.chatgpt.site/","type":"live","desc":"Plan a living room together in 3D. Arrange furniture, compare prices, and stay within budget with shared controls for you and your WebMCP agent.","tools":[{"name":"get_planner_guide","kind":"answer","impl":"imperative","description":"Orientation for agents that just opened this site: what AgenticRoom is, what the room editor can do, the exact tools to use for each task, a recommended design workflow, and the invariants agents must respect (budget semantics, locks, session-only uploads). Call this first, then get_room_state for the live design. Static, first-party content; never mutates state and never reads session data.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_room_state","kind":"answer","impl":"imperative","description":"Read the current room state: room dimensions, wall openings (doors and windows with footprints), the room appearance (wall finish, floor finish, wallpaper), every placed furniture item with its id, name, category, dimensions, position, rotation, lock and source flags, budget-relevant price, and chosen color and material variant, the design budget, live pricing totals, and layout validation issues. When a design was saved this session, its name is included. Deterministic; never mutates state.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_available_placement_zones","kind":"answer","impl":"imperative","description":"List the room’s placement zones that currently accept the given furniture category and still have free capacity. Each zone reports its footprint, allowed categories, current occupancy, and remaining slots, so a product can be routed to a valid destination before placing it. Deterministic read; records a zone inspection in the activity feed.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"category":{"type":"string","description":"Furniture category to place; zones must allow it and have free capacity.","enum":["sofa","armchair","accent_chair","coffee_table","side_table","console","floor_lamp","table_lamp","rug","shelf","cabinet","storage","plant","curtain","decor","tv","soundbar","speaker","bed"]}},"required":["category"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"search_products","kind":"answer","impl":"imperative","description":"Search the marketplace catalog by free-text query, category, style tags, colors, materials, price range, stock availability, and maximum width/depth footprint, with deterministic sorting and pagination. Results carry price, dimensions, style tags, colors, material, and stock. Use this before placing a product. Deterministic read; records the search in the activity feed.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Free-text query matched against product name, material, and style tags."},"category":{"type":"string","description":"Only products of this furniture category.","enum":["sofa","armchair","accent_chair","coffee_table","side_table","console","floor_lamp","table_lamp","rug","shelf","cabinet","storage","plant","curtain","decor","tv","soundbar","speaker","bed"]},"styles":{"type":"array","items":{"type":"string"},"description":"Only products carrying any of these style tags (e.g. \"scandinavian\")."},"colors":{"type":"array","items":{"type":"string"},"description":"Only products offering any of these colors (e.g. \"oak\", \"charcoal\")."},"materials":{"type":"array","items":{"type":"string"},"description":"Only products made of any of these materials (e.g. \"oak\", \"linen\")."},"minPrice":{"type":"number","description":"Inclusive lower price bound in USD."},"maxPrice":{"type":"number","description":"Inclusive upper price bound in USD."},"inStockOnly":{"type":"boolean","description":"When true, only products with stock greater than zero."},"sort":{"type":"string","description":"Deterministic result ordering.","enum":["relevance","price_asc","price_desc","name_asc","name_desc"]},"maxWidth":{"type":"number","description":"Only products whose width in meters is at most this value."},"maxDepth":{"type":"number","description":"Only products whose depth in meters is at most this value."},"page":{"type":"integer","description":"1-based page number; clamps to the last page."},"pageSize":{"type":"integer","description":"Results per page, at most 25 (default 10)."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_product","kind":"answer","impl":"imperative","description":"Fetch one marketplace product by id with its full catalog details: category, price, width/depth/height in meters, style tags, colors, material, stock, and default rotation, plus the placed instances currently using it in the room. Unknown ids fail with code \"missing_product\". Deterministic read; records the product view in the activity feed.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"productId":{"type":"string","description":"Stable catalog product id, e.g. \"fjord-3-seat-sofa\"."}},"required":["productId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"check_layout","kind":"answer","impl":"imperative","description":"Re-run layout validation against the live room, placed items, and budget: room bounds, furniture overlaps, opening clearance, zone compatibility and membership, budget, stock, and catalog integrity. Returns whether the design is valid plus every issue with its kind, severity, message, and affected instance ids. Deterministic read; records the layout check in the activity feed.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"calculate_total","kind":"act","impl":"imperative","description":"Recompute the full budget breakdown of the current design: marketplace and existing subtotals, grand total, budget, signed remaining, over-budget flag, and one line per placed item with unit price, line total, source, and lock state. Deterministic read; records the calculation in the activity feed.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_budget_pressure","kind":"answer","impl":"imperative","description":"Report the budget pressure of the current design: under/at/over-budget status, signed remaining, amount over, and the replaceable marketplace items sorted by price (most expensive first) to inform budget-rescue tradeoffs. Deterministic read of the live design; never mutates state.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"find_cheaper_alternatives","kind":"answer","impl":"imperative","description":"Suggest cheaper same-category replacements for one placed marketplace item. The instance must exist, be marketplace-sourced, and not be locked. Candidates are strictly cheaper and in stock, optionally capped by targetPrice, ranked by style, color, material, and dimension compatibility, then by savings. Returns savings and compatibility scores per candidate. Deterministic; records the suggestion in the activity feed.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"instanceId":{"type":"string","description":"Placed instance to find replacements for (marketplace, unlocked)."},"targetPrice":{"type":"number","description":"Inclusive upper bound on the replacement price in USD."},"maxResults":{"type":"integer","description":"Maximum number of candidates to return (1-20, default 5)."}},"required":["instanceId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_saved_designs","kind":"answer","impl":"imperative","description":"List the designs saved during this session, newest first, with each snapshot’s budget, placed-item count, marketplace total, and room appearance at save time. Deterministic read of session state; never mutates state.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"render_scene_snapshot","kind":"act","impl":"imperative","description":"Render the current 3D room to a JPEG image (data URL) so the arrangement can be judged visually. view presets: “live” uses the editor camera exactly as last left; “orbit”/“top”/“front”/“side” frame the standard room overviews without moving the user’s camera. Returns the image as a data: URL with pixel dimensions; output is downscaled to maxWidth. Only the 3D canvas is captured — UI panels, overlays, and text are never included. Deterministic; never mutates state.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"view":{"type":"string","enum":["live","orbit","top","front","side"],"description":"Which camera view to render (“live” = current editor camera)."},"maxWidth":{"type":"integer","description":"Output width cap in pixels (256-2048, default 1024); height keeps the canvas aspect."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"place_product","kind":"act","impl":"imperative","description":"Place a product through the same store action as the UI: zoneId centers it in a placement zone (category, capacity, and fit are domain-enforced), or position x/z places it explicitly (unvalidated geometry); optional rotation; optional color (one of the product’s authored colors) with the product’s material. Returns the new item with its stored variant, refreshed pricing (newTotal, budget, remaining, overBudget), and current layout validity and issues. Failures (missing/out-of-stock product, unknown/full/incompatible zone, unavailable color or material) leave the room unchanged.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"productId":{"type":"string","description":"Catalog product id to place, e.g. \"drift-oak-coffee-table\"."},"zoneId":{"type":"string","description":"Place into this zone at its center (e.g. \"living-area\"); exclusive with position."},"position":{"type":"object","description":"Explicit footprint center in room coordinates; exclusive with zoneId.","properties":{"x":{"type":"number","description":"Center x in meters; the room spans x in [-3, 3]."},"z":{"type":"number","description":"Center z in meters; the room spans z in [-2.25, 2.25]."}},"required":["x","z"],"additionalProperties":false},"rotation":{"type":"number","description":"Yaw in degrees; normalized to [0, 360). Defaults to the product default (0)."},"color":{"type":"string","description":"Chosen colorway, one of the product’s authored colors (see get_product). Defaults to the first color."},"material":{"type":"string","description":"The product’s authored material; mismatched values fail with invalid_variant."}},"required":["productId"],"oneOf":[{"type":"object","required":["zoneId"]},{"type":"object","required":["position"]}],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"move_product","kind":"act","impl":"imperative","description":"Move a placed item to a new x/z footprint-center position (floor base, y stays 0) through the same store action as the UI. Locked items may be moved. The move itself is not geometry-checked; validation refreshes immediately and reports out-of-bounds, overlap, opening, and zone issues. Returns the moved item, refreshed pricing (newTotal, budget, remaining, overBudget), and current layout validity and issues.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"instanceId":{"type":"string","description":"Instance id of the placed item to act on, e.g. \"existing-sofa\" or \"drift-oak-coffee-table-1\"."},"position":{"type":"object","description":"New footprint center in room coordinates; the item stays at floor base.","properties":{"x":{"type":"number","description":"Center x in meters; the room spans x in [-3, 3]."},"z":{"type":"number","description":"Center z in meters; the room spans z in [-2.25, 2.25]."}},"required":["x","z"],"additionalProperties":false}},"required":["instanceId","position"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"rotate_product","kind":"act","impl":"imperative","description":"Set a placed item’s yaw rotation in degrees through the same store action as the UI; the value is normalized to [0, 360). Position, lock, and source are unchanged, and locked items may be rotated. Returns the rotated item, refreshed pricing (newTotal, budget, remaining, overBudget), and current layout validity and issues. Unknown instances fail with item_not_found.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"instanceId":{"type":"string","description":"Instance id of the placed item to act on, e.g. \"existing-sofa\" or \"drift-oak-coffee-table-1\"."},"rotation":{"type":"number","description":"New yaw in degrees around y; normalized to [0, 360)."}},"required":["instanceId","rotation"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_item_elevation","kind":"act","impl":"imperative","description":"Set how high a placed item’s base sits above the floor (meters) through the same store action as the UI: raise TVs, wall art, shelves, and curtains to hang them instead of resting on the floor. y=0 puts the piece back on the floor. Locked items may be raised (like move/rotate); negative or non-finite heights fail with invalid_elevation. The layout refreshes immediately, so a piece whose top crosses the ceiling surfaces as a height_bounds error. Moving the piece later keeps its height. Returns the item with its updated position, refreshed pricing (newTotal, budget, remaining, overBudget), and current layout validity and issues. Unknown instances fail with item_not_found.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"instanceId":{"type":"string","description":"Instance id of the placed item to act on, e.g. \"existing-sofa\" or \"aria-55-oled-tv-1\"."},"y":{"type":"number","description":"Height of the piece base above the floor in meters, 0 or greater (0 = on the floor). The piece top must stay below the ceiling.","minimum":0}},"required":["instanceId","y"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_product","kind":"act","impl":"imperative","description":"Remove a placed item from the room through the same store action as the UI. Locked items cannot be removed (item_locked). Destructive: the item is permanently gone from the current design. Returns the removed item as it was, refreshed pricing (newTotal, budget, remaining, overBudget), and current layout validity and issues. Unknown instances fail with item_not_found.","annotations":{"readOnlyHint":false,"untrustedContentHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{"instanceId":{"type":"string","description":"Instance id of the placed item to act on, e.g. \"existing-sofa\" or \"drift-oak-coffee-table-1\"."}},"required":["instanceId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_item_locked","kind":"act","impl":"imperative","description":"Lock or unlock a placed item through the same store action as the UI. Locked items cannot be removed or replaced but can still be moved and rotated; setting the current value is a no-op success. Returns the item with its updated lock state, refreshed pricing (newTotal, budget, remaining, overBudget), and current layout validity and issues.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"instanceId":{"type":"string","description":"Instance id of the placed item to act on, e.g. \"existing-sofa\" or \"drift-oak-coffee-table-1\"."},"locked":{"type":"boolean","description":"True locks the item (cannot be removed or replaced); false unlocks it."}},"required":["instanceId","locked"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_item_source","kind":"act","impl":"imperative","description":"Re-tag a placed item’s ownership through the same store action as the UI: source \"existing\" marks it as already owned (never counted toward the budget), source \"marketplace\" marks it as a new purchase (counted). Locked items may be re-tagged (the lock only guards removal and replacement); setting the current source is a no-op success. Budget pricing and validation refresh in the same write. Returns the item with its source, refreshed pricing (newTotal, budget, remaining, overBudget), and current layout validity and issues. Unknown instances fail with item_not_found.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"instanceId":{"type":"string","description":"Instance id of the placed item to act on, e.g. \"existing-sofa\" or \"drift-oak-coffee-table-1\"."},"source":{"type":"string","description":"\"existing\" = already owned (never counted toward the budget); \"marketplace\" = new purchase (counted).","enum":["existing","marketplace"]}},"required":["instanceId","source"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_budget","kind":"act","impl":"imperative","description":"Set the design budget in USD through the same store action as the UI; only marketplace items count against it. Pricing and validation refresh immediately, so a budget below the current marketplace total surfaces a budget_exceeded error. Returns the status (budget_updated, or unchanged for a no-op), the new budget, refreshed pricing (newTotal, remaining, overBudget), and current layout validity and issues.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"budget":{"type":"number","description":"New design budget in USD; only marketplace items count against it.","minimum":0}},"required":["budget"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"set_room_appearance","kind":"act","impl":"imperative","description":"Style the room through the same store action as the UI: either supply all three finish ids (wallFinishId, floorFinishId, wallpaperId) or use preset \"default\" to restore the defaults (gallery-white walls, natural-oak floor, no wallpaper). Visual only: pricing, layout, and validation are never affected. Returns the resolved appearance and current layout validity and issues.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"wallFinishId":{"type":"string","description":"Wall finish id; one of: gallery-white, warm-sand, soft-sage, clay-plaster.","enum":["gallery-white","warm-sand","soft-sage","clay-plaster"]},"floorFinishId":{"type":"string","description":"Floor finish id; one of: natural-oak, white-oak, walnut, slate-tile.","enum":["natural-oak","white-oak","walnut","slate-tile"]},"wallpaperId":{"type":"string","description":"Wallpaper id; one of: none, linen-stripe, botanical-line, arched-geo.","enum":["none","linen-stripe","botanical-line","arched-geo"]},"preset":{"type":"string","description":"Reset to the default styling.","enum":["default"]}},"oneOf":[{"type":"object","required":["wallFinishId","floorFinishId","wallpaperId"],"properties":{"wallFinishId":{"type":"string"},"floorFinishId":{"type":"string"},"wallpaperId":{"type":"string"}},"additionalProperties":false},{"type":"object","required":["preset"],"properties":{"preset":{"type":"string"}},"additionalProperties":false}],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"resize_room","kind":"act","impl":"imperative","description":"Resize the room to real measured dimensions: width, depth, and height in meters (supported ranges: see get_room_state room.resizeLimits). Openings stay on their walls and placement zones rebuild with the room; an opening whose wall became too short is removed and reported. Furniture is never moved - pieces left outside the new walls become out-of-bounds layout errors. Returns the new dimensions, floor area in m2, removed opening ids, pricing, and layout validity.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"width":{"type":"number","description":"Room width along x in meters (2-10)."},"depth":{"type":"number","description":"Room depth along z in meters (2-10)."},"height":{"type":"number","description":"Wall height in meters (2.4-4)."}},"required":["width","depth","height"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"move_opening","kind":"act","impl":"imperative","description":"Move a door or window through the same store action as the UI: alongCenter is the opening’s center along its current wall in room coordinates (x for north/south walls, z for east/west walls); pass wall to relocate the opening onto a different wall (its real size is preserved and the footprint re-orients). Centers are clamped to the wall and moves that would collide with another opening on the target wall fail with opening_overlap; unknown ids fail with opening_not_found and unusable walls or non-finite centers with invalid_opening_position. Clearance validation refreshes immediately. Returns the opening (id, kind, wall, alongCenterM, alongWidthM, heightM, sillM, footprint) and current layout validity and issues.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"openingId":{"type":"string","description":"Opening id, e.g. \"entry-door\", \"east-window\", \"balcony-door\", or \"opening-1\" for added ones."},"alongCenter":{"type":"number","description":"New along-wall center in meters: x for north/south walls, z for east/west walls. Clamped to the wall."},"wall":{"type":"string","description":"Optional target wall to relocate the opening onto; omit to move along the current wall.","enum":["north","south","east","west"]}},"required":["openingId","alongCenter"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_opening","kind":"act","impl":"imperative","description":"Add a standard door (0.9 m wide, 2.1 m high) or window (1.6 m wide, 1.4 m high at a 0.9 m sill) to any wall through the same store action as the UI. Without center, the opening lands in the first free span of the wall; an explicit center is clamped to the wall. Heights are capped below the ceiling automatically. Failures: duplicate_opening_id for taken ids (ids are minted for you), opening_overlap when another opening already occupies the spot, invalid_opening_position when the wall is too short or fully occupied. Clearance validation refreshes immediately. Returns the added opening (id, kind, wall, alongCenterM, alongWidthM, heightM, sillM, footprint) and current layout validity and issues.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"kind":{"type":"string","description":"What to add: \"door\" (0.9 m wide, 2.1 m high) or \"window\" (1.6 m wide, sill 0.9 m).","enum":["door","window"]},"wall":{"type":"string","description":"Wall to cut the opening into.","enum":["north","south","east","west"]},"center":{"type":"number","description":"Optional along-wall center in meters (x for north/south walls, z for east/west). Defaults to the first free span."}},"required":["kind","wall"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_opening","kind":"act","impl":"imperative","description":"Remove a door or window from the room through the same store action as the UI (seeded openings included). Destructive: the opening is permanently gone from the current design; clearance validation refreshes immediately, so furniture that used to block it clears. Unknown ids fail with opening_not_found. Returns the removed opening (id, kind, wall, alongCenterM, alongWidthM, heightM, sillM, footprint) and current layout validity and issues.","annotations":{"readOnlyHint":false,"untrustedContentHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{"openingId":{"type":"string","description":"Opening id, e.g. \"entry-door\", \"east-window\", \"balcony-door\", or \"opening-1\" for added ones."}},"required":["openingId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"resize_opening","kind":"act","impl":"imperative","description":"Resize a door or window through the same store action as the UI. alongSize is the along-wall width in meters, height is the opening height, and sillHeight (windows only) is how high the opening’s bottom edge sits above the floor — the window’s vertical position. At least one field is required; doors must keep sillHeight 0 (they sit on the floor). Feasible ranges are wall- and ceiling-dependent: out-of-range values fail with invalid_opening_size (details: field, min, max), widening into another opening on the same wall fails with opening_overlap, unknown ids with opening_not_found. The opening keeps its center. Returns the resized opening (id, kind, wall, alongCenterM, alongWidthM, heightM, sillM, footprint) and refreshed layout validity and issues.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"openingId":{"type":"string","description":"Opening id, e.g. \"entry-door\", \"east-window\", \"balcony-door\", or \"opening-1\" for added ones."},"alongSize":{"type":"number","description":"New along-wall width in meters (x for north/south walls, z for east/west).","minimum":0},"height":{"type":"number","description":"New opening height in meters; the top stays below the ceiling.","minimum":0},"sillHeight":{"type":"number","description":"Windows only: how high the bottom edge sits above the floor (the window vertical position). Doors keep 0.","minimum":0}},"required":["openingId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"replace_product","kind":"act","impl":"imperative","description":"Swap the product backing a placed item through the same store action as the UI. The replacement must exist, be in stock, and match the item’s category; locked items cannot be replaced. The item keeps its instance id, position, rotation, and source. Destructive: the previous product is dropped from the item. Returns the replaced item, the price savings (negative when pricier), refreshed pricing, and current layout validity and issues.","annotations":{"readOnlyHint":false,"untrustedContentHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{"instanceId":{"type":"string","description":"Instance id of the placed item to act on, e.g. \"existing-sofa\" or \"drift-oak-coffee-table-1\"."},"replacementProductId":{"type":"string","description":"Replacement catalog product id; must exist, be in stock, and match the item’s category."}},"required":["instanceId","replacementProductId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"save_design","kind":"act","impl":"imperative","description":"Capture the current design (room, placed items with their color variants, budget, room appearance) as a saved snapshot with the given name through the same store action as the UI; saved designs can be restored later with load_design. The live design is unchanged. Returns the snapshot metadata: id, name, creation and update timestamps, budget, item count, marketplace total and room appearance at save time, and the number of designs saved this session.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Human-readable name for the saved design snapshot."},"thumbnailGradient":{"type":"string","description":"Optional CSS gradient for the snapshot thumbnail, e.g. \"linear-gradient(135deg, #E6DFD2, #8FA3A0)\"."}},"required":["name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"load_design","kind":"act","impl":"imperative","description":"Restore a design saved earlier this session (see get_saved_designs) through the same store action as the UI, replacing the current room, placed items (with their color variants), budget, and room appearance. Destructive: the current unsaved design is discarded. Returns the design id and name, restored item count, budget, appearance, refreshed marketplace total and remaining, and current layout validity and issues. Unknown ids fail with design_not_found.","annotations":{"readOnlyHint":false,"untrustedContentHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{"designId":{"type":"string","description":"Id of a design saved this session (see get_saved_designs), e.g. \"snapshot-1\"."}},"required":["designId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"new_project","kind":"act","impl":"imperative","description":"Start a brand-new empty project through the same store action as the UI: every placed item, door, and window is removed (session uploads too), the budget and room finishes reset to their defaults, and the room shell keeps its current measured dimensions so the agent or user can enter the real room size next. Saved designs and the cart are kept. Destructive: the current arrangement is discarded. Returns the new empty state (dimensions, opening count 0, item count 0, budget) and refreshed layout validity and issues.","annotations":{"readOnlyHint":false,"untrustedContentHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_to_cart","kind":"act","impl":"imperative","description":"Add placed marketplace items to the shopping cart through the same store action as the UI, one line per instance at the current catalog price. Any unknown instance, pre-existing (non-marketplace) item, instance already in the cart, or missing product rejects the whole request with per-instance reasons and leaves the cart untouched. Returns cart status, each line (id, product, quantity, unit price, instance id), the cart total, and how many lines were added.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"instanceIds":{"type":"array","items":{"type":"string"},"description":"Placed marketplace instance ids to add; at least one; duplicates within the request collapse."}},"required":["instanceIds"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_cart_item","kind":"act","impl":"imperative","description":"Remove the cart line for one placed instance through the same store action as the UI. Only the cart changes: the furniture stays in the room and can be re-added while it remains a marketplace piece. Useful when a shopper wants to check out only a handful of the room items. Returns the updated cart (status, itemCount, total, lines) and how many lines remain. Unknown instance ids fail with cart_item_not_found; checked-out carts fail with cart_checked_out.","annotations":{"readOnlyHint":false,"untrustedContentHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{"instanceId":{"type":"string","description":"Placed instance id whose cart line should be removed, e.g. \"aria-55-oled-tv-1\"."}},"required":["instanceId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Commerce","favicon":"/favicons/agenticroom.setyongr.chatgpt.site.png","apiSurface":"spec","toolCount":31}}