{"ok":true,"site":{"host":"sendero-alpha.vercel.app","url":"https://sendero-alpha.vercel.app/app/new","type":"live","desc":"Prepare, validate, and save an itinerary generated with ChatGPT and Sendero.","tools":[{"name":"get_itinerary_planning_protocol","kind":"answer","impl":"imperative","description":"Load Sendero's current versioned instructions, prepared brief, and canonical JSON schema for generating a new itinerary. Use this before researching or constructing the itinerary. Extract the facts already supplied in the user's natural language into brief; never ask the user to write field syntax. Multi-city requests may use destination as an ordered list or destinations as an ordered array, and Sendero will normalize them. The page will reflect those facts and move to the automatic generation step when the brief is ready, without requiring form entry or prompt copying. When this page-scoped tool is available for the open Sendero creation page, prefer this page workflow over remote Sendero planning tools so the page can show progress, review, and authoritative save state. Sendero returns instructions but does not call a model.","annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"brief":{"type":"object","description":"Trip facts extracted from the user's natural-language request. The user never needs to know or write these field names. Omit the brief only to use fields already entered on the Sendero page.","properties":{"locale":{"type":"string","description":"Language inferred from the user's request."},"destination":{"oneOf":[{"type":"string","minLength":1,"description":"A city, region, or country in the traveller's own words."},{"type":"object","properties":{"name":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"country":{"type":"string","minLength":1},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"notes":{"type":"string"}},"additionalProperties":true},{"type":"array","minItems":1,"items":{"oneOf":[{"type":"string","minLength":1,"description":"A city, region, or country in the traveller's own words."},{"type":"object","properties":{"name":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"country":{"type":"string","minLength":1},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"notes":{"type":"string"}},"additionalProperties":true}]}}],"description":"One destination, or an ordered list when the request contains multiple cities."},"destinations":{"type":"array","minItems":1,"items":{"oneOf":[{"type":"string","minLength":1,"description":"A city, region, or country in the traveller's own words."},{"type":"object","properties":{"name":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"country":{"type":"string","minLength":1},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"notes":{"type":"string"}},"additionalProperties":true}]},"description":"Ordered destinations for a multi-city trip. Sendero normalizes them into its canonical destination label."},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"travellers":{"type":"object","properties":{"adults":{"type":"integer","minimum":1},"children":{"type":"integer","minimum":0},"seniors":{"type":"integer","minimum":0}},"additionalProperties":true},"transport":{"type":"object","properties":{"modes":{"type":"array","items":{"type":"string"}},"hasLicense":{"type":"boolean"},"wantsCar":{"type":"boolean"}},"additionalProperties":true},"mustDo":{"type":"array","items":{"type":"string"}},"notes":{"type":"string"}},"additionalProperties":true}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/app/new","pages":["/app/new"]},{"name":"validate_and_stage_itinerary","kind":"act","impl":"imperative","description":"Validate one complete generated itinerary against the current Sendero protocol and place a local draft in this browser's persistent Sendero cache. This works without a Sendero account and is the authoritative review handoff for the open page. It does not save a canonical trip. Correct blocking errors before continuing and review all warnings.","annotations":{"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"brief":{"type":"object","description":"Trip facts extracted from the user's natural-language request. The user never needs to know or write these field names. Omit the brief only to use fields already entered on the Sendero page.","properties":{"locale":{"type":"string","description":"Language inferred from the user's request."},"destination":{"oneOf":[{"type":"string","minLength":1,"description":"A city, region, or country in the traveller's own words."},{"type":"object","properties":{"name":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"country":{"type":"string","minLength":1},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"notes":{"type":"string"}},"additionalProperties":true},{"type":"array","minItems":1,"items":{"oneOf":[{"type":"string","minLength":1,"description":"A city, region, or country in the traveller's own words."},{"type":"object","properties":{"name":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"country":{"type":"string","minLength":1},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"notes":{"type":"string"}},"additionalProperties":true}]}}],"description":"One destination, or an ordered list when the request contains multiple cities."},"destinations":{"type":"array","minItems":1,"items":{"oneOf":[{"type":"string","minLength":1,"description":"A city, region, or country in the traveller's own words."},{"type":"object","properties":{"name":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"country":{"type":"string","minLength":1},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"notes":{"type":"string"}},"additionalProperties":true}]},"description":"Ordered destinations for a multi-city trip. Sendero normalizes them into its canonical destination label."},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"travellers":{"type":"object","properties":{"adults":{"type":"integer","minimum":1},"children":{"type":"integer","minimum":0},"seniors":{"type":"integer","minimum":0}},"additionalProperties":true},"transport":{"type":"object","properties":{"modes":{"type":"array","items":{"type":"string"}},"hasLicense":{"type":"boolean"},"wantsCar":{"type":"boolean"}},"additionalProperties":true},"mustDo":{"type":"array","items":{"type":"string"}},"notes":{"type":"string"}},"additionalProperties":true},"itinerary":{"type":"object","description":"The complete itinerary object matching itinerarySchema returned by get_itinerary_planning_protocol.","additionalProperties":true},"protocolHash":{"type":"string","pattern":"^[a-f0-9]{64}$"},"protocolVersion":{"type":"string","pattern":"^\\d+\\.\\d+\\.\\d+$"}},"required":["itinerary","protocolHash","protocolVersion"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/app/new","pages":["/app/new"]},{"name":"get_staged_itinerary","kind":"answer","impl":"imperative","description":"Read the validated local Sendero itinerary draft currently cached by the open page and its warnings. This does not require an account and does not save or modify the canonical trip library.","annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"draftId":{"type":"string","minLength":16,"maxLength":128,"description":"A draftId returned by validate_and_stage_itinerary. Omit it to use the draft currently open on the page."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/app/new","pages":["/app/new"]},{"name":"update_itinerary_reservation_statuses","kind":"transact","impl":"imperative","description":"Update the purchase or booking tracker for one specific reservation/ticket or for a list of specific entries in the validated local Sendero draft. This requires an authenticated Sendero account; when signed out, preserve the draft and let the page offer sign-in instead of changing status. Use confirmed only when the user says they already booked or bought it; use pending when they say they have not. All requested entries are validated before the browser draft changes. This tracker never books, buys, contacts, or cancels with a provider. Use this page tool before saving; saved trips are edited from their private Sendero page.","annotations":{"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"draftId":{"type":"string","minLength":16,"maxLength":128,"description":"A draftId returned by validate_and_stage_itinerary. Omit it to use the draft currently open on the page."},"updates":{"type":"array","minItems":1,"maxItems":100,"description":"One or more exact reservation or ticket entries to update. Use confirmed for 'already booked/bought' and pending for 'not booked/bought yet'.","items":{"type":"object","properties":{"activityId":{"type":"string","minLength":1,"maxLength":160,"description":"The exact activity ID in the staged itinerary."},"dayDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"The activity date in YYYY-MM-DD format."},"status":{"type":"string","enum":["pending","confirmed"],"description":"confirmed means the user says it is already booked or bought; pending means it is not booked or bought yet."}},"required":["activityId","dayDate","status"],"additionalProperties":false}}},"required":["updates"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/app/new","pages":["/app/new"]},{"name":"save_staged_itinerary","kind":"act","impl":"imperative","description":"Explicitly save one validated local draft from the open creation page as an authoritative Sendero trip. This requires a Sendero account; when signed out, preserve the browser draft and let the page offer sign-in or account creation. Call only when the user asked to save. Report success only from the returned trip, webId, and version.","annotations":{"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"draftId":{"type":"string","minLength":16,"maxLength":128,"description":"A draftId returned by validate_and_stage_itinerary. Omit it to use the draft currently open on the page."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/app/new","pages":["/app/new"]},{"name":"share_saved_itinerary_by_link","kind":"act","impl":"imperative","description":"Enable public read-only access for the saved Sendero itinerary currently selected on this page and return its shareable URL. Anyone with the link can view it but cannot collaborate or modify it. This requires an authenticated Sendero account, an already saved itinerary, owner permission, and an explicit user request to make it public. Report success only from the returned shareUrl.","annotations":{"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"draftId":{"type":"string","minLength":16,"maxLength":128,"description":"A draftId returned by validate_and_stage_itinerary. Omit it to use the draft currently open on the page."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/app/new","pages":["/app/new"]},{"name":"invite_saved_itinerary_member","kind":"transact","impl":"imperative","description":"Invite one person by email to the saved Sendero itinerary currently selected on this page. viewer grants read-only private access; editor grants collaboration access. Sendero sends the invitation, so call this only after the user explicitly asks to invite that exact email with that role. This requires an authenticated account, an already saved itinerary, and owner permission. Report success only from the returned invitation status and delivery receipt.","annotations":{"idempotentHint":true,"openWorldHint":true},"inputSchema":{"type":"object","properties":{"draftId":{"type":"string","minLength":16,"maxLength":128,"description":"A draftId returned by validate_and_stage_itinerary. Omit it to use the draft currently open on the page."},"email":{"type":"string","format":"email","maxLength":254,"description":"Email address of the person to invite."},"role":{"type":"string","enum":["viewer","editor"],"description":"viewer can only view; editor can collaborate on the itinerary."}},"required":["email","role"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/app/new","pages":["/app/new"]},{"name":"discard_staged_itinerary","kind":"act","impl":"imperative","description":"Discard the selected local Sendero browser draft and remove its itinerary content. This works without an account and never deletes a saved trip.","annotations":{"destructiveHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"draftId":{"type":"string","minLength":16,"maxLength":128,"description":"A draftId returned by validate_and_stage_itinerary. Omit it to use the draft currently open on the page."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/app/new","pages":["/app/new"]}],"category":"Travel & Events","favicon":"/favicons/sendero-alpha.vercel.app.svg","apiSurface":"spec","toolCount":8}}