import path from 'node:path'; import { openSkyProxy } from './aircraft/opensky.js'; import { celestrakProxy, rocketLaunchesProxy } from './space.js'; import { tomtomProxy } from './traffic.js'; import { firmsProxy } from './firms.js'; import { terrainHeightsProxy } from './terrain.js'; import { adsbdbProxy } from './aircraft/enrichment.js'; import { overpassProxy } from './overpass.js'; import { militaryInstallationsProxy } from './military-installations.js'; import { regionalBriefProxy } from './regional/briefing.js'; import { geocodeProxy, NOMINATIM_CACHE_DIR } from './regional/place.js'; import { weatherEffectsProxy } from './regional/weather-effects.js'; import { cctvProxy } from './cctv.js'; import { defaultSourceRoot } from './common/source-root.js'; import { radioBrowserProxy } from './radio.js'; import { gbfsProxy } from './gbfs.js'; import { localReceiversProxy } from './local-receivers.js'; import { transitProxy } from './transit.js'; import { adsbLolProxy } from './aircraft/adsb-lol.js'; import { aisLiveProxy } from './vessels/ais-live.js'; import { trackBackfillProxies } from './aircraft/tracks.js'; import { openAiRealtimeProxy } from './openai.js'; import { geminiLiveProxy } from './gemini.js'; import { googlePlacesContextProxy } from './places.js'; import { mapillaryProxy } from './mapillary.js'; import { keySetupEndpoint } from '../standalone/key-setup.js'; import { weatherProxy } from './weather.js'; import { firePerimetersProxy } from './firePerimeters.js'; import { gnssIntegrityProxy } from './gnssIntegrity.js'; import { ghostMapsProxy } from './ghostMaps.js'; import { droneAirspaceProxy } from './droneAirspace.js'; import { cycloneProxy } from './cyclones.js'; import { windProxy } from './wind.js'; /** * Construct the local provider plugins in their established order. * `realtime` configures OpenAI; `gemini` explicitly opts into Gemini Live. * `nominatimStorageDir` binds an owned absolute directory before construction; * omission retains the durable per-source cache and policy state. */ function localProviderPlugins({ realtime, gemini, nominatimStorageDir = NOMINATIM_CACHE_DIR, } = {}) { if ( typeof nominatimStorageDir !== 'string' || !nominatimStorageDir.trim() || !path.isAbsolute(nominatimStorageDir) ) throw new TypeError('nominatimStorageDir must be an absolute directory'); return [ openSkyProxy(), celestrakProxy(), tomtomProxy(), firmsProxy(), rocketLaunchesProxy(), terrainHeightsProxy(), adsbdbProxy(), overpassProxy(), militaryInstallationsProxy(), regionalBriefProxy(), geocodeProxy({ storageDir: nominatimStorageDir }), weatherEffectsProxy(), cctvProxy({ sourceRoot: defaultSourceRoot }), radioBrowserProxy(), gbfsProxy(), localReceiversProxy(), transitProxy(), adsbLolProxy(), aisLiveProxy(), trackBackfillProxies(), openAiRealtimeProxy({ realtime }), ...(gemini ? [geminiLiveProxy({ realtime: gemini })] : []), googlePlacesContextProxy(), windProxy(), weatherProxy(), cycloneProxy(), mapillaryProxy(), firePerimetersProxy(), gnssIntegrityProxy(), ghostMapsProxy(), droneAirspaceProxy(), keySetupEndpoint(), ]; } export { localProviderPlugins }; export { CCTV_FRAME_FETCH_TIMEOUT_MS, fetchCctvImageFromUpstream, } from './cctv.js'; export { createRadioProxyMiddleware, isPublicRadioAddress, normalizeRadioBrowserStation, publicRadioStation, publicRadioHttpsUrl, } from './radio.js'; export { LL2_CACHE_TTL_MS, launchLibraryRequestHeaders } from './space.js'; export { googlePlacesContextProxy } from './places.js'; export { googleServerApiKey } from './places.js'; export { keylessGooglePlacesResponse } from './places.js'; export { keylessGoogleGeocodeResponse } from './places.js'; export { validateGeocodeAddress } from './places.js'; export { geocodeBounds } from './places.js'; export { adsbLolFallbackAnchor } from './aircraft/opensky.js'; export { readResponseTextCapped } from './common/http.js'; export { readResponseJsonCapped } from './common/http.js'; export { coalesceProxyRequest } from './common/http.js'; export { requiredFiniteQueryNumber } from './common/query.js'; export { isOverpassBoundaryQuery } from './overpass/query.js'; export { simplifyOverpassPayloadBody } from './overpass/geometry.js'; export { readOverpassDisk } from './overpass/cache.js'; export { resolveOverpassPreflight } from './overpass/cache.js'; export { overpassPayloadIsData } from './overpass/transport.js'; export { fetchOverpassPayload } from './overpass/transport.js'; export { openAiRealtimeProxy } from './openai.js'; export { MILITARY_INSTALLATION_ELEMENT_CAP } from './military-installations/constants.js'; export { quantizeMilitaryInstallationBox } from './military-installations/query.js'; export { militaryInstallationCacheKey } from './military-installations/query.js'; export { resolveMilitaryInstallationTier } from './military-installations/cache.js'; export { migrateMilitaryInstallationEntry } from './military-installations/cache.js'; export { militaryInstallationDiskFresh } from './military-installations/cache.js'; export { militaryInstallationDiskPath } from './military-installations/cache.js'; export { readMilitaryInstallationDisk } from './military-installations/cache.js'; export { writeMilitaryInstallationDisk } from './military-installations/cache.js'; export { validMilitaryInstallationBox } from './military-installations/query.js'; export { militaryInstallationFailureReason } from './military-installations/query.js'; export { validRegionalPoint } from './regional/query.js'; export { regionalBriefHasAnySource } from './regional/briefing.js';