{"ok":true,"site":{"host":"hemloop.app","url":"https://hemloop.app/","type":"live","desc":"A two-sided, agent-native E-commerce loop: shoppers share demand without an identifier, merchants see the gap, and every promotion traces back to human-locked facts.","tools":[{"name":"get_wardrobe","kind":"answer","impl":"imperative","description":"Read the shopper's wardrobe as compact rows (id, category, brand, size, colour, for), optional category filter, at most 12 rows plus the total. Rows stay on this page.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"category":{"type":"string","enum":["hoodie","tee","denim","jacket","footwear","accessory"]}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/closet"]},{"name":"get_my_sizes","kind":"answer","impl":"imperative","description":"Sizes the shopper owns, optionally filtered by brand.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"brand":{"type":"string"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/closet"]},{"name":"find_gaps","kind":"answer","impl":"imperative","description":"Categories missing or thin, plus categories whose oldest garment is past its replacement life (a `due` block: report it with report_demand_gap kind 'replace'). Carries only the date, months elapsed and size.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/closet"]},{"name":"check_fit","kind":"answer","impl":"imperative","description":"Fit advice for a store product handle, based on sizes the shopper already owns. Read-only; uses the store's public catalog.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"handle":{"type":"string"}},"required":["handle"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/closet"]},{"name":"get_preferences","kind":"answer","impl":"imperative","description":"Read the shopper's stated preferences: fit, colour family, materials to avoid, price ceiling, liked brands. Stays on this page unless the sharing level lets a field travel.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/closet"]},{"name":"add_garment","kind":"act","impl":"imperative","description":"Add a garment the shopper owns to the private wardrobe.","inputSchema":{"type":"object","properties":{"category":{"type":"string","enum":["hoodie","tee","denim","jacket","footwear","accessory"]},"brand":{"type":"string"},"size":{"type":"string"},"colour":{"type":"string"}},"required":["category","brand","size","colour"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/closet"]},{"name":"report_demand_gap","kind":"act","impl":"imperative","description":"Send one data-minimized demand signal. The shopper must press Approve next request on the page first; one press releases one signal. Use kind 'replace' for a `due` gap. The sharing level sets which fields travel (0 blocks everything). Never a shopper id or wardrobe rows. Returns the exact payload sent.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["gap","fit","want","replace"]},"category":{"type":"string","enum":["hoodie","tee","denim","jacket","footwear","accessory"]},"size":{"type":"string"},"handle":{"type":"string"},"occasion":{"type":"string","enum":["everyday","season","gift","event"]}},"required":["category"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/closet"]},{"name":"import_receipt","kind":"act","impl":"imperative","description":"Import pasted receipt or order-email text (no OCR, no network). Adds each item to the purchase log and recognised items to the wardrobe. Nothing is sent to a merchant.","inputSchema":{"type":"object","properties":{"text":{"type":"string","maxLength":4000}},"required":["text"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/closet"]},{"name":"get_offers","kind":"answer","impl":"imperative","description":"Read approved personal offers for requests this closet sent: size, price, code, validity, purchase link. Read-only; the shopper decides Bought or Passed on the page, no tool can buy.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/closet"]},{"name":"get_campaign_state","kind":"answer","impl":"imperative","description":"Read the campaign: facts (price, discount, code, dates, disclaimer), their human lock state, brief, scenes, and format. When facts are locked, agents cannot change them — write copy that matches.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/studio"]},{"name":"set_brief","kind":"act","impl":"imperative","description":"Set the creative brief (tone, pacing, angle). Free-form; not rendered copy.","inputSchema":{"type":"object","properties":{"brief":{"type":"string"}},"required":["brief"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/studio"]},{"name":"add_scene","kind":"act","impl":"imperative","description":"Append a scene. heading/body are rendered copy, claim-validated against locked facts before anything is applied.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["hero","product","offer","cta"]},"heading":{"type":"string","maxLength":200},"body":{"type":"string","maxLength":400},"durationSec":{"type":"number","minimum":0.5,"maximum":30}},"required":["kind","heading","body","durationSec"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/studio"]},{"name":"update_scene","kind":"act","impl":"imperative","description":"Patch a scene's copy, kind, or duration. The patched result is claim-validated before it is applied.","inputSchema":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["hero","product","offer","cta"]},"heading":{"type":"string","maxLength":200},"body":{"type":"string","maxLength":400},"durationSec":{"type":"number","minimum":0.5,"maximum":30}},"required":["id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/studio"]},{"name":"reorder_scenes","kind":"act","impl":"imperative","description":"Reorder scenes. Pass every current scene id exactly once.","inputSchema":{"type":"object","properties":{"orderedIds":{"type":"array","items":{"type":"string"}}},"required":["orderedIds"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/studio"]},{"name":"seek_preview","kind":"act","impl":"imperative","description":"Seek the live preview to a time (seconds). Deterministic, same t, same frame.","inputSchema":{"type":"object","properties":{"tSec":{"type":"number","minimum":0}},"required":["tSec"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/studio"]},{"name":"validate_claims","kind":"act","impl":"imperative","description":"Dry-run the claim validator over a piece of copy, or over the whole campaign when no text is given.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"text":{"type":"string"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/studio"]},{"name":"export_composition","kind":"act","impl":"imperative","description":"Export the campaign as a standalone HyperFrames HTML composition; the page receives the download and the result carries size and scene count. Fails while any claim violation remains.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/studio"]},{"name":"get_offer","kind":"answer","impl":"imperative","description":"Read the locked offer as data a shopping agent can act on: product, prices, promo code, validity dates, disclaimer, purchase link, sizes in stock. Pass requestId for the approved personal offer on one request.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"requestId":{"type":"string"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/studio"]},{"name":"import_product","kind":"act","impl":"imperative","description":"Import product facts by handle from the connected demo storefront into the unlocked fact set. The merchant must review and lock afterward; import is refused while facts are locked.","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"handle":{"type":"string"}},"required":["handle"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/studio"]},{"name":"get_demand","kind":"answer","impl":"imperative","description":"Consented demand grouped by category and size, with request ids for propose_offer and a verdict per group (can-offer, size-not-in-stock, category-mismatch). Counts are exact; at most 3 ids per group, so read total, groups and omitted. No shopper identifier travels.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/studio"]},{"name":"propose_offer","kind":"act","impl":"imperative","description":"Propose a personal offer for one request inside the locked offer rules (cost, margin floor, max discount). Staged only; a human approves it before the shopper sees it. Returns the proposal and its margin check.","inputSchema":{"type":"object","properties":{"requestId":{"type":"string"}},"required":["requestId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/studio"]}],"category":"Commerce","favicon":"/favicons/hemloop.app.svg","apiSurface":"spec","toolCount":21}}