{"ok":true,"site":{"host":"waymark-alpha.netlify.app","url":"https://waymark-alpha.netlify.app/","type":"live","desc":"Pin checkpoints on a race route, set their cutoffs, export an extended GPX.","tools":[{"name":"load_gpx","kind":"act","impl":"imperative","description":"Opens a race's GPX in the editor from its text, in place of the open route, and lists its checkpoints. The page cannot fetch links: fetch the file and pass its text. The person can also open one with the Open GPX button. The file's existing waypoints become the checkpoints.","title":"Open a GPX","annotations":{"consequentialHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"gpx":{"type":"string","description":"The whole GPX file, as text."},"file_name":{"type":"string","description":"The name to show and to base the export's name on."},"discard_unsaved":{"type":"boolean","description":"Drop the open route's unsaved edits. Only with the person's agreement."}},"required":["gpx"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_checkpoints","kind":"answer","impl":"imperative","description":"The checkpoints of the open route, in route order, with the route's length and the race's time zone. Read this first: ids, distances and the clock come from here.","title":"List checkpoints","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"review_plan","kind":"act","impl":"imperative","description":"Checks the checkpoints as a race plan before export: what is wrong or likely forgotten (no Arrival, a cutoff before the previous one, a time barrier without a cutoff), and per checkpoint the estimated passage at the set pace, the cutoff and the margin. Call it when done editing; `ready` says whether to hand over to the person.","title":"Review the plan","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_checkpoint","kind":"act","impl":"imperative","description":"Adds a checkpoint on the route, snapped to the track, by distance or by coordinates. Coordinates are refused where the route passes more than once: give the distance.","title":"Add a checkpoint","inputSchema":{"type":"object","properties":{"distance_m":{"type":"number","minimum":0,"description":"Where along the route, in metres from the start. Prefer this to coordinates."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"name":{"type":"string","description":"The checkpoint's name, as runners will read it."},"type_name":{"type":["string","null"],"enum":["Start","TimeBarrier","LifeBase","Arrival",null],"description":"Start, TimeBarrier (a cutoff), LifeBase (an aid station with a long stop), Arrival, or null for a landmark that is not a checkpoint."},"cutoff":{"type":["string","null"],"description":"The cutoff on the race's clock, \"YYYY-MM-DDTHH:mm\" (see timeZone in list_checkpoints), or with a zone (Z, +02:00). null clears it."},"stop_s":{"type":["integer","null"],"minimum":0,"description":"The planned stop at this checkpoint, in seconds."},"description":{"type":["string","null"],"description":"A note for the runners."}},"oneOf":[{"required":["distance_m"]},{"required":["latitude","longitude"]}]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_checkpoint","kind":"act","impl":"imperative","description":"Changes a checkpoint's fields; a distance or coordinates also move it along the route.","title":"Update a checkpoint","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The checkpoint's id, from list_checkpoints."},"distance_m":{"type":"number","minimum":0,"description":"Where along the route, in metres from the start. Prefer this to coordinates."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"name":{"type":"string","description":"The checkpoint's name, as runners will read it."},"type_name":{"type":["string","null"],"enum":["Start","TimeBarrier","LifeBase","Arrival",null],"description":"Start, TimeBarrier (a cutoff), LifeBase (an aid station with a long stop), Arrival, or null for a landmark that is not a checkpoint."},"cutoff":{"type":["string","null"],"description":"The cutoff on the race's clock, \"YYYY-MM-DDTHH:mm\" (see timeZone in list_checkpoints), or with a zone (Z, +02:00). null clears it."},"stop_s":{"type":["integer","null"],"minimum":0,"description":"The planned stop at this checkpoint, in seconds."},"description":{"type":["string","null"],"description":"A note for the runners."}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"remove_checkpoint","kind":"act","impl":"imperative","description":"Removes a checkpoint from the route.","title":"Remove a checkpoint","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The checkpoint's id, from list_checkpoints."}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"download_gpx","kind":"act","impl":"imperative","description":"Asks the browser to save the edited GPX (the director's file with the checkpoints as its waypoints) to the person's downloads, named after the original with -edited. The file goes to their disk, not back to you; the browser may ask them first or block it, so ask the person whether it arrived. Call review_plan first: a plan it does not call ready is refused unless force is true, which only the person can ask for.","title":"Download the edited GPX","annotations":{"consequentialHint":true},"inputSchema":{"type":"object","properties":{"force":{"type":"boolean","description":"Download although review_plan reports problems. Only if the person asks."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"favicon":"/favicons/waymark-alpha.netlify.app.svg","apiSurface":"spec","category":"Travel & Events","toolCount":7}}