{"ok":true,"site":{"host":"replan-phi.vercel.app","url":"https://replan-phi.vercel.app/","type":"live","desc":"Replan","tools":[{"name":"ping","kind":"act","impl":"imperative","description":"Connectivity smoke test for this page's agent tool channel. Takes no required arguments (optionally pass a short echo string) and returns { ok, pong, echo, received_at_utc }.","title":"Ping (WebMCP smoke test)","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"echo":{"type":"string","description":"Optional text (max 200 chars) echoed back in the response."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"search_flights","kind":"answer","impl":"imperative","description":"Search rebooking flights from Lima (LIM) after the cancellation. Required: destination — \"MIA\" (Miami) or \"FLL\" (Fort Lauderdale, ground-reachable). Optional filters, omit any to leave it unconstrained: arrive_before (ISO 8601 with UTC offset), max_price (USD), max_layover_hours. Returns cheapest flights first; empty results are valid — loosen a filter or try the other airport. Follow with hold_reservation(flight_id) to hold a result.","title":"Search rebooking flights","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"destination":{"type":"string","enum":["MIA","FLL"],"description":"Destination airport code: MIA or FLL."},"arrive_before":{"type":"string","description":"Arrive at or before this instant. ISO 8601 with UTC offset (Lima -05:00, Miami -04:00)."},"max_price":{"type":"number","description":"Maximum total price in USD (> 0)."},"max_layover_hours":{"type":"number","description":"Maximum total layover in hours (>= 0)."}},"required":["destination"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"hold_reservation","kind":"transact","impl":"imperative","description":"Place a 15-minute hold on a flight found via search_flights, keeping the seat while the traveler decides. Input: { flight_id } (e.g. \"FL-001\"). Returns the hold’s expiry time. One active hold per flight: holding the same flight twice while the first hold is alive fails — either wait for it to expire or book with confirm_booking. Holds are simulated (no backend): they expire after 15 minutes wall-clock and do not survive a page reload.","title":"Hold a flight","inputSchema":{"type":"object","properties":{"flight_id":{"type":"string","description":"Flight id from search_flights results, e.g. \"FL-011\"."}},"required":["flight_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_constraints","kind":"act","impl":"imperative","description":"Change the traveler’s rebooking constraints and re-search immediately — returns new results, not just an acknowledgment. Provide any subset: max_price (USD), max_layover_hours, preferred_time (ISO 8601 with UTC offset; reorders results by departure closest to that time; null clears it back to cheapest-first). Unmentioned constraints persist; {} re-runs with the current set. Returns { ok, constraints (complete effective set), count, results }. The page’s constraints and results update live.","title":"Update traveler constraints and re-search","inputSchema":{"type":"object","properties":{"max_price":{"type":"number","description":"New maximum total price in USD (> 0). Optional."},"max_layover_hours":{"type":"number","description":"New maximum total layover in hours (>= 0). Optional."},"preferred_time":{"type":"string","description":"Preferred departure instant, ISO 8601 with UTC offset (e.g. 2026-09-12T22:00:00-05:00). Reorders results by departure closeness."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"confirm_booking","kind":"transact","impl":"imperative","description":"Book a flight that has an active hold from hold_reservation — this commits the rebooking and returns the final itinerary with a confirmation reference. Input: { flight_id }. No active hold → error with how to get one; expired hold → error saying when it lapsed. Calling again on an already-booked flight is safe: returns the same confirmation (idempotent). The page switches to the reservation-confirmed view.","title":"Confirm a held flight (books it)","inputSchema":{"type":"object","properties":{"flight_id":{"type":"string","description":"Flight id with an active hold, e.g. \"FL-003\"."}},"required":["flight_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"search_hotels","kind":"answer","impl":"imperative","description":"Search hotels for the recovery stay. Required: city (\"Miami\" or \"Fort Lauderdale\"). Optional: near_airport (\"MIA\"/\"FLL\") and check_in + check_out (ISO 8601 with offset, whole nights) to price the stay and skip sold-out hotels. Cheapest first; empty results are valid.","title":"Search hotels","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"city":{"type":"string","enum":["Miami","Fort Lauderdale"],"description":"City: \"Miami\" or \"Fort Lauderdale\"."},"check_in":{"type":"string","description":"Stay start. ISO 8601 with UTC offset (Miami -04:00). Provide together with check_out; stays are whole 24 h nights."},"check_out":{"type":"string","description":"Stay end, after check_in by whole 24 h nights. ISO 8601 with UTC offset."},"near_airport":{"type":"string","enum":["MIA","FLL"],"description":"Nearest airport: \"MIA\" or \"FLL\" — the same airports the flight tools serve; independent of city."}},"required":["city"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_hotel_reservation","kind":"transact","impl":"imperative","description":"Shift the check-in of the traveler’s existing hotel reservation. Input: { reservation_id, new_check_in }. Check-out moves to keep the same nights; price unchanged. Must not precede the confirmed flight’s arrival. Re-sending the current date is safe (idempotent).","title":"Update hotel reservation dates","inputSchema":{"type":"object","properties":{"reservation_id":{"type":"string","description":"Reservation id, e.g. \"HTL-R001\"."},"new_check_in":{"type":"string","description":"New stay start. ISO 8601 with UTC offset (Miami -04:00). Must not precede the confirmed flight’s arrival date."}},"required":["reservation_id","new_check_in"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"book_ground_transport","kind":"transact","impl":"imperative","description":"Book the airport-to-hotel ground leg once a flight is confirmed. Input: { type, pickup_time }. type: \"taxi\", \"shuttle\" (shared, cheapest), or \"rideshare\". Pickup must be 15 min to 8 h after the flight lands; route and price derive from the arrival airport and hotel zone. Re-booking replaces. Simulated.","title":"Book ground transport","inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["taxi","shuttle","rideshare"],"description":"Vehicle: \"taxi\", \"shuttle\" (shared, cheapest), or \"rideshare\"."},"pickup_time":{"type":"string","description":"Pickup at the arrival airport. ISO 8601 with UTC offset. Must be 15 min to 8 h after the confirmed flight lands."}},"required":["type","pickup_time"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"notify_contact","kind":"transact","impl":"imperative","description":"Compose a heads-up about the new arrival for someone meeting the traveler. Input: { contact, new_arrival_time }. contact: { name?, phone? | email?, relationship? } — phone (sms) or email required. SIMULATED: nothing is transmitted; the response shows what would have been sent.","title":"Notify a contact (simulated)","inputSchema":{"type":"object","properties":{"contact":{"type":"object","description":"Recipient: { name?, phone? | email?, relationship? } — provide a phone (sms) or an email.","properties":{"name":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string"},"relationship":{"type":"string"}},"additionalProperties":false},"new_arrival_time":{"type":"string","description":"The arrival time to announce. ISO 8601 with UTC offset."}},"required":["contact","new_arrival_time"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"calculate_total_cost","kind":"act","impl":"imperative","description":"Running total across everything booked — flight, hotel, ground transport — checked against the budget update_constraints last set. Input: { items? } for a subset; omit for everything booked. Returns a per-item breakdown, the total, and budget fit.","title":"Trip running total","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string","enum":["flight","hotel","transport"]},"description":"Subset to total: \"flight\", \"hotel\", \"transport\". Omit for all booked items."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"generate_itinerary_summary","kind":"act","impl":"imperative","description":"One consolidated receipt of the recovery: flight, hotel, transport, notifications, and the total vs budget — plus what is still missing and which tool books it. Stale legs are flagged. Safe any time: partial trips return status \"partial\", never an error. No parameters.","title":"Final itinerary receipt","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"search_flights_semantic","kind":"answer","impl":"imperative","description":"Natural-language flight search over the same rebooking options as search_flights: describe what you want (\"cheapest that lands early\", \"shortest layover\", \"red-eye is fine\") and get matches ranked by semantic similarity via a live vector index. Falls back to errors-as-data if the index is unreachable.","title":"Semantic flight search","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Free text (max 200 chars) describing the flight you want — price, timing, layovers, vibe. Not a structured filter."}},"required":["query"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Travel & Events","favicon":"/favicons/replan-phi.vercel.app.svg","apiSurface":"spec","toolCount":12}}