export const ACTION_DESCRIPTIONS = { fly_to_location: { description: "Fly the God's Eye View camera to a known city, geocoded country/region/city/landmark, or explicit WGS84 coordinate. Countries/cities frame the whole place; landmarks/buildings use close framing.", $position: 1, parameters: { properties: { locationId: { description: 'Known city preset ID. Use when the requested place matches one of these cities.', $position: 2, }, query: { description: 'Plain place search query, e.g. "London", "Eiffel Tower", or "Dubai Marina".', $position: 1, }, viewMode: { description: 'Optional framing intent. Usually omit this; GEV infers whole-place framing for countries/cities and close framing for landmarks.', $position: 2, }, rangeM: { description: 'Optional camera range from the target in meters. Omit it for automatic whole-country/whole-city or close-landmark framing; provide it only when the user explicitly requests a numeric height or distance.', $position: 3, }, waitForArrival: { description: 'Set true when a later tool depends on the destination viewport. The result then waits for the camera flight and returns arrived=true; cancellation returns ok=false.', $position: 1, }, }, }, }, select_nearest_aircraft: { description: 'Atomically fly to a place, wait for arrival, enable and load Flights or Military Flights in that viewport, exclude on-ground records, and select/follow the nearest airborne aircraft. Healthy fallback feeds remain usable and are reported in the result. This does not open Contacts or Cockpit.', $position: 1, parameters: { properties: { layerId: { description: 'Aircraft layer to enable and search. Use flights unless the user explicitly asks for military aircraft.', $position: 2, }, locationId: { description: 'Known city preset ID when the place matches one of these cities.', $position: 2, }, locationQuery: { description: 'Free-form destination when no locationId matches.', $position: 2, }, }, }, }, adjust_camera_zoom: { description: 'Move the current Cesium camera closer to or farther from what it is presently looking at. Use for relative zoom requests without changing location.', $position: 1, parameters: { properties: { amount: { description: 'Use little for phrases like "a bit" or "a little", medium for ordinary zoom requests, and lot for "way out/in".', $position: 2, }, }, }, }, zoom_to_globe: { description: 'Pull the camera out to an ABSOLUTE full-Earth globe view (~18,000 km altitude, the whole planet in frame), keeping the current region centered. Use for "globe view", "whole earth", "see the planet", "zoom all the way out". Never use adjust_camera_zoom for these — its relative steps cannot reach the globe.', $position: 1, }, set_layer_visibility: { description: "Enable or disable one registered God's Eye View data layer.", $position: 1, parameters: { properties: { layerId: { description: 'Common-name mapping for the non-obvious ids: space mission(s) → rocket-launches; fires/wildfires/active fires → local-firms (NASA FIRMS); ships/vessels/boats → ais-live-vessels; undersea/submarine cables → telegeography-submarine-cables; datacenters → local-datacenters; dams → local-dams; bikes/bike share → bikeshare; street traffic/congestion → traffic; traffic cameras → cctv; internet radio/stations → radio; ALPR/license plate readers/Flock cameras → alpr-cameras.', $position: 1, }, }, }, }, show_data_layers_menu: { description: 'Open the data layers dropdown/menu and optionally scroll to a specific layer row without toggling it.', $position: 1, parameters: { properties: { layerId: { description: 'Optional layer row to scroll into view and highlight.', $position: 2, }, }, }, }, set_panel_open: { description: 'Open or close a GEV UI panel/dropdown.', $position: 1, }, set_context_mode: { description: 'Enter or exit the Global Context sub-mode used by Contacts and Space Missions. Use Contacts only when the user explicitly requests Contacts, and Space Missions only when explicitly requested. A request to open the parent Context panel alone uses set_panel_open and must not activate either sub-mode. Selecting an aircraft does not imply Context.', $position: 1, parameters: { properties: { mode: { description: 'Use off to exit context mode.', $position: 2, }, }, }, }, control_cockpit: { description: 'Read or control Cockpit when the user explicitly requests Cockpit: establish Contacts and enter from a selected or tracked aircraft; exit; or navigate nearby Contacts with optional filters. Selecting or viewing an aircraft alone must not enter Cockpit.', $position: 1, parameters: { properties: { action: { description: 'previous/next (or prev) navigates through nearby contacts in Cockpit context.', $position: 2, }, targetLayer: { description: 'Optional contact layer filter for next/previous (for example military for a military-only cycle).', $position: 2, }, aircraftClass: { description: 'Optional aircraft class filter (for example helicopter) when using next/previous navigation.', $position: 1, }, }, }, }, set_visual_style: { description: "Set the active God's Eye View visual filter/style.", $position: 1, }, get_entity_context: { description: 'Get current GEV scene context, including basemap/3D-tile target context, selected entity metadata if active, and entities currently visible in the camera view.', $position: 1, parameters: { properties: { scope: { description: 'Use auto by default. selected returns the clicked/selected entity; in_view returns visible entities near the screen center.', $position: 2, }, layerId: { description: 'Optional layer filter for visible entity context.', $position: 2, }, }, }, }, get_current_view_state: { description: 'Read the current camera, style, Context, Cockpit, HUD, detection, map stack, post-processing, scene-playback, tracked-entity, and layer state before choosing another action.', $position: 1, }, set_hud: { description: 'Control the intelligence HUD overlay: visibility and/or layout variant.', $position: 1, parameters: { properties: { visible: { description: 'auto restores style-driven show/hide.', $position: 2, }, }, }, }, set_detection: { description: 'Control the detection overlay: on/off, density-derived Sparse/Balanced/Dense profile, and Elastic/Weighted layer allocation.', $position: 1, parameters: { properties: { enabled: { description: 'false turns detection OFF; true restores the current density-derived profile.', $position: 1, }, densityPct: { description: 'Density snaps to 0, 25, 50, 75, or 100 and derives the active profile.', $position: 1, }, allocationStrategy: { description: 'Elastic splits evenly then lends unused slots; Weighted follows demand and semantic weight.', $position: 2, }, }, }, }, set_map_stack: { description: 'Switch the basemap/imagery stack (NOT the satellites data layer and NOT a visual style filter).', $position: 1, parameters: { properties: { stack: { description: 'photoreal = Google 3D. Use bing-aerial only when the user explicitly says "Bing aerial" — "satellite(s)" never means a basemap; only the explicit phrase "Esri" / "Esri imagery" means esri-imagery.', $position: 2, }, }, }, }, set_post_processing: { description: 'Control bloom and sharpen post-processing toggles and intensities.', $position: 1, parameters: { properties: { bloom: { properties: { intensityPct: { description: '0-200 (UI percent).', $position: 1, }, }, }, sharpen: { properties: { intensityPct: { description: '0-100 (UI percent).', $position: 1, }, }, }, }, }, }, control_scene: { description: 'Cinematic scene playback: list scenes, play one scene by name, stop, advance, or read status. Play starts a single named scene and returns immediately.', $position: 1, parameters: { properties: { sceneId: { description: 'Scene id or (partial) title for play.', $position: 1, }, }, }, }, control_cctv: { description: 'CCTV camera operations: enable/disable the layer, select a camera by name, next/prev/nearest/focus, toggle coverage wedges / projection overlay / auto-hop, "viewshed" for color-coded per-camera coverage volumes, and "adjust" for the on-camera calibration gizmo.', $position: 1, parameters: { properties: { cameraQuery: { description: 'Camera name or id for select.', $position: 1, }, enabled: { description: 'Explicit on/off for coverage/viewshed/adjust/projection/autohop; omit to toggle.', $position: 1, }, }, }, }, control_radio: { description: 'Control Internet Radio playback without moving the map. Use select whenever the request includes a station category, name, country, coordinates, or nearby place—even when the user says play. Use play only for an unqualified "turn on/start the radio" request so the current or nearest station begins. Enable only reveals the Radio layer/markers without audio. Also supports disable, resume, pause, stop, next/previous, volume, and status.', $position: 1, parameters: { properties: { action: { description: 'Use select for any request qualified by category, station, country, coordinates, or place. Use play only for an unqualified turn on/start/listen request. Use enable only when the user explicitly asks to show or enable the Radio layer or its markers without requesting audio.', $position: 2, }, volumePct: { description: 'Required for volume; sets the persistent Radio playback volume.', $position: 3, }, category: { description: 'Station category for select/next/previous. When the user requests playback with a category, action must be select, not play.', $position: 2, }, locationId: { description: 'Known nearby-city anchor for select.', $position: 2, }, locationQuery: { description: 'Place to search near, such as "Austin, Texas" or "Seattle". Selection does not fly the camera.', $position: 2, }, country: { description: 'Country code or name filter, for example US or United States.', $position: 2, }, stationQuery: { description: 'Optional station name/tag substring.', $position: 2, }, }, }, }, track_entity: { description: 'Find and follow a specific aircraft (callsign/ICAO hex), ship (name/MMSI), or satellite (name/NORAD id) on enabled layers. Camera follows the entity.', $position: 1, parameters: { properties: { query: { description: 'Callsign, ship name, satellite name, ICAO hex, MMSI, or NORAD id.', $position: 1, }, layerId: { description: 'Optional layer hint: flights | military | ais-live-vessels | satellites.', $position: 1, }, }, }, }, stop_tracking: { description: 'Stop following the tracked aircraft/satellite and clear any selected vessel.', $position: 1, }, frame_overhead: { description: 'Cinematically frame entities near the current view: pulls the camera back and angles it so nearby aircraft, ships, or satellites are visible together.', $position: 1, parameters: { properties: { radiusKm: { description: 'Search radius around the view target. Defaults: 150 aircraft, 120 ships, 3000 satellites.', $position: 1, }, }, }, }, annotate_map: { description: 'Draw annotations on the 3D map to visually point out what you are talking about — like sketching on a whiteboard over the world. Use this whenever you mention a specific place, building, campus, boundary, district, or a relationship between two places, so the user can SEE what you mean. Give place NAMES (preferred) or explicit lat/lng; the app resolves them to real-world positions and real building/area outlines — never guess pixel positions. Call this as you begin describing something, and you may mark several places in one call.', $position: 1, parameters: { properties: { annotations: { description: 'One or more things to mark. Mark multiple related places together when describing them as a group.', $position: 1, items: { properties: { type: { description: 'pin = planted marker at a spot; highlight = pulsing ring drawing the eye to a point; area = trace the outline of a building/campus/compound/district; arrow = a connector from one place to another (use target as the origin and toTarget as the destination); route = a path through several waypoints (use the points array); label = a floating text callout.', $position: 2, }, target: { description: 'Place name to resolve, e.g. "Palace of Fine Arts, San Francisco", "the Pentagon", "Presidio of San Francisco". Preferred over coordinates. For a specific monument/statue/feature that sits within a larger landmark, use its OWN name + city ("Tejano Monument, Austin", "Texas African American History Memorial, Austin") — do NOT phrase it as "X at the Texas State Capitol", which makes the geocoder collapse several of them onto the same centroid so they stack on one spot.', $position: 2, }, points: { description: 'For type=route: 2+ ordered waypoints the path passes through, each a place name (or coordinates / screen point).', $position: 1, items: { properties: { target: { description: 'Waypoint place name.', $position: 2, }, }, }, }, mode: { description: 'For type=route: travel mode for a real street-following route (the app returns distance + time). Pick from the verb the user used ("walk" → walking, "drive" → driving). Defaults to walking.', $position: 2, }, latitude: { description: 'Explicit latitude (use only if no good place name exists).', $position: 3, }, toTarget: { description: 'For type=arrow: the destination place name.', $position: 2, }, label: { description: 'Short caption shown on the map (a few words). Optional.', $position: 2, }, color: { description: 'Accent color. primary = neutral, amber = point of interest, cyan = infrastructure, green = confirmed/safe, red = alert.', $position: 2, }, footprint: { description: 'For type=area/highlight: trace the real building or campus outline from map data. Defaults true for area.', $position: 1, }, intent: { description: 'For type=area: "the_thing" (default) outlines the place itself (its footprint/boundary); "around_the_thing" highlights a surrounding zone (a buffered radius around it). Infer from phrasing: "the Capitol"/"show me X" → the_thing; "around/near/by X" or "the area around X" → around_the_thing.', $position: 2, }, entityKind: { description: 'What KIND of thing the target IS — a fact, not a style choice: building = one structure; compound = campus/grounds/mall/park; district = neighborhood or area of a city; street = a named road/corridor; point_feature = monument/statue/memorial/plaque/fountain or other small point landmark. Set it whenever you know it — it routes the resolver to the right footprint source (point_feature anchors monuments as precise points instead of adopting a nearby building outline).', $position: 2, }, screenX: { description: 'Fallback only: when you cannot name/geocode the place but can SEE it in the latest viewport screenshot, the normalized horizontal position (0=left, 1=right) of the spot. The app converts it back to a real world point under that pixel.', $position: 3, }, screenY: { description: 'Fallback only: normalized vertical position (0=top, 1=bottom) of the spot in the latest viewport screenshot.', $position: 3, }, toScreenX: { description: 'For type=arrow: normalized x of the arrow destination from the screenshot (pixel fallback).', $position: 3, }, toScreenY: { description: 'For type=arrow: normalized y of the arrow destination from the screenshot (pixel fallback).', $position: 3, }, }, }, }, flyTo: { description: 'Also move the camera to frame the first annotation. Default false — leave false if the user is already looking at the spot.', $position: 1, }, persist: { description: 'Keep annotations until cleared (true, default) or let them auto-fade after ~20s (false).', $position: 1, }, }, }, }, clear_annotations: { description: 'Erase ALL map annotations previously drawn with annotate_map. Call this ONLY when the user EXPLICITLY asks to clear or reset the map. Annotations accumulate and persist across navigation and topic changes by design — never clear on your own initiative.', $position: 1, }, move_camera: { description: 'Direct the camera like a drone operator: orbit the current view target, pan, tilt, or rotate — one bounded nudge (mode=once) or continuous motion until stopped (mode=continuous). Continuous motion also stops on any manual camera input or when a navigation tool runs. Say the RESULTING state when confirming ("Orbiting slowly").', $position: 1, parameters: { properties: { direction: { description: 'Required except for orbit (defaults right/clockwise) and stop.', $position: 2, }, mode: { description: 'once = bounded eased nudge (default); continuous = until stop/manual input.', $position: 2, }, }, }, }, fly_route: { description: 'Cinematic dolly along an EXISTING route annotation (drawn earlier with annotate_map type=route) — flies the street-following path from start to end. Omit label for the newest route. If no route is drawn, this fails with guidance: draw the route first.', $position: 1, parameters: { properties: { label: { description: 'Match an existing route mark by (partial) label.', $position: 1, }, }, }, }, analyst_query: { description: 'Answer questions ABOUT the data currently loaded on the map — counts, lists, superlatives, and attribute filters over live layers (flights, military, ships, fires, earthquakes). Examples: "how many flights over Texas", "biggest fire near LA", "which ships are headed to Oakland", "anything above 40,000 feet", "fastest thing in view". Queries ONLY client-side data from ENABLED layers — if the needed layer is off, say so and offer to enable it. For a follow-up about the previous answer\'s set ("which of those is closest?"), set followUp=true and send only the new filters/sort.', $position: 1, parameters: { properties: { layers: { description: 'Layers to query. fires/wildfires → local-firms; ships/vessels → ais-live-vessels.', $position: 2, }, scope: { description: 'Spatial scope. Default: view (near the camera). Use kind=region for "over Texas"-style asks; kind=anywhere for global questions.', $position: 2, properties: { name: { description: 'For kind=region: a state/country ("Texas", "France") or a named natural region ("the Alps", "Gulf of Mexico").', $position: 1, }, km: { description: 'For kind=radius.', $position: 1, }, }, }, filters: { description: 'Attribute predicates, ANDed. ALTITUDE IS METERS (40,000 ft = 12192). Fields: altitudeM, speedMps, military, onGround, aircraftClass, callsign, operator, routeOrigin, routeDestination, originCountry (flights); speedKts, shipType, destination (ships); frp, confidence (fires); magnitude, depthKm, place (earthquakes).', $position: 1, }, sortBy: { description: 'Field to rank by, or "distance" for nearest-first.', $position: 1, }, followUp: { description: 'true = re-query the PREVIOUS result set instead of fresh data.', $position: 1, }, }, }, }, next_iss_pass: { description: "When the user asks when the ISS / the space station will next fly over: returns the next visible ISS pass for the current camera location (or an explicit lat/lon) — rise time (ISO + minutes from now), rise compass direction, peak elevation, and duration. Requires the satellites layer to have loaded its catalog at least once this session; if it hasn't, tell the user to enable the satellites layer and try again.", $position: 1, parameters: { properties: { latitude: { description: 'Optional observer latitude. Omit to use the current camera position.', $position: 3, }, longitude: { description: 'Optional observer longitude. Omit to use the current camera position.', $position: 3, }, minElevationDeg: { description: 'Minimum peak elevation (deg) to count as a pass. Default 10.', $position: 3, }, }, }, }, };