@dangahagan/weather-mcp 1.21.0 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,12 +3,12 @@
3
3
  [![npm version](https://badge.fury.io/js/@dangahagan%2Fweather-mcp.svg)](https://www.npmjs.com/package/@dangahagan/weather-mcp)
4
4
  [![MCP Registry](https://img.shields.io/badge/MCP-Registry-blue)](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.dgahagan/weather-mcp)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
- [![Tests](https://img.shields.io/badge/tests-2%2C161%20passing-brightgreen)](./docs/testing/TEST_SUITE_README.md)
6
+ [![Tests](https://img.shields.io/badge/tests-2%2C204%20passing-brightgreen)](./docs/testing/TEST_SUITE_README.md)
7
7
  [![Node](https://img.shields.io/badge/node-%3E%3D18-339933?logo=node.js&logoColor=white)](https://nodejs.org)
8
8
 
9
9
  **Give your AI assistant real weather data — 17 tools, zero API keys, zero signup, zero cost.**
10
10
 
11
- Weather MCP is a [Model Context Protocol](https://modelcontextprotocol.io) server that connects AI assistants (Claude, Cursor, Cline, Zed, and any other MCP client) to live weather data: forecasts, current conditions, alerts, air quality, marine conditions, lightning, radar, rivers, wildfires, and 85+ years of historical weather. It's built entirely on free public data sources — NOAA, Open-Meteo, USGS, NIFC, NASA FIRMS, RainViewer, and Blitzortung.org — so there is nothing to sign up for and no key to paste in.
11
+ Weather MCP is a [Model Context Protocol](https://modelcontextprotocol.io) server that connects AI assistants (Claude, Cursor, Cline, Zed, and any other MCP client) to live weather data: forecasts, current conditions, alerts, air quality, marine conditions, lightning, radar, rivers, wildfires, and 85+ years of historical weather. It's built entirely on free public data sources — NOAA, Open-Meteo, USGS, NIFC, NASA FIRMS, RainViewer, and Blitzortung.org — so there is nothing to sign up for and no key to paste in. (A few optional keys unlock extras — see [Optional API keys](#optional-api-keys) — but no tool ever requires one.)
12
12
 
13
13
  ```bash
14
14
  claude mcp add weather -- npx -y @dangahagan/weather-mcp@latest
@@ -49,8 +49,8 @@ There are excellent commercial weather MCPs backed by paid APIs and full-time te
49
49
  Choose this one if you want:
50
50
 
51
51
  - **Genuinely free** — every data source is a free public API. No trial that expires, no credit card, no rate-limited "free tier" bait.
52
- - **No API keys** — install to first forecast in under a minute. Nothing to configure, nothing to leak into a repo.
53
- - **Fully open source** — MIT licensed, readable TypeScript, 2,161 tests. Audit it, fork it, fix it.
52
+ - **No API keys** — install to first forecast in under a minute. Nothing to configure, nothing to leak into a repo. ([Three optional keys](#optional-api-keys) add extras if you want them; the default configuration needs none.)
53
+ - **Fully open source** — MIT licensed, readable TypeScript, 2,204 tests. Audit it, fork it, fix it.
54
54
  - **Privacy-respecting** — your queries go directly from your machine to public weather APIs. No middleman server, no telemetry.
55
55
  - **Breadth** — 17 tools covering weather, safety hazards (lightning, floods, wildfires), marine conditions, air quality, and historical data back to 1940. Most weather MCPs stop at forecasts.
56
56
 
@@ -68,7 +68,7 @@ All 17 tools, documented in detail in **[docs/TOOLS.md](./docs/TOOLS.md)**:
68
68
  | `get_historical_weather` | Hourly/daily observations from 1940 to present | 🌍 Global |
69
69
  | `get_weather_summary` | One-call overview combining current conditions, forecast, and alerts (optionally air quality and lightning) | 🌍 Global |
70
70
  | `search_location` | Geocode place names to coordinates ("Paris" → 48.85, 2.35) | 🌍 Global |
71
- | `get_air_quality` | AQI (US/European scales), pollutants, UV index, health guidance; current pollen levels for European locations; optional day-grouped forecast up to 7 days with per-day peak AQI and UV | 🌍 Global |
71
+ | `get_air_quality` | AQI (US/European scales), pollutants, UV index, health guidance; current pollen levels for European locations (or worldwide with an optional key); optional day-grouped forecast up to 7 days with per-day peak AQI and UV | 🌍 Global |
72
72
  | `get_marine_conditions` | Wave height, swell, ocean currents, Douglas Sea Scale — includes Great Lakes and major US bays; forecast up to 16 days | 🌍 Global |
73
73
  | `get_weather_imagery` | Precipitation radar (static or 2-hour animated loops) + GOES satellite imagery; `composite: true` returns a finished radar map over a base map as an image | 🌍 Global |
74
74
  | `get_lightning_activity` | Real-time strike detection with 4-level proximity safety assessment | 🌍 Global |
@@ -166,7 +166,7 @@ npm run build
166
166
 
167
167
  Then point your MCP client at `node /absolute/path/to/weather-mcp/dist/index.js`.
168
168
 
169
- Requires Node.js 18+. No API keys, tokens, or accounts needed.
169
+ Requires Node.js 18+. No API keys, tokens, or accounts needed — see [Optional API keys](#optional-api-keys) for the three that add optional extras.
170
170
 
171
171
  ### Works with
172
172
 
@@ -253,10 +253,45 @@ Supported on `get_forecast`, `get_current_conditions`, and `get_historical_weath
253
253
  | `API_TIMEOUT_MS` | `30000` | Upstream API timeout (5000–120000) |
254
254
  | `WEATHER_LIGHTNING_PREWARM` | `true` | Subscribe saved locations' geohashes at startup so `get_lightning_activity` has coverage before the first query. Set `false` to skip this and avoid the persistent MQTT connection at startup. No effect when the lightning tool is disabled. |
255
255
  | `LOG_LEVEL` | `1` | 0=DEBUG, 1=INFO, 2=WARN, 3=ERROR (logs go to stderr) |
256
- | `NCEI_API_TOKEN` | — | Optional [free NCEI token](https://www.ncdc.noaa.gov/cdo-web/token) for official NOAA climate normals (US); falls back to Open-Meteo automatically |
256
+ | `NCEI_API_TOKEN` | — | Optional [free NCEI token](https://www.ncdc.noaa.gov/cdo-web/token) for official NOAA climate normals (US); falls back to Open-Meteo automatically. See [Optional API keys](#optional-api-keys) |
257
+ | `FIRMS_MAP_KEY` | — | Optional [free FIRMS key](https://firms.modaps.eosdis.nasa.gov/api/map_key/) for targeted wildfire queries and up to 5 days of detection history. See [Optional API keys](#optional-api-keys) |
258
+ | `GOOGLE_POLLEN_API_KEY` | — | Optional key for pollen outside Europe (incl. the US). **Requires a Google Cloud billing account** — free tier is 5,000 lookups/month. See [Optional API keys](#optional-api-keys) and [the setup guide](./docs/GOOGLE_POLLEN_KEY_SETUP.md) |
257
259
 
258
260
  For caching architecture details, see [.github/CACHING.md](./.github/CACHING.md).
259
261
 
262
+ ## Optional API keys
263
+
264
+ **The default is the product.** Every one of the 17 tools works with zero keys,
265
+ zero signup, and zero cost — that is the configuration this project is built
266
+ around and the one most people should use. If that's you, you can skip this
267
+ section entirely.
268
+
269
+ Three optional keys each unlock one extra. Without them the corresponding tool
270
+ still works; it just returns the keyless answer.
271
+
272
+ | Variable | What it costs | What it adds | Without it |
273
+ |----------|---------------|--------------|------------|
274
+ | [`NCEI_API_TOKEN`](https://www.ncdc.noaa.gov/cdo-web/token) | Free registration (email) | Official NOAA station climate normals for US locations | Normals are computed from the Open-Meteo reanalysis archive — global, and the path virtually every user is already on |
275
+ | [`FIRMS_MAP_KEY`](https://firms.modaps.eosdis.nasa.gov/api/map_key/) | Free registration (email) | Targeted wildfire bbox queries with 1–5 days of detection history | Keyless 24-hour regional detection files — `get_wildfire_info` still works globally |
276
+ | `GOOGLE_POLLEN_API_KEY` | **Free tier, but requires a Google Cloud billing account (credit card on file)** — 5,000 lookups/month free, ~$10/1,000 after. [Setup guide](./docs/GOOGLE_POLLEN_KEY_SETUP.md) | Grass/tree/weed Universal Pollen Index outside Europe, including the US (65+ countries) | European pollen via CAMS still works keyless; elsewhere no pollen section renders |
277
+
278
+ The NCEI and FIRMS keys are true free registrations. **The Google Pollen key is
279
+ not** — it has a free usage tier, but Google requires a billing account with a
280
+ payment method to issue it at all. That's why it isn't described as simply
281
+ "free" anywhere in these docs, and why it stays strictly optional.
282
+
283
+ ### Standing key policy
284
+
285
+ So the "genuinely free" promise above stays meaningful, this project holds to
286
+ three rules:
287
+
288
+ 1. **Optional keys must always have a usable free tier.** A key that only makes
289
+ sense once you're paying doesn't belong here.
290
+ 2. **No tool will ever *require* a key.** Every feature has a keyless path, even
291
+ if that path is "this data isn't available for your region".
292
+ 3. **Features that would require a *paid* key are out of scope** unless there's
293
+ significant user demand for that specific service.
294
+
260
295
  ## Coverage & Limitations
261
296
 
262
297
  Being honest about what free public data can and can't do:
@@ -271,6 +306,7 @@ Being honest about what free public data can and can't do:
271
306
  | River conditions | ✅ (GloFAS modeled discharge) | Gauge observations + official flood stages via NWPS |
272
307
  | Wildfires | ✅ (FIRMS satellite detections) | Named incidents with acreage + containment via NIFC |
273
308
  | Fire weather | ✅ (computed Fosberg index + dryness context) | NOAA-published Haines, grassland, red-flag indices |
309
+ | Pollen | 🇪🇺 Europe keyless (CAMS, grains/m³); elsewhere needs an optional key | Universal Pollen Index with `GOOGLE_POLLEN_API_KEY` |
274
310
 
275
311
  - European alerts are matched at **country level** — the keyless MeteoAlarm feeds carry no region polygons, so warnings for a large country may not affect the requested point; the output says so. Canadian alerts use a real bbox query with polygon-backed features.
276
312
  - International current conditions default to **model-interpolated** values at the exact coordinates. `source="metar"` returns a **real instrument reading** instead — but from the nearest airport, which may be tens of km away and up to an hour old. The output always names the station, its distance and bearing, and the observation age, so the tradeoff is visible rather than assumed. METAR coverage follows airports, so remote land and open ocean have real gaps.
@@ -278,6 +314,7 @@ Being honest about what free public data can and can't do:
278
314
  - Non-US wildfire results are **satellite heat detections, not managed incidents** — no fire names, sizes, or containment percentages exist in the data, detections can include industrial heat sources or agricultural burns, and a clear result is not an all-clear (cloud cover hides fires; small or new fires evade detection). The output frames all of this explicitly. Keyless data covers the last 24 hours; an optional free [`FIRMS_MAP_KEY`](https://firms.modaps.eosdis.nasa.gov/api/map_key/) unlocks targeted queries and up to 5 days of detection history (`day_range`).
279
315
  - Non-US fire weather is a **Fosberg Fire Weather Index computed by this server** from current model values, not an agency-published rating — US locations get NOAA's own Haines/grassland/red-flag indices instead. The output says which it is and defers to national fire authorities; its category bands are a project heuristic.
280
316
  - Non-US river discharge is **modeled**, not observed, and has no official flood-stage thresholds — levels are shown relative to recent history and the forecast ensemble. The ~5km model grid means the reported channel may be a few km from the requested point; the output says so when it is.
317
+ - Pollen is **Europe-only without a key**: it rides the CAMS European model on the air-quality endpoint, which returns real grains/m³ in Europe and nothing anywhere else. An optional [`GOOGLE_POLLEN_API_KEY`](#optional-api-keys) fills the gap for 65+ countries including the US, as a grass/tree/weed Universal Pollen Index (0–5) rather than per-species counts. Europe keeps the richer keyless data and never contacts Google.
281
318
  - Marine data has limited coastal accuracy and is **not suitable for navigation**.
282
319
  - Lightning coverage varies by region (community-operated detector network).
283
320
  - Open-Meteo's fair-use limit is 10,000 requests/day; the built-in cache makes this hard to hit in normal use.
@@ -287,7 +324,7 @@ Being honest about what free public data can and can't do:
287
324
  ```bash
288
325
  npm run build # Compile TypeScript
289
326
  npm run dev # Run in development mode
290
- npm test # Run all 2,161 tests
327
+ npm test # Run all 2,204 tests
291
328
  npm run test:coverage # Coverage report
292
329
  npm run audit # Dependency vulnerability scan
293
330
  ```
@@ -49,4 +49,32 @@ export declare const FIRMS_MAP_KEY: string | undefined;
49
49
  * Check if FIRMS API key is available (key configured)
50
50
  */
51
51
  export declare function isFIRMSKeyAvailable(): boolean;
52
+ /**
53
+ * Google Pollen API key
54
+ *
55
+ * OPTIONAL: Create a key in the Google Cloud console
56
+ * (https://console.cloud.google.com/). Unlike the NCEI and FIRMS keys above,
57
+ * this one is **not a free registration**: it has a free usage tier, but
58
+ * **requires a Google Cloud billing account** (credit card on file).
59
+ *
60
+ * Benefits of providing a key:
61
+ * - Global pollen data for 65+ countries including the US
62
+ * - Grass/Tree/Weed Universal Pollen Index (UPI 0–5)
63
+ *
64
+ * If not provided:
65
+ * - European pollen via CAMS model continues to work
66
+ * - Pollen outside Europe is unavailable
67
+ * - No setup required
68
+ *
69
+ * Rate limits with key:
70
+ * - 5,000 lookups per month (free tier)
71
+ * - ~$10 per 1,000 lookups after free tier
72
+ *
73
+ * Setup guide: docs/GOOGLE_POLLEN_KEY_SETUP.md
74
+ */
75
+ export declare const GOOGLE_POLLEN_API_KEY: string | undefined;
76
+ /**
77
+ * Check if Google Pollen API key is available (key configured)
78
+ */
79
+ export declare function isGooglePollenKeyAvailable(): boolean;
52
80
  //# sourceMappingURL=api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/config/api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc,oBAA6B,CAAC;AAEzD;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,oBAA4B,CAAC;AAEvD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/config/api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc,oBAA6B,CAAC;AAEzD;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,oBAA4B,CAAC;AAEvD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,qBAAqB,oBAAoC,CAAC;AAEvE;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD"}
@@ -53,4 +53,34 @@ export const FIRMS_MAP_KEY = process.env.FIRMS_MAP_KEY;
53
53
  export function isFIRMSKeyAvailable() {
54
54
  return !!FIRMS_MAP_KEY && FIRMS_MAP_KEY.trim().length > 0;
55
55
  }
56
+ /**
57
+ * Google Pollen API key
58
+ *
59
+ * OPTIONAL: Create a key in the Google Cloud console
60
+ * (https://console.cloud.google.com/). Unlike the NCEI and FIRMS keys above,
61
+ * this one is **not a free registration**: it has a free usage tier, but
62
+ * **requires a Google Cloud billing account** (credit card on file).
63
+ *
64
+ * Benefits of providing a key:
65
+ * - Global pollen data for 65+ countries including the US
66
+ * - Grass/Tree/Weed Universal Pollen Index (UPI 0–5)
67
+ *
68
+ * If not provided:
69
+ * - European pollen via CAMS model continues to work
70
+ * - Pollen outside Europe is unavailable
71
+ * - No setup required
72
+ *
73
+ * Rate limits with key:
74
+ * - 5,000 lookups per month (free tier)
75
+ * - ~$10 per 1,000 lookups after free tier
76
+ *
77
+ * Setup guide: docs/GOOGLE_POLLEN_KEY_SETUP.md
78
+ */
79
+ export const GOOGLE_POLLEN_API_KEY = process.env.GOOGLE_POLLEN_API_KEY;
80
+ /**
81
+ * Check if Google Pollen API key is available (key configured)
82
+ */
83
+ export function isGooglePollenKeyAvailable() {
84
+ return !!GOOGLE_POLLEN_API_KEY && GOOGLE_POLLEN_API_KEY.trim().length > 0;
85
+ }
56
86
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/config/api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAEzD;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,CAAC,cAAc,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AAEvD;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/config/api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAEzD;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,CAAC,cAAc,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AAEvD;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;AAEvE;;GAEG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,CAAC,CAAC,qBAAqB,IAAI,qBAAqB,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5E,CAAC"}
@@ -23,6 +23,7 @@ export declare const CacheConfig: {
23
23
  readonly normals: number;
24
24
  readonly serviceStatus: number;
25
25
  readonly floodDischarge: number;
26
+ readonly googlePollen: number;
26
27
  readonly records: number;
27
28
  readonly recordsStation: number;
28
29
  readonly metarObservations: number;
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/config/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkDH,eAAO,MAAM,WAAW;aAEtB,OAAO;aAIP,OAAO;aAIP,YAAY;aAGZ,GAAG;iBAGD,eAAe;iBAIf,SAAS;iBAIT,QAAQ;iBAIR,QAAQ;iBAIR,iBAAiB;iBAIjB,MAAM;iBAIN,gBAAgB;iBAIhB,cAAc;iBAKd,OAAO;iBAIP,aAAa;iBAMb,cAAc;iBAMd,OAAO;iBAIP,cAAc;iBAMd,iBAAiB;iBAQjB,YAAY;iBAQZ,cAAc;iBAKd,cAAc;iBAKd,cAAc;iBAKd,iBAAiB;;CAEX,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAYrE"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/config/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkDH,eAAO,MAAM,WAAW;aAEtB,OAAO;aAIP,OAAO;aAIP,YAAY;aAGZ,GAAG;iBAGD,eAAe;iBAIf,SAAS;iBAIT,QAAQ;iBAIR,QAAQ;iBAIR,iBAAiB;iBAIjB,MAAM;iBAIN,gBAAgB;iBAIhB,cAAc;iBAKd,OAAO;iBAIP,aAAa;iBAMb,cAAc;iBAMd,YAAY;iBAMZ,OAAO;iBAIP,cAAc;iBAMd,iBAAiB;iBAQjB,YAAY;iBAQZ,cAAc;iBAKd,cAAc;iBAKd,cAAc;iBAKd,iBAAiB;;CAEX,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAYrE"}
@@ -97,6 +97,11 @@ export const CacheConfig = {
97
97
  // the 9-point channel-snapping probe (a single lookup fans out to 9
98
98
  // grid cells in one request, so caching keeps repeat queries cheap).
99
99
  floodDischarge: 6 * HOUR,
100
+ // Google Pollen API (optional global pollen fallback)
101
+ // Pollen models update ~daily; 6h matches the daily-model posture and
102
+ // shields the 5,000/month free-tier quota once the 1h air-quality cache
103
+ // expires. In-memory only — nothing is persisted per Google Maps Platform ToS.
104
+ googlePollen: 6 * HOUR,
100
105
  // US daily temperature records (RCC ACIS) — the full 366-slot per-station
101
106
  // table. ACIS publishes no rate limits or ToS, so be a good citizen and
102
107
  // cache hard: a record changes at most when it is broken, so a stale
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/config/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/config/cache.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,8 @@
4
4
  import { OpenMeteoService } from '../services/openmeteo.js';
5
5
  import { LocationStore } from '../services/locationStore.js';
6
6
  import { GeocodingService } from '../services/geocoding.js';
7
- export declare function handleGetAirQuality(args: unknown, openMeteoService: OpenMeteoService, locationStore: LocationStore, geocodingService: GeocodingService): Promise<{
7
+ import type { GooglePollenService } from '../services/googlePollen.js';
8
+ export declare function handleGetAirQuality(args: unknown, openMeteoService: OpenMeteoService, locationStore: LocationStore, geocodingService: GeocodingService, googlePollenService?: GooglePollenService): Promise<{
8
9
  content: Array<{
9
10
  type: string;
10
11
  text: string;
@@ -1 +1 @@
1
- {"version":3,"file":"airQualityHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/airQualityHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAyB5D,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,OAAO,EACb,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAiC7D"}
1
+ {"version":3,"file":"airQualityHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/airQualityHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAgB5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAqCvE,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,OAAO,EACb,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,EAClC,mBAAmB,CAAC,EAAE,mBAAmB,GACxC,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA8E7D"}
@@ -4,9 +4,28 @@
4
4
  import { resolveLocationAsync, prependLocationLine } from '../utils/locationResolver.js';
5
5
  import { validateOptionalBoolean, validatePositiveInteger } from '../utils/validation.js';
6
6
  import { getUSAQICategory, getEuropeanAQICategory, getUVIndexCategory, getPollutantInfo, formatPollutantConcentration, shouldUseUSAQI } from '../utils/airQuality.js';
7
+ import { GooglePollenKeyRejectedError } from '../services/googlePollen.js';
8
+ import { logger } from '../utils/logger.js';
7
9
  const DEFAULT_FORECAST_DAYS = 5;
8
10
  const MAX_FORECAST_DAYS = 7; // Open-Meteo air quality API limit (168 hours)
9
- export async function handleGetAirQuality(args, openMeteoService, locationStore, geocodingService) {
11
+ /**
12
+ * The six CAMS European-model pollen species, filtered to those carrying a
13
+ * real number. Non-European points return HTTP 200 with every species null,
14
+ * so an empty result is the "no CAMS coverage here" signal — shared by the
15
+ * render block and the Google-fallback trigger so the two can never drift
16
+ * (design plan D1).
17
+ */
18
+ function finiteCamsPollen(current) {
19
+ return [
20
+ { label: 'Alder', value: current.alder_pollen },
21
+ { label: 'Birch', value: current.birch_pollen },
22
+ { label: 'Grass', value: current.grass_pollen },
23
+ { label: 'Mugwort', value: current.mugwort_pollen },
24
+ { label: 'Olive', value: current.olive_pollen },
25
+ { label: 'Ragweed', value: current.ragweed_pollen }
26
+ ].filter(species => typeof species.value === 'number' && Number.isFinite(species.value));
27
+ }
28
+ export async function handleGetAirQuality(args, openMeteoService, locationStore, geocodingService, googlePollenService) {
10
29
  // Resolve location from coordinates, a saved location name, or a geocoded city name
11
30
  const resolved = await resolveLocationAsync(args, locationStore, geocodingService);
12
31
  const { latitude, longitude } = resolved;
@@ -17,8 +36,44 @@ export async function handleGetAirQuality(args, openMeteoService, locationStore,
17
36
  : validatePositiveInteger(rawForecastDays, 'forecast_days', 1, MAX_FORECAST_DAYS);
18
37
  // Get air quality data
19
38
  const airQualityData = await openMeteoService.getAirQuality(latitude, longitude, forecast, forecastDays);
39
+ // Optional keyed global pollen fallback (design plan D1/D6). Fires only
40
+ // when a key is configured AND the CAMS European model returned nothing
41
+ // for this point — Europe keeps the richer keyless grains/m³ data and
42
+ // never contacts Google. Sequential by necessity: the trigger needs the
43
+ // CAMS answer first.
44
+ //
45
+ // The Google data is garnish, not contract: the whole fetch sits in one
46
+ // try/catch and the air-quality call never fails because of it.
47
+ let googlePollen;
48
+ let googleKeyRejected = false;
49
+ if (googlePollenService &&
50
+ googlePollenService.isKeyAvailable() &&
51
+ airQualityData.current &&
52
+ finiteCamsPollen(airQualityData.current).length === 0) {
53
+ try {
54
+ googlePollen = await googlePollenService.getCurrentPollen(latitude, longitude);
55
+ if (!googlePollen) {
56
+ // Expected outside Google's 65+ covered countries — not a fault.
57
+ logger.info('Google Pollen returned no data for this location');
58
+ }
59
+ }
60
+ catch (error) {
61
+ if (error instanceof GooglePollenKeyRejectedError) {
62
+ googleKeyRejected = true;
63
+ logger.warn('Google Pollen API key was rejected', {
64
+ service: 'GooglePollen',
65
+ securityEvent: true
66
+ });
67
+ }
68
+ else {
69
+ logger.warn('Google Pollen fallback failed; rendering no pollen section', {
70
+ service: 'GooglePollen'
71
+ });
72
+ }
73
+ }
74
+ }
20
75
  // Format the air quality data for display
21
- const output = formatAirQuality(airQualityData, latitude, longitude, forecast);
76
+ const output = formatAirQuality(airQualityData, latitude, longitude, forecast, googlePollen, googleKeyRejected);
22
77
  return prependLocationLine({
23
78
  content: [
24
79
  {
@@ -31,7 +86,7 @@ export async function handleGetAirQuality(args, openMeteoService, locationStore,
31
86
  /**
32
87
  * Format air quality data as markdown
33
88
  */
34
- function formatAirQuality(data, latitude, longitude, includeForecast) {
89
+ function formatAirQuality(data, latitude, longitude, includeForecast, googlePollen, googleKeyRejected) {
35
90
  let output = `# Air Quality Report\n\n`;
36
91
  output += `**Location:** ${latitude.toFixed(4)}, ${longitude.toFixed(4)}\n`;
37
92
  output += `**Timezone:** ${data.timezone}\n`;
@@ -122,14 +177,7 @@ function formatAirQuality(data, latitude, longitude, includeForecast) {
122
177
  // every species null, so the section renders only when at least one species
123
178
  // carries a real value — never trust the 200 alone. In-season zeros are
124
179
  // meaningful ("none detected") and do render.
125
- const pollenSpecies = [
126
- { label: 'Alder', value: current.alder_pollen },
127
- { label: 'Birch', value: current.birch_pollen },
128
- { label: 'Grass', value: current.grass_pollen },
129
- { label: 'Mugwort', value: current.mugwort_pollen },
130
- { label: 'Olive', value: current.olive_pollen },
131
- { label: 'Ragweed', value: current.ragweed_pollen }
132
- ].filter(species => typeof species.value === 'number' && Number.isFinite(species.value));
180
+ const pollenSpecies = finiteCamsPollen(current);
133
181
  if (pollenSpecies.length > 0) {
134
182
  output += `## 🌾 Pollen\n\n`;
135
183
  for (const species of pollenSpecies) {
@@ -138,6 +186,19 @@ function formatAirQuality(data, latitude, longitude, includeForecast) {
138
186
  }
139
187
  output += `\n*Pollen from the CAMS European forecast — available for European locations only.*\n\n`;
140
188
  }
189
+ else {
190
+ // No CAMS coverage here. Fall back to the optional keyed Google Pollen
191
+ // section, or — if the configured key was rejected — a single
192
+ // misconfiguration note (design plan D5/D6). Otherwise nothing renders,
193
+ // exactly as before.
194
+ const googleSection = formatGooglePollen(googlePollen);
195
+ if (googleSection) {
196
+ output += googleSection;
197
+ }
198
+ else if (googleKeyRejected) {
199
+ output += `*Note: GOOGLE_POLLEN_API_KEY was rejected; global pollen data is unavailable.*\n\n`;
200
+ }
201
+ }
141
202
  // Show secondary AQI for reference
142
203
  if (useUSAQI && current.european_aqi !== undefined) {
143
204
  output += `*European AQI: ${Math.round(current.european_aqi)} (${getEuropeanAQICategory(current.european_aqi).level})*\n\n`;
@@ -153,6 +214,58 @@ function formatAirQuality(data, latitude, longitude, includeForecast) {
153
214
  }
154
215
  return output;
155
216
  }
217
+ /**
218
+ * Render the Google Pollen day-1 section that fills the CAMS slot outside
219
+ * Europe (design plan D5). Returns an empty string when there is nothing
220
+ * worth showing, so the caller can fall through to the key-rejected note.
221
+ *
222
+ * Only types whose `indexInfo.value` is a finite number render: Google omits
223
+ * `indexInfo` entirely for out-of-season types (upstream (c)), while a zero
224
+ * UPI that *does* carry `indexInfo` is meaningful ("none detected") and
225
+ * renders — mirroring the CAMS olive-0 rule.
226
+ *
227
+ * The attribution sentence is **mandatory and exact** — the Google Pollen
228
+ * API policies require the string "Source: Includes pollen data from Google"
229
+ * on or next to the data (upstream (d)). Do not reword it.
230
+ */
231
+ function formatGooglePollen(daily) {
232
+ if (!daily) {
233
+ return '';
234
+ }
235
+ const types = (daily.pollenTypeInfo ?? []).filter(type => typeof type.indexInfo?.value === 'number' && Number.isFinite(type.indexInfo.value));
236
+ if (types.length === 0) {
237
+ return '';
238
+ }
239
+ let section = `## 🌾 Pollen\n\n`;
240
+ for (const type of types) {
241
+ // Google sends "Grass"/"Tree"/"Weed" as displayName; fall back to the
242
+ // enum code (GRASS) title-cased if a response ever omits it.
243
+ const label = type.displayName ?? titleCase(type.code ?? 'Pollen');
244
+ const category = type.indexInfo?.category;
245
+ const seasonSuffix = type.inSeason === true ? ' — in season' : '';
246
+ section += `**${label}:** ${type.indexInfo?.value}`;
247
+ section += category ? ` (${category})` : '';
248
+ section += `${seasonSuffix}\n`;
249
+ }
250
+ const inSeasonPlants = (daily.plantInfo ?? [])
251
+ .filter(plant => plant.inSeason === true && plant.displayName)
252
+ .map(plant => {
253
+ const category = plant.indexInfo?.category;
254
+ return category ? `${plant.displayName} (${category})` : `${plant.displayName}`;
255
+ });
256
+ if (inSeasonPlants.length > 0) {
257
+ section += `\nIn season: ${inSeasonPlants.join(', ')}\n`;
258
+ }
259
+ section += `\n*Universal Pollen Index (0–5) for today. Source: Includes pollen data from Google.*\n\n`;
260
+ return section;
261
+ }
262
+ /**
263
+ * "GRASS" -> "Grass". Only used as a defensive fallback when a pollen type
264
+ * arrives without a displayName.
265
+ */
266
+ function titleCase(value) {
267
+ return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
268
+ }
156
269
  /**
157
270
  * Format the hourly AQI forecast grouped by local calendar day, with 6-hour
158
271
  * period ranges inside each day. Hours before the current observation time
@@ -1 +1 @@
1
- {"version":3,"file":"airQualityHandler.js","sourceRoot":"","sources":["../../src/handlers/airQualityHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"airQualityHandler.js","sourceRoot":"","sources":["../../src/handlers/airQualityHandler.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -18,6 +18,7 @@ import { MeteoAlarmService } from './services/meteoalarm.js';
18
18
  import { GeoMetService } from './services/geomet.js';
19
19
  import { NIFCService } from './services/nifc.js';
20
20
  import { FIRMSService } from './services/firms.js';
21
+ import { GooglePollenService } from './services/googlePollen.js';
21
22
  import { GeocodingService } from './services/geocoding.js';
22
23
  import { LocationStore } from './services/locationStore.js';
23
24
  import { blitzortungService } from './services/blitzortung.js';
@@ -146,6 +147,12 @@ const nifcService = new NIFCService();
146
147
  * queries with day_range up to 5.
147
148
  */
148
149
  const firmsService = new FIRMSService();
150
+ /**
151
+ * Initialize the Google Pollen API service for global pollen data fallback.
152
+ * Optional keyed global pollen fallback; without GOOGLE_POLLEN_API_KEY the
153
+ * service is never called and European pollen via CAMS continues to work unchanged.
154
+ */
155
+ const googlePollenService = new GooglePollenService();
149
156
  /**
150
157
  * Initialize the Geocoding service with multi-provider support
151
158
  * No API key required - uses Census.gov, Nominatim, and Open-Meteo
@@ -448,7 +455,7 @@ const TOOL_DEFINITIONS = {
448
455
  },
449
456
  get_air_quality: {
450
457
  name: 'get_air_quality',
451
- description: 'Get air quality data including AQI (Air Quality Index), pollutant concentrations, and UV index for a location (global coverage). Use this when asked about "air quality", "pollution", "AQI", "UV index", "safe to exercise outside", "pollen count", "allergy day", or health-related environmental conditions. Returns current conditions and an optional forecast grouped by day (up to 7 days / 168 hours via forecast_days). Shows appropriate AQI scale (US AQI for US locations, European EAQI elsewhere) with health recommendations. Pollutants include PM2.5, PM10, ozone, NO2, SO2, and CO. For European locations, current pollen levels (alder, birch, grass, mugwort, olive, ragweed) are included automatically; pollen data is not available outside Europe. Provide the location as coordinates (latitude+longitude), a saved location_name, or a free-text city_name.',
458
+ description: 'Get air quality data including AQI (Air Quality Index), pollutant concentrations, and UV index for a location (global coverage). Use this when asked about "air quality", "pollution", "AQI", "UV index", "safe to exercise outside", "pollen count", "allergy day", or health-related environmental conditions. Returns current conditions and an optional forecast grouped by day (up to 7 days / 168 hours via forecast_days). Shows appropriate AQI scale (US AQI for US locations, European EAQI elsewhere) with health recommendations. Pollutants include PM2.5, PM10, ozone, NO2, SO2, and CO. For European locations, current pollen levels (alder, birch, grass, mugwort, olive, ragweed) are included automatically in grains/m³ and no API key is required; elsewhere, a grass/tree/weed Universal Pollen Index (0–5) is included when an optional GOOGLE_POLLEN_API_KEY is configured; without that key, pollen data is not available outside Europe. Provide the location as coordinates (latitude+longitude), a saved location_name, or a free-text city_name.',
452
459
  inputSchema: {
453
460
  type: 'object',
454
461
  properties: {
@@ -743,7 +750,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
743
750
  case 'search_location':
744
751
  return await withAnalytics('search_location', async () => handleSearchLocation(args, geocodingService));
745
752
  case 'get_air_quality':
746
- return await withAnalytics('get_air_quality', async () => handleGetAirQuality(args, openMeteoService, locationStore, geocodingService));
753
+ return await withAnalytics('get_air_quality', async () => handleGetAirQuality(args, openMeteoService, locationStore, geocodingService, googlePollenService));
747
754
  case 'get_marine_conditions':
748
755
  return await withAnalytics('get_marine_conditions', async () => handleGetMarineConditions(args, noaaService, openMeteoService, locationStore, geocodingService));
749
756
  case 'get_weather_imagery':
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,oEAAoE;AACpE,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEhE;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,kEAAkE;AAClE,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAC1D,CAAC;AAEF,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC;AAE3C;;;GAGG;AACH,SAAS,qBAAqB,CAAC,IAAa;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,MAAM,eAAe,GAAG;QACtB,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK;QACrC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO;QAC5D,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa;KAChD,CAAC;IAEF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,EAAE,CAAC;QAC3E,IAAI,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,QAAQ,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;QAC/B,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACvD,QAAQ,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;IAClC,SAAS,EAAE,eAAe,cAAc,+CAA+C;CACxF,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEhD;;;;GAIG;AACH,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;AAE1C;;;;GAIG;AACH,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC;;;;GAIG;AACH,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC;;;;GAIG;AACH,MAAM,sBAAsB,GAAG,IAAI,sBAAsB,EAAE,CAAC;AAE5D;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAElD;;;;GAIG;AACH,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;AAE1C;;;GAGG;AACH,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;AAExC;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,cAAc;CACxB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,sBAAsB,GAAG;IAC7B,KAAK,EAAE;QACL,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,2MAA2M;QACxN,IAAI,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;KAC7B;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,wCAAwC;QACrD,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;KACjB;IACD,eAAe,EAAE;QACf,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,gEAAgE;QAC7E,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;KACjC;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,8CAA8C;QAC3D,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC;KACrB;IACD,aAAa,EAAE;QACb,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,0CAA0C;QACvD,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;KACtB;IACD,aAAa,EAAE;QACb,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,4DAA4D;QACzE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;KACnB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,yCAAyC;QACtD,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;KACrB;CACF,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,qBAAqB,GAAG,kBAAkB,EAAE;IAChD,CAAC,CAAC,uHAAuH,kBAAkB,EAAE,aAAa;IAC1J,CAAC,CAAC,EAAE,CAAC;AAEP,MAAM,0BAA0B,GAAG;IACjC,QAAQ,EAAE;QACR,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,gGAAgG,qBAAqB,EAAE;QACpI,OAAO,EAAE,CAAC,EAAE;QACZ,OAAO,EAAE,EAAE;KACZ;IACD,SAAS,EAAE;QACT,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,kGAAkG;QAC/G,OAAO,EAAE,CAAC,GAAG;QACb,OAAO,EAAE,GAAG;KACb;IACD,aAAa,EAAE;QACb,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,kJAAkJ;KAChK;IACD,SAAS,EAAE;QACT,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,6NAA6N;KAC3O;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,sBAAsB,GAAG;IAC7B,MAAM,EAAE;QACN,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,+LAA+L;QAC5M,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC;KACtC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,gBAAgB,GAAG;IACvB,YAAY,EAAE;QACZ,IAAI,EAAE,cAAuB;QAC7B,WAAW,EAAE,+gCAA+gC;QAC5hC,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,GAAG,0BAA0B;gBAC7B,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,sFAAsF;oBACnG,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,CAAC;iBACX;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,4GAA4G;oBACzH,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;oBACzB,OAAO,EAAE,OAAO;iBACjB;gBACD,iCAAiC,EAAE;oBACjC,IAAI,EAAE,SAAkB;oBACxB,WAAW,EAAE,0EAA0E;oBACvF,OAAO,EAAE,IAAI;iBACd;gBACD,sBAAsB,EAAE;oBACtB,IAAI,EAAE,SAAkB;oBACxB,WAAW,EAAE,8JAA8J;oBAC3K,OAAO,EAAE,KAAK;iBACf;gBACD,eAAe,EAAE;oBACf,IAAI,EAAE,SAAkB;oBACxB,WAAW,EAAE,mSAAmS;oBAChT,OAAO,EAAE,KAAK;iBACf;gBACD,iBAAiB,EAAE;oBACjB,IAAI,EAAE,SAAkB;oBACxB,WAAW,EAAE,2VAA2V;oBACxW,OAAO,EAAE,KAAK;iBACf;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,+HAA+H;oBAC5I,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC;oBACnC,OAAO,EAAE,MAAM;iBAChB;gBACD,cAAc,EAAE;oBACd,IAAI,EAAE,SAAkB;oBACxB,OAAO,EAAE,KAAK;oBACd,WAAW,EAAE,kRAAkR;iBAChS;gBACD,eAAe,EAAE;oBACf,IAAI,EAAE,SAAkB;oBACxB,WAAW,EAAE,+OAA+O;oBAC5P,OAAO,EAAE,KAAK;iBACf;gBACD,GAAG,sBAAsB;gBACzB,GAAG,sBAAsB;aAC1B;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IAED,sBAAsB,EAAE;QACtB,IAAI,EAAE,wBAAiC;QACvC,WAAW,EAAE,q3BAAq3B;QACl4B,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,GAAG,0BAA0B;gBAC7B,oBAAoB,EAAE;oBACpB,IAAI,EAAE,SAAkB;oBACxB,WAAW,EAAE,kKAAkK;oBAC/K,OAAO,EAAE,KAAK;iBACf;gBACD,eAAe,EAAE;oBACf,IAAI,EAAE,SAAkB;oBACxB,WAAW,EAAE,8QAA8Q;oBAC3R,OAAO,EAAE,KAAK;iBACf;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,upBAAupB;oBACpqB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC;oBAC5C,OAAO,EAAE,MAAM;iBAChB;gBACD,GAAG,sBAAsB;aAC1B;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IAED,UAAU,EAAE;QACV,IAAI,EAAE,YAAqB;QAC3B,WAAW,EAAE,u4BAAu4B;QACp5B,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,GAAG,0BAA0B;gBAC7B,WAAW,EAAE;oBACX,IAAI,EAAE,SAAkB;oBACxB,WAAW,EAAE,oDAAoD;oBACjE,OAAO,EAAE,IAAI;iBACd;gBACD,GAAG,sBAAsB;aAC1B;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IAED,sBAAsB,EAAE;QACtB,IAAI,EAAE,wBAAiC;QACvC,WAAW,EAAE,4vBAA4vB;QACzwB,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,GAAG,0BAA0B;gBAC7B,UAAU,EAAE;oBACV,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,4DAA4D;iBAC1E;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,0DAA0D;iBACxE;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,+NAA+N;oBAC5O,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,GAAG;iBACb;gBACD,GAAG,sBAAsB;aAC1B;YACD,QAAQ,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC;SACrC;KACF;IAED,mBAAmB,EAAE;QACnB,IAAI,EAAE,qBAA8B;QACpC,WAAW,EAAE,gqBAAgqB;QAC7qB,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,GAAG,0BAA0B;gBAC7B,OAAO,EAAE;oBACP,IAAI,EAAE,OAAgB;oBACtB,WAAW,EAAE,oIAAoI;oBACjJ,KAAK,EAAE;wBACL,IAAI,EAAE,QAAiB;wBACvB,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,CAAC;qBACpE;iBACF;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,8FAA8F;oBAC3G,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,CAAC;iBACX;gBACD,GAAG,sBAAsB;gBACzB,GAAG,sBAAsB;aAC1B;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IAED,oBAAoB,EAAE;QACpB,IAAI,EAAE,sBAA+B;QACrC,WAAW,EAAE,0QAA0Q;QACvR,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;SACb;KACF;IAED,eAAe,EAAE;QACf,IAAI,EAAE,iBAA0B;QAChC,WAAW,EAAE,0hBAA0hB;QACviB,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,sEAAsE;iBACpF;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,yDAAyD;oBACtE,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,CAAC;iBACX;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IAED,eAAe,EAAE;QACf,IAAI,EAAE,iBAA0B;QAChC,WAAW,EAAE,y1BAAy1B;QACt2B,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,GAAG,0BAA0B;gBAC7B,QAAQ,EAAE;oBACR,IAAI,EAAE,SAAkB;oBACxB,WAAW,EAAE,sIAAsI;oBACnJ,OAAO,EAAE,KAAK;iBACf;gBACD,aAAa,EAAE;oBACb,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,iIAAiI;oBAC9I,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,CAAC;iBACX;aACF;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IAED,qBAAqB,EAAE;QACrB,IAAI,EAAE,uBAAgC;QACtC,WAAW,EAAE,swBAAswB;QACnxB,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,GAAG,0BAA0B;gBAC7B,QAAQ,EAAE;oBACR,IAAI,EAAE,SAAkB;oBACxB,WAAW,EAAE,iHAAiH;oBAC9H,OAAO,EAAE,KAAK;iBACf;gBACD,aAAa,EAAE;oBACb,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,0KAA0K;oBACvL,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,CAAC;iBACX;aACF;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IAED,mBAAmB,EAAE;QACnB,IAAI,EAAE,qBAA8B;QACpC,WAAW,EAAE,+hCAA+hC;QAC5iC,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,GAAG,0BAA0B;gBAC7B,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,yJAAyJ;oBACtK,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,eAAe,CAAC;oBAC7C,OAAO,EAAE,eAAe;iBACzB;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,SAAkB;oBACxB,WAAW,EAAE,uEAAuE;oBACpF,OAAO,EAAE,KAAK;iBACf;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,SAAkB;oBACxB,WAAW,EAAE,iYAAiY;oBAC9Y,OAAO,EAAE,KAAK;iBACf;gBACD,GAAG,sBAAsB;aAC1B;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF;IAED,sBAAsB,EAAE;QACtB,IAAI,EAAE,wBAAiC;QACvC,WAAW,EAAE,yoBAAyoB;QACtpB,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,GAAG,0BAA0B;gBAC7B,MAAM,EAAE;oBACN,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,mDAAmD;oBAChE,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,GAAG;iBACb;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,oEAAoE;oBACjF,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,EAAE;iBACZ;gBACD,GAAG,sBAAsB;aAC1B;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IAED,oBAAoB,EAAE;QACpB,IAAI,EAAE,sBAA+B;QACrC,WAAW,EAAE,20BAA20B;QACx1B,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,GAAG,0BAA0B;gBAC7B,MAAM,EAAE;oBACN,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,8FAA8F;oBAC3G,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,EAAE;iBACZ;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,+HAA+H;oBAC5I,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC;oBACnC,OAAO,EAAE,MAAM;iBAChB;gBACD,aAAa,EAAE;oBACb,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,0GAA0G;oBACvH,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,CAAC;iBACX;gBACD,GAAG,sBAAsB;aAC1B;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IAED,iBAAiB,EAAE;QACjB,IAAI,EAAE,mBAA4B;QAClC,WAAW,EAAE,m5BAAm5B;QACh6B,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,GAAG,0BAA0B;gBAC7B,MAAM,EAAE;oBACN,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,mDAAmD;oBAChE,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,GAAG;iBACb;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,gTAAgT;oBAC7T,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;oBAC/B,OAAO,EAAE,MAAM;iBAChB;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,iMAAiM;oBAC9M,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,CAAC;iBACX;gBACD,GAAG,sBAAsB;aAC1B;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IAED,aAAa,EAAE;QACb,IAAI,EAAE,eAAwB;QAC9B,WAAW,EAAE,wyBAAwyB;QACrzB,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,0HAA0H;oBACvI,SAAS,EAAE,EAAE;iBACd;gBACD,cAAc,EAAE;oBACd,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,uKAAuK;iBACrL;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,sFAAsF;oBACnG,OAAO,EAAE,CAAC,EAAE;oBACZ,OAAO,EAAE,EAAE;iBACZ;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,uFAAuF;oBACpG,OAAO,EAAE,CAAC,GAAG;oBACb,OAAO,EAAE,GAAG;iBACb;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,oGAAoG;iBAClH;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,gJAAgJ;iBAC9J;gBACD,cAAc,EAAE;oBACd,IAAI,EAAE,OAAgB;oBACtB,WAAW,EAAE,gIAAgI;oBAC7I,KAAK,EAAE;wBACL,IAAI,EAAE,QAAiB;qBACxB;iBACF;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,yDAAyD;iBACvE;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,OAAgB;oBACtB,KAAK,EAAE;wBACL,IAAI,EAAE,QAAiB;qBACxB;oBACD,WAAW,EAAE,oLAAoL;iBAClM;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IAED,oBAAoB,EAAE;QACpB,IAAI,EAAE,sBAA+B;QACrC,WAAW,EAAE,iUAAiU;QAC9U,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;SACb;KACF;IAED,kBAAkB,EAAE;QAClB,IAAI,EAAE,oBAA6B;QACnC,WAAW,EAAE,uNAAuN;QACpO,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,yEAAyE;iBACvF;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IAED,qBAAqB,EAAE;QACrB,IAAI,EAAE,uBAAgC;QACtC,WAAW,EAAE,4JAA4J;QACzK,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAiB;oBACvB,WAAW,EAAE,uEAAuE;iBACrF;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,MAAM,YAAY,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;IAClD,MAAM,KAAK,GAAG,YAAY;SACvB,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;SAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC;IAErD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEjD,IAAI,CAAC;QACH,2BAA2B;QAC3B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAW,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,kEAAkE,CAAC,CAAC;QACnG,CAAC;QAED,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,cAAc;gBACjB,OAAO,MAAM,aAAa,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE,CACpD,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,CAAC,CAClH,CAAC;YAEJ,KAAK,wBAAwB;gBAC3B,OAAO,MAAM,aAAa,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE,CAC9D,0BAA0B,CAAC,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,sBAAsB,CAAC,CACnJ,CAAC;YAEJ,KAAK,YAAY;gBACf,OAAO,MAAM,aAAa,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAClD,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,CAAC,CACxH,CAAC;YAEJ,KAAK,wBAAwB;gBAC3B,OAAO,MAAM,aAAa,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE,CAC9D,0BAA0B,CAAC,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,CAAC,CACjG,CAAC;YAEJ,KAAK,qBAAqB;gBACxB,OAAO,MAAM,aAAa,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAC3D,uBAAuB,CACrB,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EACjF,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,CACnD,CACF,CAAC;YAEJ,KAAK,sBAAsB;gBACzB,OAAO,MAAM,aAAa,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAC5D,wBAAwB,CAAC,WAAW,EAAE,gBAAgB,EAAE,cAAc,CAAC,CACxE,CAAC;YAEJ,KAAK,iBAAiB;gBACpB,OAAO,MAAM,aAAa,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE,CACvD,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAC7C,CAAC;YAEJ,KAAK,iBAAiB;gBACpB,OAAO,MAAM,aAAa,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE,CACvD,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAC7E,CAAC;YAEJ,KAAK,uBAAuB;gBAC1B,OAAO,MAAM,aAAa,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE,CAC7D,yBAAyB,CAAC,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAChG,CAAC;YAEJ,KAAK,qBAAqB;gBACxB,OAAO,MAAM,aAAa,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAC3D,uBAAuB,CAAC,IAAI,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAC/D,CAAC;YAEJ,KAAK,wBAAwB;gBAC3B,OAAO,MAAM,aAAa,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE,CAC9D,0BAA0B,CAAC,IAAI,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAClE,CAAC;YAEJ,KAAK,sBAAsB;gBACzB,OAAO,MAAM,aAAa,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAC5D,wBAAwB,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAC/F,CAAC;YAEJ,KAAK,mBAAmB;gBACtB,OAAO,MAAM,aAAa,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE,CACzD,qBAAqB,CACnB,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAClD,YAAY,EAAE,gBAAgB,CAC/B,CACF,CAAC;YAEJ,KAAK,eAAe;gBAClB,OAAO,MAAM,aAAa,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE,CACrD,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAC1D,CAAC;YAEJ,KAAK,sBAAsB;gBACzB,OAAO,MAAM,aAAa,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAC5D,wBAAwB,CAAC,aAAa,CAAC,CACxC,CAAC;YAEJ,KAAK,oBAAoB;gBACvB,OAAO,MAAM,aAAa,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAC1D,sBAAsB,CAAC,IAAI,EAAE,aAAa,CAAC,CAC5C,CAAC;YAEJ,KAAK,uBAAuB;gBAC1B,OAAO,MAAM,aAAa,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE,CAC7D,yBAAyB,CAAC,IAAI,EAAE,aAAa,CAAC,CAC/C,CAAC;YAEJ;gBACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,mDAAmD;QACnD,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpE,sCAAsC;QACtC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAc,EAAE;YACnD,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9D,CAAC,CAAC;QACH,4CAA4C;QAC5C,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAc,CAAC,CAAC;QAEvD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,WAAW;iBAClB;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH;;GAEG;AACH;;;;;;;;GAQG;AACH,SAAS,0BAA0B;IACjC,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,OAAO,EAAE,CAAC;QACtD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,wBAAwB,CAAC,EAAE,CAAC;QACpD,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,sDAAsD,EAAE;QAClE,KAAK,EAAE,cAAc,CAAC,MAAM;KAC7B,CAAC,CAAC;IAEH,gFAAgF;IAChF,kCAAkC;IAClC,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,KAAK,kBAAkB,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,oCAAoC;IACpC,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACxC,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,+BAA+B,CAAC,CAAC;QAE/D,IAAI,CAAC;YACH,kCAAkC;YAClC,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAEjC,wBAAwB;YACxB,WAAW,CAAC,UAAU,EAAE,CAAC;YACzB,gBAAgB,CAAC,UAAU,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAE7B,6BAA6B;YAC7B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAE7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAc,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;YACxC,OAAO,EAAE,cAAc;YACvB,YAAY,EAAE,WAAW,CAAC,OAAO;YACjC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;YACzC,YAAY,EAAE,UAAU,CAAC,eAAe,EAAE,CAAC,MAAM;YACjD,QAAQ,EAAE,UAAU,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SAClD,CAAC,CAAC;QAEH,0EAA0E;QAC1E,kEAAkE;QAClE,0BAA0B,EAAE,CAAC;QAE7B,iDAAiD;QACjD,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;YAC3B,gBAAgB,EAAE,cAAc;YAChC,aAAa,EAAE,4DAA4D;YAC3E,mBAAmB,EAAE,wEAAwE;YAC7F,aAAa,EAAE,+EAA+E;SAC/F,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAc,CAAC,CAAC;QACvD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAE7C,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;QAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,6BAA6B;QACtC,KAAK,EAAE;YACL,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC/D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SACxD;KACF,CAAC,CAAC,CAAC;IAEJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Service for fetching Google Pollen API (`pollen.googleapis.com`) day-1
3
+ * forecasts — the **optional keyed global fallback** for pollen data.
4
+ *
5
+ * Open-Meteo's air-quality endpoint carries pollen only from the CAMS
6
+ * *European* model: real grains/m³ in Europe, all-null everywhere else. This
7
+ * service exists purely to fill that gap for the rest of the world when the
8
+ * caller has configured a `GOOGLE_POLLEN_API_KEY` — see
9
+ * `docs/plans/global-pollen-fallback-plan.md` D2/D3. **Europe keeps the richer
10
+ * keyless CAMS grains/m³ data and never contacts this service** — the
11
+ * air-quality handler only calls in when every CAMS species comes back null.
12
+ *
13
+ * **Security: the key lives in the URL (query string).** Error mapping below
14
+ * never logs or throws the request URL, and never interpolates the raw axios
15
+ * error message/object into a thrown message or a log call — every thrown
16
+ * error is a fixed, pre-written string (the `firms.ts`/`nifc.ts`
17
+ * fixed-message-per-bucket style), so the key can never leak through a log
18
+ * line or an error surfaced to a caller. Logs carry only `{ status, code }`;
19
+ * coordinates in log metadata go through `redactCoordinatesForLogging`.
20
+ */
21
+ import type { GooglePollenDailyInfo } from '../types/googlePollen.js';
22
+ /**
23
+ * Thrown when the Google Pollen API rejects the configured
24
+ * `GOOGLE_POLLEN_API_KEY` (HTTP 400/403 with a key-rejection marker in the
25
+ * response body — see `mapPollenApiError`). Deliberately carries a fixed,
26
+ * sanitized message — never the key or the request URL — so callers (the
27
+ * air-quality handler) can catch this specific case and render a
28
+ * misconfiguration note without ever touching the rejected key again.
29
+ *
30
+ * Not `ApiError` — `ApiServiceName` (`src/errors/ApiError.ts`) is a closed
31
+ * union and this service deliberately stays outside it, mirroring
32
+ * `FIRMSKeyRejectedError`.
33
+ */
34
+ export declare class GooglePollenKeyRejectedError extends Error {
35
+ constructor();
36
+ }
37
+ export interface GooglePollenServiceConfig {
38
+ timeout?: number;
39
+ /** Overrides the `GOOGLE_POLLEN_API_KEY` env var — primarily for tests. */
40
+ apiKey?: string;
41
+ }
42
+ export declare class GooglePollenService {
43
+ private client;
44
+ private cache;
45
+ private readonly apiKey;
46
+ constructor(config?: GooglePollenServiceConfig);
47
+ /**
48
+ * Get cache statistics
49
+ */
50
+ getCacheStats(): import("../utils/cache.js").CacheStats;
51
+ /**
52
+ * Clear the cache
53
+ */
54
+ clearCache(): void;
55
+ /**
56
+ * True when a non-empty Google Pollen API key is configured.
57
+ */
58
+ isKeyAvailable(): boolean;
59
+ /**
60
+ * Day-1 ("current") pollen forecast for a location.
61
+ *
62
+ * Returns `undefined` when the region has no data (uncovered region, or an
63
+ * empty/absent `dailyInfo`) — that outcome is cached as a null sentinel so
64
+ * the same location isn't re-probed for the TTL. **No retries.**
65
+ *
66
+ * @throws {GooglePollenKeyRejectedError} the configured key was rejected
67
+ * @throws {Error} no key configured, invalid coordinates, or any other failure
68
+ */
69
+ getCurrentPollen(latitude: number, longitude: number): Promise<GooglePollenDailyInfo | undefined>;
70
+ private fetchCurrentPollen;
71
+ }
72
+ //# sourceMappingURL=googlePollen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"googlePollen.d.ts","sourceRoot":"","sources":["../../src/services/googlePollen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AASH,OAAO,KAAK,EAAE,qBAAqB,EAAwB,MAAM,0BAA0B,CAAC;AAE5F;;;;;;;;;;;GAWG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,cAGC;CACF;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA0BD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAgB;IAI9B,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAE5C,YAAY,MAAM,GAAE,yBAA8B,EAejD;IAED;;OAEG;IACH,aAAa,2CAEZ;IAED;;OAEG;IACH,UAAU,IAAI,IAAI,CAEjB;IAED;;OAEG;IACH,cAAc,IAAI,OAAO,CAExB;IAED;;;;;;;;;OASG;IACG,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CA4B5C;YAEa,kBAAkB;CAgDjC"}
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Service for fetching Google Pollen API (`pollen.googleapis.com`) day-1
3
+ * forecasts — the **optional keyed global fallback** for pollen data.
4
+ *
5
+ * Open-Meteo's air-quality endpoint carries pollen only from the CAMS
6
+ * *European* model: real grains/m³ in Europe, all-null everywhere else. This
7
+ * service exists purely to fill that gap for the rest of the world when the
8
+ * caller has configured a `GOOGLE_POLLEN_API_KEY` — see
9
+ * `docs/plans/global-pollen-fallback-plan.md` D2/D3. **Europe keeps the richer
10
+ * keyless CAMS grains/m³ data and never contacts this service** — the
11
+ * air-quality handler only calls in when every CAMS species comes back null.
12
+ *
13
+ * **Security: the key lives in the URL (query string).** Error mapping below
14
+ * never logs or throws the request URL, and never interpolates the raw axios
15
+ * error message/object into a thrown message or a log call — every thrown
16
+ * error is a fixed, pre-written string (the `firms.ts`/`nifc.ts`
17
+ * fixed-message-per-bucket style), so the key can never leak through a log
18
+ * line or an error surfaced to a caller. Logs carry only `{ status, code }`;
19
+ * coordinates in log metadata go through `redactCoordinatesForLogging`.
20
+ */
21
+ import axios from 'axios';
22
+ import { Cache } from '../utils/cache.js';
23
+ import { CacheConfig } from '../config/cache.js';
24
+ import { GOOGLE_POLLEN_API_KEY } from '../config/api.js';
25
+ import { validateLatitude, validateLongitude } from '../utils/validation.js';
26
+ import { logger, redactCoordinatesForLogging } from '../utils/logger.js';
27
+ import { getUserAgent } from '../utils/version.js';
28
+ /**
29
+ * Thrown when the Google Pollen API rejects the configured
30
+ * `GOOGLE_POLLEN_API_KEY` (HTTP 400/403 with a key-rejection marker in the
31
+ * response body — see `mapPollenApiError`). Deliberately carries a fixed,
32
+ * sanitized message — never the key or the request URL — so callers (the
33
+ * air-quality handler) can catch this specific case and render a
34
+ * misconfiguration note without ever touching the rejected key again.
35
+ *
36
+ * Not `ApiError` — `ApiServiceName` (`src/errors/ApiError.ts`) is a closed
37
+ * union and this service deliberately stays outside it, mirroring
38
+ * `FIRMSKeyRejectedError`.
39
+ */
40
+ export class GooglePollenKeyRejectedError extends Error {
41
+ constructor() {
42
+ super('Google Pollen API key was rejected by the service');
43
+ this.name = 'GooglePollenKeyRejectedError';
44
+ }
45
+ }
46
+ const POLLEN_API_URL = 'https://pollen.googleapis.com/v1/forecast:lookup';
47
+ // **Live-verified 2026-08-18** (upstream (f) in the design plan): a rejected
48
+ // key returns HTTP 400 with a body carrying both `API key not valid` and
49
+ // `API_KEY_INVALID`. `PERMISSION_DENIED` was not observed (it belongs to an
50
+ // API-not-enabled / key-restricted-away project) and is kept as a defensive
51
+ // third marker.
52
+ const KEY_REJECTION_MARKERS = ['API_KEY_INVALID', 'API key not valid', 'PERMISSION_DENIED'];
53
+ // **Live-verified 2026-08-18:** a region Google does not cover (open ocean,
54
+ // Antarctica) answers HTTP 400 `INVALID_ARGUMENT` with this message — *not*
55
+ // the HTTP 200 with an empty `dailyInfo` the design anticipated. That is a
56
+ // "no data here" answer rather than a fault, so it resolves to `undefined`
57
+ // and caches the null sentinel instead of throwing; otherwise an uncovered
58
+ // location would re-query Google on every single call, burning quota the
59
+ // TTL was meant to protect.
60
+ //
61
+ // Deliberately matched on this specific message, not on the status: a
62
+ // genuinely malformed request is *also* 400 `INVALID_ARGUMENT`, and silently
63
+ // caching that as "no pollen here" would mask a real bug for the whole TTL.
64
+ // If Google rewords the message the match simply fails and the throwing path
65
+ // takes over, which still ends at a silent no-section — safe degradation.
66
+ const LOCATION_UNAVAILABLE_MARKER = 'Information is unavailable for this location';
67
+ export class GooglePollenService {
68
+ client;
69
+ // Cached value distinguishes "not yet cached" (Cache.get -> undefined) from
70
+ // a cached "no data for this location" result (Cache.get -> null) so an
71
+ // uncovered region isn't re-probed for the TTL — see getCurrentPollen.
72
+ cache;
73
+ apiKey;
74
+ constructor(config = {}) {
75
+ const { timeout = CacheConfig.apiTimeoutMs, apiKey = GOOGLE_POLLEN_API_KEY } = config;
76
+ this.apiKey = apiKey;
77
+ this.cache = new Cache(CacheConfig.maxSize);
78
+ this.client = axios.create({
79
+ timeout,
80
+ headers: {
81
+ 'User-Agent': getUserAgent()
82
+ }
83
+ });
84
+ }
85
+ /**
86
+ * Get cache statistics
87
+ */
88
+ getCacheStats() {
89
+ return this.cache.getStats();
90
+ }
91
+ /**
92
+ * Clear the cache
93
+ */
94
+ clearCache() {
95
+ this.cache.clear();
96
+ }
97
+ /**
98
+ * True when a non-empty Google Pollen API key is configured.
99
+ */
100
+ isKeyAvailable() {
101
+ return !!this.apiKey && this.apiKey.trim().length > 0;
102
+ }
103
+ /**
104
+ * Day-1 ("current") pollen forecast for a location.
105
+ *
106
+ * Returns `undefined` when the region has no data (uncovered region, or an
107
+ * empty/absent `dailyInfo`) — that outcome is cached as a null sentinel so
108
+ * the same location isn't re-probed for the TTL. **No retries.**
109
+ *
110
+ * @throws {GooglePollenKeyRejectedError} the configured key was rejected
111
+ * @throws {Error} no key configured, invalid coordinates, or any other failure
112
+ */
113
+ async getCurrentPollen(latitude, longitude) {
114
+ validateLatitude(latitude);
115
+ validateLongitude(longitude);
116
+ if (!this.isKeyAvailable()) {
117
+ throw new Error('Google Pollen API key is not configured.');
118
+ }
119
+ // Rounded to 2 decimal places (~1.1km) — FIRMS precedent — plenty
120
+ // precise for a cache key while keeping nearby repeat queries as hits.
121
+ const cacheKey = Cache.generateKey('google-pollen', latitude.toFixed(2), longitude.toFixed(2));
122
+ if (CacheConfig.enabled) {
123
+ const cached = this.cache.get(cacheKey);
124
+ if (cached !== undefined) {
125
+ const redacted = redactCoordinatesForLogging(latitude, longitude);
126
+ logger.info('Google Pollen cache hit', { lat: redacted.lat, lon: redacted.lon });
127
+ return cached === null ? undefined : cached;
128
+ }
129
+ }
130
+ const dailyInfo = await this.fetchCurrentPollen(latitude, longitude);
131
+ if (CacheConfig.enabled) {
132
+ this.cache.set(cacheKey, dailyInfo ?? null, CacheConfig.ttl.googlePollen);
133
+ }
134
+ return dailyInfo;
135
+ }
136
+ async fetchCurrentPollen(latitude, longitude) {
137
+ // The key rides in the request params, not the logged metadata below —
138
+ // never log or throw this value (see module doc comment).
139
+ const key = this.apiKey; // isKeyAvailable() already checked by the caller
140
+ const redacted = redactCoordinatesForLogging(latitude, longitude);
141
+ logger.info('Querying Google Pollen API', { lat: redacted.lat, lon: redacted.lon });
142
+ try {
143
+ const response = await this.client.get(POLLEN_API_URL, {
144
+ params: {
145
+ key,
146
+ 'location.latitude': latitude,
147
+ 'location.longitude': longitude,
148
+ days: 1,
149
+ languageCode: 'en'
150
+ }
151
+ });
152
+ const dailyInfo = response.data?.dailyInfo;
153
+ if (!dailyInfo || dailyInfo.length === 0) {
154
+ logger.info('Google Pollen API returned no daily data for this location');
155
+ return undefined;
156
+ }
157
+ return dailyInfo[0];
158
+ }
159
+ catch (error) {
160
+ // Deliberately do not pass the raw axios error object to the logger —
161
+ // it carries the request config (including the key in `params`). Only
162
+ // fixed, sanitized fields are logged.
163
+ const status = axios.isAxiosError(error) ? error.response?.status : undefined;
164
+ const code = axios.isAxiosError(error) ? error.code : undefined;
165
+ // An uncovered region is expected, not a fault — resolve to "no data"
166
+ // so the caller caches the null sentinel and stops re-probing.
167
+ if (isLocationUnavailable(error)) {
168
+ logger.info('Google Pollen has no coverage for this location', { status });
169
+ return undefined;
170
+ }
171
+ logger.error('Google Pollen API request failed', undefined, { status, code });
172
+ throw mapPollenApiError(error);
173
+ }
174
+ }
175
+ }
176
+ /**
177
+ * Stringify an axios error's response body for marker searching. The body may
178
+ * arrive as a string, or as a JSON-parsed object shape like
179
+ * `{ error: { status: 'INVALID_ARGUMENT', message: '…' } }` — coerce both.
180
+ * Never includes the request URL, so this is safe to search but must never be
181
+ * logged or thrown.
182
+ */
183
+ function responseBodyText(error) {
184
+ if (!axios.isAxiosError(error)) {
185
+ return '';
186
+ }
187
+ const rawData = error.response?.data;
188
+ if (typeof rawData === 'object' && rawData !== null) {
189
+ try {
190
+ return JSON.stringify(rawData);
191
+ }
192
+ catch {
193
+ // JSON.stringify can throw on circular structures.
194
+ return String(rawData);
195
+ }
196
+ }
197
+ return String(rawData ?? '');
198
+ }
199
+ /**
200
+ * True for the live-verified "this location has no pollen coverage" answer —
201
+ * HTTP 400 whose body carries `LOCATION_UNAVAILABLE_MARKER` and *no*
202
+ * key-rejection marker. See that constant for why the match is on the message
203
+ * rather than the status.
204
+ */
205
+ function isLocationUnavailable(error) {
206
+ if (!axios.isAxiosError(error) || error.response?.status !== 400) {
207
+ return false;
208
+ }
209
+ const bodyText = responseBodyText(error);
210
+ if (KEY_REJECTION_MARKERS.some(marker => bodyText.includes(marker))) {
211
+ return false;
212
+ }
213
+ return bodyText.includes(LOCATION_UNAVAILABLE_MARKER);
214
+ }
215
+ /**
216
+ * Map a Google Pollen API axios failure to a fixed, sanitized `Error` (or
217
+ * `GooglePollenKeyRejectedError` for a confirmed key rejection). Copies the
218
+ * `firms.ts` `mapAreaApiError` fixed-message-per-bucket style; never
219
+ * interpolates `error.message` or the raw response body into a thrown
220
+ * message.
221
+ *
222
+ * The key-rejection markers below are **web-verified only** (design plan
223
+ * upstream (f)) — to be confirmed/adjusted once T6 runs live verification
224
+ * against a real key.
225
+ */
226
+ function mapPollenApiError(error) {
227
+ if (axios.isAxiosError(error)) {
228
+ if (error.code === 'ECONNABORTED') {
229
+ return new Error('Google Pollen API request timed out. The service may be temporarily unavailable.');
230
+ }
231
+ const status = error.response?.status;
232
+ if (status === 400 || status === 403) {
233
+ const bodyText = responseBodyText(error);
234
+ if (KEY_REJECTION_MARKERS.some(marker => bodyText.includes(marker))) {
235
+ return new GooglePollenKeyRejectedError();
236
+ }
237
+ return new Error('Invalid query parameters for Google Pollen API.');
238
+ }
239
+ if (status === 429) {
240
+ return new Error('Google Pollen API monthly quota exceeded. Please try again later.');
241
+ }
242
+ if (status !== undefined) {
243
+ return new Error('Google Pollen API returned an error response.');
244
+ }
245
+ return new Error('Failed to reach Google Pollen API. Please check your network connection.');
246
+ }
247
+ return new Error('Failed to fetch pollen data from Google Pollen API.');
248
+ }
249
+ //# sourceMappingURL=googlePollen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"googlePollen.js","sourceRoot":"","sources":["../../src/services/googlePollen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Google Pollen API response types
3
+ *
4
+ * Subset-only TypeScript interfaces for the Google Pollen API `v1/forecast:lookup`
5
+ * response. All fields are optional as a defensive measure.
6
+ *
7
+ * Important: `indexInfo` is **omitted entirely** for out-of-season pollen types
8
+ * (upstream design D3/C). Every use of `indexInfo` must guard against undefined.
9
+ *
10
+ * Field casing is web-verified (2026-08-18). Exact casing is on the T6
11
+ * live-verification to-verify list.
12
+ *
13
+ * Reference: https://developers.google.com/maps/documentation/pollen/overview
14
+ */
15
+ /**
16
+ * Top-level response from the Google Pollen API
17
+ */
18
+ export interface GooglePollenResponse {
19
+ dailyInfo?: GooglePollenDailyInfo[];
20
+ }
21
+ /**
22
+ * Daily pollen information for a single date
23
+ */
24
+ export interface GooglePollenDailyInfo {
25
+ date?: GooglePollenDate;
26
+ pollenTypeInfo?: GooglePollenTypeInfo[];
27
+ plantInfo?: GooglePollenPlantInfo[];
28
+ }
29
+ /**
30
+ * Date representation matching Google's Date message format
31
+ */
32
+ export interface GooglePollenDate {
33
+ year?: number;
34
+ month?: number;
35
+ day?: number;
36
+ }
37
+ /**
38
+ * Pollen type information (GRASS, TREE, WEED)
39
+ */
40
+ export interface GooglePollenTypeInfo {
41
+ code?: string;
42
+ displayName?: string;
43
+ inSeason?: boolean;
44
+ indexInfo?: GooglePollenIndexInfo;
45
+ }
46
+ /**
47
+ * Universal Pollen Index (UPI) information
48
+ *
49
+ * `value` is a number 0-5 indicating pollen levels.
50
+ * `category` is a human-readable string like "Low", "Moderate", "High", "Very High".
51
+ *
52
+ * Note: This field is omitted entirely for out-of-season pollen types.
53
+ * All uses must guard: `if (typeInfo.indexInfo?.value !== undefined)`
54
+ */
55
+ export interface GooglePollenIndexInfo {
56
+ value?: number;
57
+ category?: string;
58
+ }
59
+ /**
60
+ * Plant-specific pollen information
61
+ */
62
+ export interface GooglePollenPlantInfo {
63
+ displayName?: string;
64
+ inSeason?: boolean;
65
+ indexInfo?: GooglePollenIndexInfo;
66
+ }
67
+ //# sourceMappingURL=googlePollen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"googlePollen.d.ts","sourceRoot":"","sources":["../../src/types/googlePollen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,cAAc,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACxC,SAAS,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,qBAAqB,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,qBAAqB,CAAC;CACnC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Google Pollen API response types
3
+ *
4
+ * Subset-only TypeScript interfaces for the Google Pollen API `v1/forecast:lookup`
5
+ * response. All fields are optional as a defensive measure.
6
+ *
7
+ * Important: `indexInfo` is **omitted entirely** for out-of-season pollen types
8
+ * (upstream design D3/C). Every use of `indexInfo` must guard against undefined.
9
+ *
10
+ * Field casing is web-verified (2026-08-18). Exact casing is on the T6
11
+ * live-verification to-verify list.
12
+ *
13
+ * Reference: https://developers.google.com/maps/documentation/pollen/overview
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=googlePollen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"googlePollen.js","sourceRoot":"","sources":["../../src/types/googlePollen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dangahagan/weather-mcp",
3
- "version": "1.21.0",
3
+ "version": "1.22.0",
4
4
  "description": "MCP server giving AI assistants 17 weather tools with zero API keys: global forecasts, current conditions, alerts, air quality, marine conditions, lightning detection, radar imagery, river levels, wildfire tracking, and historical weather back to 1940. Built entirely on free public APIs (NOAA, Open-Meteo, USGS, NIFC).",
5
5
  "mcpName": "io.github.dgahagan/weather-mcp",
6
6
  "main": "dist/index.js",