@dangahagan/weather-mcp 1.31.0 → 1.31.2
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 +8 -6
- package/dist/handlers/criticalAlertBanner.d.ts +30 -10
- package/dist/handlers/criticalAlertBanner.d.ts.map +1 -1
- package/dist/handlers/criticalAlertBanner.js +92 -17
- package/dist/handlers/criticalAlertBanner.js.map +1 -1
- package/dist/handlers/savedLocationsHandler.d.ts.map +1 -1
- package/dist/handlers/savedLocationsHandler.js +25 -8
- package/dist/handlers/savedLocationsHandler.js.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/services/locationStore.d.ts +51 -6
- package/dist/services/locationStore.d.ts.map +1 -1
- package/dist/services/locationStore.js +169 -39
- package/dist/services/locationStore.js.map +1 -1
- package/dist/utils/geography.d.ts +65 -1
- package/dist/utils/geography.d.ts.map +1 -1
- package/dist/utils/geography.js +72 -1
- package/dist/utils/geography.js.map +1 -1
- package/dist/utils/locationResolver.d.ts.map +1 -1
- package/dist/utils/locationResolver.js +10 -2
- package/dist/utils/locationResolver.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@dangahagan/weather-mcp)
|
|
4
4
|
[](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.dgahagan/weather-mcp)
|
|
5
5
|
[](https://opensource.org/licenses/MIT)
|
|
6
|
-
[](./docs/testing/TEST_SUITE_README.md)
|
|
7
7
|
[](https://nodejs.org)
|
|
8
8
|
|
|
9
9
|
**Give your AI assistant real weather data — 17 tools, zero API keys, zero signup, zero cost.**
|
|
@@ -58,7 +58,7 @@ Choose this one if you want:
|
|
|
58
58
|
|
|
59
59
|
- **Genuinely free** — every data source is a free public API. No trial that expires, no credit card, no rate-limited "free tier" bait.
|
|
60
60
|
- **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.)
|
|
61
|
-
- **Fully open source** — MIT licensed, readable TypeScript, 3,
|
|
61
|
+
- **Fully open source** — MIT licensed, readable TypeScript, 3,574 tests. Audit it, fork it, fix it.
|
|
62
62
|
- **Privacy-respecting** — your queries go directly from your machine to public weather APIs. No middleman server, no telemetry.
|
|
63
63
|
- **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.
|
|
64
64
|
|
|
@@ -70,11 +70,11 @@ All 17 tools, documented in detail in **[docs/TOOLS.md](./docs/TOOLS.md)**:
|
|
|
70
70
|
|
|
71
71
|
| Tool | What it does | Coverage |
|
|
72
72
|
|------|-------------|----------|
|
|
73
|
-
| `get_forecast` | Daily/hourly forecasts up to 16 days by coordinates, saved location, or city name (NOAA publishes 7 days daily and ~6.5 days hourly in the US, and says so when you ask for more; `source="openmeteo"` reaches the full range); sunrise/sunset, UV, precipitation probability, optional climate-normals comparison, optional moon phase & twilight almanac, optional five-model agreement comparison When the National Weather Service has a life-threatening alert active for a
|
|
74
|
-
| `get_current_conditions` | Current weather: temperature, wind, humidity, pressure; NOAA station observations in the US (plus heat index/wind chill, snow depth, optional NOAA fire-weather indices), Open-Meteo model data elsewhere (with an optional computed Fosberg fire-weather index), or real airport station observations worldwide with `source="metar"`. Always states the observation's age, and automatically falls back to a fresher nearby station when the nearest one has gone dark. In extreme conditions automatically adds frostbite time-to-onset (computed wind chill) or heat-stress context (estimated WBGT) When the National Weather Service has a life-threatening alert active for a
|
|
73
|
+
| `get_forecast` | Daily/hourly forecasts up to 16 days by coordinates, saved location, or city name (NOAA publishes 7 days daily and ~6.5 days hourly in the US, and says so when you ask for more; `source="openmeteo"` reaches the full range); sunrise/sunset, UV, precipitation probability, optional climate-normals comparison, optional moon phase & twilight almanac, optional five-model agreement comparison When the National Weather Service has a life-threatening alert active for a point in the United States or an NWS-served territory, its warning is surfaced at the top of the response before the report — absence of the banner is not an all-clear, so call `get_alerts` for the authoritative answer | 🌍 Global |
|
|
74
|
+
| `get_current_conditions` | Current weather: temperature, wind, humidity, pressure; NOAA station observations in the US (plus heat index/wind chill, snow depth, optional NOAA fire-weather indices), Open-Meteo model data elsewhere (with an optional computed Fosberg fire-weather index), or real airport station observations worldwide with `source="metar"`. Always states the observation's age, and automatically falls back to a fresher nearby station when the nearest one has gone dark. In extreme conditions automatically adds frostbite time-to-onset (computed wind chill) or heat-stress context (estimated WBGT) When the National Weather Service has a life-threatening alert active for a point in the United States or an NWS-served territory, its warning is surfaced at the top of the response before the report — absence of the banner is not an all-clear, so call `get_alerts` for the authoritative answer | 🌍 Global |
|
|
75
75
|
| `get_alerts` | Active watches, warnings, and advisories sorted by severity; official national warnings for the US (NOAA), Canada (ECCC), 38 European countries (MeteoAlarm), India (NDMA SACHET), the Philippines (PAGASA), Indonesia (BMKG), and Japan (JMA) | 🇺🇸 🇨🇦 🇪🇺 🇮🇳 🇵🇭 🇮🇩 🇯🇵 |
|
|
76
76
|
| `get_historical_weather` | Hourly/daily observations from 1940 to present | 🌍 Global |
|
|
77
|
-
| `get_weather_summary` | One-call overview combining current conditions, forecast, and alerts (optionally air quality and lightning); a life-threatening
|
|
77
|
+
| `get_weather_summary` | One-call overview combining current conditions, forecast, and alerts (optionally air quality and lightning); a life-threatening NWS alert is surfaced once above the whole summary, not once per section | 🌍 Global |
|
|
78
78
|
| `search_location` | Geocode place names to coordinates ("Paris" → 48.85, 2.35) | 🌍 Global |
|
|
79
79
|
| `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 |
|
|
80
80
|
| `get_marine_conditions` | Wave height, swell, ocean currents, sea state on WMO Code Table 3700 (Douglas sea scale) with a severity marker and legend — includes Great Lakes and major US bays; forecast up to 16 days | 🌍 Global |
|
|
@@ -194,6 +194,8 @@ Claude Desktop, Claude Code, Cline, Cursor, Zed, VS Code (GitHub Copilot), LM St
|
|
|
194
194
|
|
|
195
195
|
Restart your MCP client after upgrading. See [CHANGELOG.md](./CHANGELOG.md) for release notes.
|
|
196
196
|
|
|
197
|
+
**Running more than one MCP client on this machine? Restart every one of them.** All clients share a single `~/.weather-mcp/locations.json`, and a client still running a version before 1.31.2 writes that file from a stale in-memory copy — it will delete saved locations that an upgraded client has since written. The hazard is the un-upgraded instance, so the protection holds only once every client on the machine has been restarted onto the new version.
|
|
198
|
+
|
|
197
199
|
## Configuration
|
|
198
200
|
|
|
199
201
|
**Most users need zero configuration.** Everything below is optional.
|
|
@@ -388,7 +390,7 @@ Being honest about what free public data can and can't do:
|
|
|
388
390
|
```bash
|
|
389
391
|
npm run build # Compile TypeScript
|
|
390
392
|
npm run dev # Run in development mode
|
|
391
|
-
npm test # Run all 3,
|
|
393
|
+
npm test # Run all 3,574 tests
|
|
392
394
|
npm run test:coverage # Coverage report
|
|
393
395
|
npm run audit # Dependency vulnerability scan
|
|
394
396
|
```
|
|
@@ -25,9 +25,18 @@ import type { ResolvedLocation } from '../utils/locationResolver.js';
|
|
|
25
25
|
*
|
|
26
26
|
* In order:
|
|
27
27
|
*
|
|
28
|
-
* 1. **
|
|
29
|
-
*
|
|
30
|
-
*
|
|
28
|
+
* 1. **NWS-jurisdiction pre-filter.** `country_code` when the resolution path
|
|
29
|
+
* knew one, geography otherwise — `isInUS` **or** `isInNwsTerritory`, the
|
|
30
|
+
* latter covering the four territories `isInUS` deliberately leaves out
|
|
31
|
+
* (Guam, the southern Marianas, the USVI, American Samoa). `isInUS` is not
|
|
32
|
+
* widened to absorb them because it backs a *rendered* NWPS coverage claim in
|
|
33
|
+
* `get_river_conditions`, where Puerto Rico is gauged and Guam is not
|
|
34
|
+
* (GOTCHAS G53). The code path is the two sets above, and there are two of
|
|
35
|
+
* them because a code settles `us` and `pr` on its own while the four
|
|
36
|
+
* territory codes must also satisfy `isInNwsTerritory` — `MP` names a
|
|
37
|
+
* territory NWS serves only the southern half of. NOAA is the only upstream
|
|
38
|
+
* in v1 (D2), so a point outside NWS jurisdiction returns without making any
|
|
39
|
+
* request at all.
|
|
31
40
|
* 2. **One fetch, no retries.** `getAlerts` caches on its own point-keyed
|
|
32
41
|
* alerts entry with the five-minute alerts TTL (`src/services/noaa.ts`), so a
|
|
33
42
|
* banner fetch and a real `get_alerts` call within five minutes share one
|
|
@@ -41,11 +50,22 @@ import type { ResolvedLocation } from '../utils/locationResolver.js';
|
|
|
41
50
|
* 4. **All-or-nothing.** With no critical alert this emits nothing — no header,
|
|
42
51
|
* no rule, no "no critical alerts" line.
|
|
43
52
|
*
|
|
44
|
-
* **
|
|
45
|
-
* nothing about
|
|
46
|
-
* positive-assertion-only element and claims nothing
|
|
47
|
-
*
|
|
48
|
-
* and
|
|
53
|
+
* **G53 is not tripped by the pre-filter.** These are bounding boxes, but
|
|
54
|
+
* nothing about any box is rendered: a false negative omits a
|
|
55
|
+
* positive-assertion-only element and claims nothing.
|
|
56
|
+
*
|
|
57
|
+
* **A false positive is not free, and the old wording here was wrong about it.**
|
|
58
|
+
* A point the CONUS or Hawaii box admits but NWS does not serve — Toronto
|
|
59
|
+
* `43.65, -79.38`; Midway `28.21, -177.38`, which sits inside the Hawaii box —
|
|
60
|
+
* draws **HTTP 400 `Parameter "point" is invalid: out of bounds`**, not a
|
|
61
|
+
* 200-empty collection. `NOAAService.makeRequest` (`noaa.ts:133-138`) logs a
|
|
62
|
+
* `securityEvent` warn and throws `InvalidLocationError`; this module's catch
|
|
63
|
+
* logs a second; and `getAlerts` never caches a failure, so every call repeats
|
|
64
|
+
* both. That cost is known, deferred (it needs either a narrowed shared routing
|
|
65
|
+
* box or a 4xx-branch change in `noaa.ts`, both beyond the banner), and it is
|
|
66
|
+
* the reason `isInNwsTerritory`'s boxes are drawn tightly to the islands rather
|
|
67
|
+
* than generously — unlike `isInGreatBritain`, whose false positive is one cheap
|
|
68
|
+
* Nominatim call.
|
|
49
69
|
*
|
|
50
70
|
* @param noaaService The NOAA client; its `getAlerts` is the only method called
|
|
51
71
|
* @param resolved The already-resolved location, carrying `country_code` when known
|
|
@@ -63,8 +83,8 @@ export declare function resolveCriticalAlertBanner(noaaService: NOAAService, res
|
|
|
63
83
|
* and error logging at that single site rather than duplicating either here.
|
|
64
84
|
*
|
|
65
85
|
* An empty banner attaches nothing at all, so a failure with no critical alert
|
|
66
|
-
* — every
|
|
67
|
-
* active — is byte-identical to what it was before.
|
|
86
|
+
* — every point outside NWS jurisdiction, and every point inside it with nothing
|
|
87
|
+
* life-threatening active — is byte-identical to what it was before.
|
|
68
88
|
*
|
|
69
89
|
* @param error The error being thrown; returned unchanged for `throw` chaining
|
|
70
90
|
* @param banner The resolved banner, or `''`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"criticalAlertBanner.d.ts","sourceRoot":"","sources":["../../src/handlers/criticalAlertBanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"criticalAlertBanner.d.ts","sourceRoot":"","sources":["../../src/handlers/criticalAlertBanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AA8ErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CA8DjB;AAYD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAKvF;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQnE"}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* which is pure and zero-I/O. This module is the glue between that and the
|
|
19
19
|
* service, and holds no display logic of its own.
|
|
20
20
|
*/
|
|
21
|
-
import { isInUS } from '../utils/geography.js';
|
|
21
|
+
import { isInUS, isInNwsTerritory } from '../utils/geography.js';
|
|
22
22
|
import { logger } from '../utils/logger.js';
|
|
23
23
|
import { formatCriticalAlertBanner, selectCriticalAlert, } from '../utils/criticalAlert.js';
|
|
24
24
|
/**
|
|
@@ -41,14 +41,71 @@ function httpStatusOf(error) {
|
|
|
41
41
|
}
|
|
42
42
|
return undefined;
|
|
43
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Country codes that settle NWS jurisdiction **on their own**, with no geography.
|
|
46
|
+
*
|
|
47
|
+
* Two sets, not one with a special case: a single set whose membership means
|
|
48
|
+
* different things for different members is how the next reader gets it wrong.
|
|
49
|
+
* The names state the rule.
|
|
50
|
+
*
|
|
51
|
+
* `'pr'` belongs **here and not in `NWS_CODE_PLUS_BOX`, and that is a correctness
|
|
52
|
+
* constraint rather than a style one.** Puerto Rico lives in `isInUS`, *not* in
|
|
53
|
+
* `isInNwsTerritory` — the new predicate covers only the four territories `isInUS`
|
|
54
|
+
* leaves out. Pairing `'pr'` with the territory box would therefore evaluate
|
|
55
|
+
* `false` and silently drop the banner for every Open-Meteo-geocoded Puerto Rico
|
|
56
|
+
* request, turning a coverage fix into a coverage regression. Tidying it across is
|
|
57
|
+
* the obvious wrong move; a mutation row in the plan pins it, and a relocation has
|
|
58
|
+
* the same red set as a deletion.
|
|
59
|
+
*
|
|
60
|
+
* `us` also stays code-alone because making it conditional on a box would silently
|
|
61
|
+
* narrow behaviour this change does not touch.
|
|
62
|
+
*
|
|
63
|
+
* **Which provider emits which value** (G48 — a fixture value the live resolver
|
|
64
|
+
* never produces proves nothing). `us` comes from Census (`geocoding.ts:150`,
|
|
65
|
+
* hard-coded), from Nominatim (`geocoding.ts:239` — OSM resolves every US
|
|
66
|
+
* territory to `US` at country zoom, measured in issue #86 and again 2026-09-18),
|
|
67
|
+
* and from saved locations. The ISO territory codes `GU`/`MP`/`VI`/`AS`/`PR` come
|
|
68
|
+
* **only** from the Open-Meteo geocoder (`geocoding.ts:334`), the last provider in
|
|
69
|
+
* both `GeocodingService` orders (`:443`, `:447`), reached when the first two
|
|
70
|
+
* return nothing. So `pr` is reachable on that path and nowhere else.
|
|
71
|
+
*
|
|
72
|
+
* COFA codes (`fm`, `pw`, `mh`) are absent from both sets deliberately: sovereign
|
|
73
|
+
* countries, `/points` answers 500, out of scope until someone asks.
|
|
74
|
+
*
|
|
75
|
+
* Lower-cased, as `NIFC_COVERED_COUNTRIES` is (`wildfireHandler.ts:68`); these live
|
|
76
|
+
* beside their only consumer because they are not geography facts.
|
|
77
|
+
*/
|
|
78
|
+
const NWS_CODE_ALONE = new Set(['us', 'pr']);
|
|
79
|
+
/**
|
|
80
|
+
* Territory codes that require `isInNwsTerritory` **as well**.
|
|
81
|
+
*
|
|
82
|
+
* A country code is a *fast path* — a resolved location already knows its country,
|
|
83
|
+
* so the common case costs no geography at all — and a fast path must not admit
|
|
84
|
+
* what the authoritative predicate rejects. `MP` is the one code in either set that
|
|
85
|
+
* spans served and unserved area: it names the whole Northern Marianas while NWS
|
|
86
|
+
* accepts only the southern arc, so `'MP'` deciding alone would re-open, through
|
|
87
|
+
* the Open-Meteo geocoder, exactly the northern-CNMI request the box was drawn to
|
|
88
|
+
* prevent — an uncached HTTP 400 and two `securityEvent` warns at the points the
|
|
89
|
+
* box exists to exclude.
|
|
90
|
+
*/
|
|
91
|
+
const NWS_CODE_PLUS_BOX = new Set(['gu', 'mp', 'vi', 'as']);
|
|
44
92
|
/**
|
|
45
93
|
* The banner for this point, or `''` — which is every path but one.
|
|
46
94
|
*
|
|
47
95
|
* In order:
|
|
48
96
|
*
|
|
49
|
-
* 1. **
|
|
50
|
-
*
|
|
51
|
-
*
|
|
97
|
+
* 1. **NWS-jurisdiction pre-filter.** `country_code` when the resolution path
|
|
98
|
+
* knew one, geography otherwise — `isInUS` **or** `isInNwsTerritory`, the
|
|
99
|
+
* latter covering the four territories `isInUS` deliberately leaves out
|
|
100
|
+
* (Guam, the southern Marianas, the USVI, American Samoa). `isInUS` is not
|
|
101
|
+
* widened to absorb them because it backs a *rendered* NWPS coverage claim in
|
|
102
|
+
* `get_river_conditions`, where Puerto Rico is gauged and Guam is not
|
|
103
|
+
* (GOTCHAS G53). The code path is the two sets above, and there are two of
|
|
104
|
+
* them because a code settles `us` and `pr` on its own while the four
|
|
105
|
+
* territory codes must also satisfy `isInNwsTerritory` — `MP` names a
|
|
106
|
+
* territory NWS serves only the southern half of. NOAA is the only upstream
|
|
107
|
+
* in v1 (D2), so a point outside NWS jurisdiction returns without making any
|
|
108
|
+
* request at all.
|
|
52
109
|
* 2. **One fetch, no retries.** `getAlerts` caches on its own point-keyed
|
|
53
110
|
* alerts entry with the five-minute alerts TTL (`src/services/noaa.ts`), so a
|
|
54
111
|
* banner fetch and a real `get_alerts` call within five minutes share one
|
|
@@ -62,11 +119,22 @@ function httpStatusOf(error) {
|
|
|
62
119
|
* 4. **All-or-nothing.** With no critical alert this emits nothing — no header,
|
|
63
120
|
* no rule, no "no critical alerts" line.
|
|
64
121
|
*
|
|
65
|
-
* **
|
|
66
|
-
* nothing about
|
|
67
|
-
* positive-assertion-only element and claims nothing
|
|
68
|
-
*
|
|
69
|
-
* and
|
|
122
|
+
* **G53 is not tripped by the pre-filter.** These are bounding boxes, but
|
|
123
|
+
* nothing about any box is rendered: a false negative omits a
|
|
124
|
+
* positive-assertion-only element and claims nothing.
|
|
125
|
+
*
|
|
126
|
+
* **A false positive is not free, and the old wording here was wrong about it.**
|
|
127
|
+
* A point the CONUS or Hawaii box admits but NWS does not serve — Toronto
|
|
128
|
+
* `43.65, -79.38`; Midway `28.21, -177.38`, which sits inside the Hawaii box —
|
|
129
|
+
* draws **HTTP 400 `Parameter "point" is invalid: out of bounds`**, not a
|
|
130
|
+
* 200-empty collection. `NOAAService.makeRequest` (`noaa.ts:133-138`) logs a
|
|
131
|
+
* `securityEvent` warn and throws `InvalidLocationError`; this module's catch
|
|
132
|
+
* logs a second; and `getAlerts` never caches a failure, so every call repeats
|
|
133
|
+
* both. That cost is known, deferred (it needs either a narrowed shared routing
|
|
134
|
+
* box or a 4xx-branch change in `noaa.ts`, both beyond the banner), and it is
|
|
135
|
+
* the reason `isInNwsTerritory`'s boxes are drawn tightly to the islands rather
|
|
136
|
+
* than generously — unlike `isInGreatBritain`, whose false positive is one cheap
|
|
137
|
+
* Nominatim call.
|
|
70
138
|
*
|
|
71
139
|
* @param noaaService The NOAA client; its `getAlerts` is the only method called
|
|
72
140
|
* @param resolved The already-resolved location, carrying `country_code` when known
|
|
@@ -75,15 +143,22 @@ function httpStatusOf(error) {
|
|
|
75
143
|
*/
|
|
76
144
|
export async function resolveCriticalAlertBanner(noaaService, resolved, timezone) {
|
|
77
145
|
const { latitude, longitude } = resolved;
|
|
78
|
-
// country_code first,
|
|
146
|
+
// country_code first, geography second. A saved or geocoded location already
|
|
79
147
|
// knows its country, so the common case costs no geography at all. Casing
|
|
80
148
|
// follows the upstream source (saved locations store "US", geocoders vary),
|
|
81
149
|
// hence the case-insensitive compare.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
150
|
+
//
|
|
151
|
+
// The conjunction on the territory arm is not decoration: a code from
|
|
152
|
+
// NWS_CODE_PLUS_BOX must also satisfy the box, because `MP` names a territory
|
|
153
|
+
// NWS serves only the southern half of. See the two sets' comments above.
|
|
154
|
+
const countryCode = typeof resolved.country_code === 'string' && resolved.country_code.length > 0
|
|
155
|
+
? resolved.country_code.toLowerCase()
|
|
156
|
+
: undefined;
|
|
157
|
+
const isNwsServed = countryCode !== undefined
|
|
158
|
+
? NWS_CODE_ALONE.has(countryCode) ||
|
|
159
|
+
(NWS_CODE_PLUS_BOX.has(countryCode) && isInNwsTerritory(latitude, longitude))
|
|
160
|
+
: isInUS(latitude, longitude) || isInNwsTerritory(latitude, longitude);
|
|
161
|
+
if (!isNwsServed) {
|
|
87
162
|
return '';
|
|
88
163
|
}
|
|
89
164
|
try {
|
|
@@ -138,8 +213,8 @@ const CRITICAL_ALERT_BANNER = Symbol.for('weather-mcp.critical-alert-banner');
|
|
|
138
213
|
* and error logging at that single site rather than duplicating either here.
|
|
139
214
|
*
|
|
140
215
|
* An empty banner attaches nothing at all, so a failure with no critical alert
|
|
141
|
-
* — every
|
|
142
|
-
* active — is byte-identical to what it was before.
|
|
216
|
+
* — every point outside NWS jurisdiction, and every point inside it with nothing
|
|
217
|
+
* life-threatening active — is byte-identical to what it was before.
|
|
143
218
|
*
|
|
144
219
|
* @param error The error being thrown; returned unchanged for `throw` chaining
|
|
145
220
|
* @param banner The resolved banner, or `''`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"criticalAlertBanner.js","sourceRoot":"","sources":["../../src/handlers/criticalAlertBanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"criticalAlertBanner.js","sourceRoot":"","sources":["../../src/handlers/criticalAlertBanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"savedLocationsHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/savedLocationsHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA6C5D;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,OAAO,EACb,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,
|
|
1
|
+
{"version":3,"file":"savedLocationsHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/savedLocationsHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA6C5D;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,OAAO,EACb,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,CA+R7D;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAsF7D;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAiF7D;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAyC7D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,aAAa,GAC3B;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAkBzC"}
|
|
@@ -171,27 +171,44 @@ export async function handleSaveLocation(args, locationStore, nominatimService)
|
|
|
171
171
|
else {
|
|
172
172
|
throw new Error('Either location_query OR (latitude + longitude + name) must be provided');
|
|
173
173
|
}
|
|
174
|
+
// Re-read the merge base AFTER every await on this path, and use it for both
|
|
175
|
+
// the omitted-metadata restoration below and the update/create verb.
|
|
176
|
+
//
|
|
177
|
+
// The pre-await read at the top of this function still decides isPartialUpdate
|
|
178
|
+
// — and, on that branch only, the coordinates, timezone and admin fields —
|
|
179
|
+
// because that branch never awaits. It must NOT supply metadata: a full re-save
|
|
180
|
+
// by location_query awaits the geocoder above, and a second client on the same
|
|
181
|
+
// machine can edit notes/activities during that network latency. Restoring from
|
|
182
|
+
// the stale pre-await snapshot would silently overwrite that edit.
|
|
183
|
+
//
|
|
184
|
+
// There must be no await between this read and locationStore.set() below, so
|
|
185
|
+
// the read-modify-write stays one synchronous run (G20) — that is the whole
|
|
186
|
+
// reason this store needs no lockfile.
|
|
187
|
+
const mergeBase = locationStore.get(alias);
|
|
174
188
|
// Preserve description/alternateNames/notes/activities when omitted on ANY
|
|
175
189
|
// update to an existing alias (partial update OR full re-save with new
|
|
176
190
|
// coordinates). Omitted (undefined) -> keep the stored value. Explicitly
|
|
177
191
|
// cleared ("" / []) was already normalized to undefined above by the
|
|
178
|
-
// *Provided validation blocks.
|
|
179
|
-
|
|
192
|
+
// *Provided validation blocks. A mergeBase of undefined means the alias was
|
|
193
|
+
// removed mid-flight: the metadata is gone, not preserved, and the entry is
|
|
194
|
+
// recreated from what this call supplied.
|
|
195
|
+
if (mergeBase) {
|
|
180
196
|
if (!descriptionProvided) {
|
|
181
|
-
description =
|
|
197
|
+
description = mergeBase.description;
|
|
182
198
|
}
|
|
183
199
|
if (!alternateNamesProvided) {
|
|
184
|
-
alternateNames =
|
|
200
|
+
alternateNames = mergeBase.alternateNames;
|
|
185
201
|
}
|
|
186
202
|
if (!notesProvided) {
|
|
187
|
-
notes =
|
|
203
|
+
notes = mergeBase.notes;
|
|
188
204
|
}
|
|
189
205
|
if (!activitiesProvided) {
|
|
190
|
-
activities =
|
|
206
|
+
activities = mergeBase.activities;
|
|
191
207
|
}
|
|
192
208
|
}
|
|
193
|
-
// Check if this is an update or new location
|
|
194
|
-
|
|
209
|
+
// Check if this is an update or new location — from the same late read, not a
|
|
210
|
+
// third trip to the store.
|
|
211
|
+
const isUpdate = mergeBase !== undefined;
|
|
195
212
|
// Save the location
|
|
196
213
|
locationStore.set(alias, {
|
|
197
214
|
name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"savedLocationsHandler.js","sourceRoot":"","sources":["../../src/handlers/savedLocationsHandler.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"savedLocationsHandler.js","sourceRoot":"","sources":["../../src/handlers/savedLocationsHandler.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -31,6 +31,8 @@ const server = createWeatherServer({ locationStore });
|
|
|
31
31
|
* saved locations at startup lets their coverage accumulate before the user asks.
|
|
32
32
|
* Best-effort and fully non-blocking: it opens a persistent MQTT connection, so it is
|
|
33
33
|
* skipped when the lightning tool is disabled or when WEATHER_LIGHTNING_PREWARM=false.
|
|
34
|
+
* The saved-locations read is guarded too: an unreadable locations file must not stop
|
|
35
|
+
* the server from booting.
|
|
34
36
|
*/
|
|
35
37
|
function prewarmLightningMonitoring() {
|
|
36
38
|
if (process.env.WEATHER_LIGHTNING_PREWARM === 'false') {
|
|
@@ -39,7 +41,16 @@ function prewarmLightningMonitoring() {
|
|
|
39
41
|
if (!toolConfig.isEnabled('get_lightning_activity')) {
|
|
40
42
|
return;
|
|
41
43
|
}
|
|
42
|
-
|
|
44
|
+
let savedLocations;
|
|
45
|
+
try {
|
|
46
|
+
savedLocations = Object.values(locationStore.getAll());
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
logger.warn('Skipping lightning pre-warm: saved locations could not be read', {
|
|
50
|
+
error: error instanceof Error ? error.message : String(error)
|
|
51
|
+
});
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
43
54
|
if (savedLocations.length === 0) {
|
|
44
55
|
return;
|
|
45
56
|
}
|
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,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,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,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EACnB,MAAM,2BAA2B,CAAC;AAEnC;;;;GAIG;AACH,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;AAE1C,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;AAEtD;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,10 +3,25 @@
|
|
|
3
3
|
* Stores locations in ~/.weather-mcp/locations.json
|
|
4
4
|
*/
|
|
5
5
|
import type { SavedLocation, SavedLocationsStore } from '../types/savedLocations.js';
|
|
6
|
+
/**
|
|
7
|
+
* Thrown when `~/.weather-mcp/locations.json` exists but cannot be read, parsed,
|
|
8
|
+
* or does not hold a plain JSON object at the top level.
|
|
9
|
+
*
|
|
10
|
+
* The store is **contract**, not garnish: it is user data that only this server
|
|
11
|
+
* writes, so "empty" and "unreadable" must never render as the same answer. An
|
|
12
|
+
* unreadable file is refused by every read and every write — it is never renamed,
|
|
13
|
+
* copied, or overwritten. `ENOENT`, and only `ENOENT`, means an empty store.
|
|
14
|
+
*
|
|
15
|
+
* The message is fixed apart from the path. The underlying cause goes to the log,
|
|
16
|
+
* never into the message.
|
|
17
|
+
*/
|
|
18
|
+
export declare class LocationStoreUnreadableError extends Error {
|
|
19
|
+
readonly storePath: string;
|
|
20
|
+
constructor(storePath: string);
|
|
21
|
+
}
|
|
6
22
|
export declare class LocationStore {
|
|
7
23
|
private readonly storePath;
|
|
8
24
|
private readonly storeDir;
|
|
9
|
-
private cache;
|
|
10
25
|
constructor(customPath?: string);
|
|
11
26
|
/**
|
|
12
27
|
* Ensure the storage directory exists
|
|
@@ -14,7 +29,15 @@ export declare class LocationStore {
|
|
|
14
29
|
*/
|
|
15
30
|
private ensureDirectoryExists;
|
|
16
31
|
/**
|
|
17
|
-
* Load all saved locations from disk
|
|
32
|
+
* Load all saved locations from disk.
|
|
33
|
+
*
|
|
34
|
+
* Reads the file on **every** call — there is no cache. Two clients on one
|
|
35
|
+
* machine share this file, so a cached copy written back whole silently deletes
|
|
36
|
+
* the other client's saves. Every call returns a fresh object.
|
|
37
|
+
*
|
|
38
|
+
* @throws {LocationStoreUnreadableError} when the file exists but cannot be
|
|
39
|
+
* read, cannot be parsed, or is not a plain JSON object at the top level.
|
|
40
|
+
* A zero-byte or whitespace-only file is a parse failure like any other.
|
|
18
41
|
*/
|
|
19
42
|
load(): SavedLocationsStore;
|
|
20
43
|
/**
|
|
@@ -22,6 +45,32 @@ export declare class LocationStore {
|
|
|
22
45
|
* @private
|
|
23
46
|
*/
|
|
24
47
|
private save;
|
|
48
|
+
/**
|
|
49
|
+
* Resolve the pathname this store should actually write, by walking the symlink
|
|
50
|
+
* chain from `storePath`.
|
|
51
|
+
*
|
|
52
|
+
* `realpathSync` cannot be used here: it reports `ENOENT` both for a path that is
|
|
53
|
+
* absent and for a symlink whose target is absent, so falling back to the literal
|
|
54
|
+
* path on `ENOENT` renames **over the symlink**, destroying it and writing the
|
|
55
|
+
* JSON at the link's own pathname. Dotfile managers and synced folders make a
|
|
56
|
+
* not-yet-created link target an ordinary first-run state.
|
|
57
|
+
*
|
|
58
|
+
* @private
|
|
59
|
+
*/
|
|
60
|
+
private resolveWriteTarget;
|
|
61
|
+
/**
|
|
62
|
+
* Replace the store file atomically: write a uniquely named temp file in the same
|
|
63
|
+
* directory, fsync it, then rename it over the target. A reader sees the old file
|
|
64
|
+
* or the new one, never a partial — today's in-place write truncates first, and a
|
|
65
|
+
* reader landing in that window destroys the file through the parse-failure path.
|
|
66
|
+
*
|
|
67
|
+
* On any failure the temp file is removed and the target is left untouched. There
|
|
68
|
+
* is deliberately **no** fallback to an in-place write: that would reintroduce the
|
|
69
|
+
* truncation window exactly where the environment is already unusual.
|
|
70
|
+
*
|
|
71
|
+
* @private
|
|
72
|
+
*/
|
|
73
|
+
private writeAtomically;
|
|
25
74
|
/**
|
|
26
75
|
* Get a saved location by alias
|
|
27
76
|
*/
|
|
@@ -54,9 +103,5 @@ export declare class LocationStore {
|
|
|
54
103
|
* Get the storage file path
|
|
55
104
|
*/
|
|
56
105
|
getStorePath(): string;
|
|
57
|
-
/**
|
|
58
|
-
* Invalidate the cache, forcing reload on next access
|
|
59
|
-
*/
|
|
60
|
-
invalidateCache(): void;
|
|
61
106
|
}
|
|
62
107
|
//# sourceMappingURL=locationStore.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locationStore.d.ts","sourceRoot":"","sources":["../../src/services/locationStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"locationStore.d.ts","sourceRoot":"","sources":["../../src/services/locationStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAIrF;;;;;;;;;;;GAWG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,YAAY,SAAS,EAAE,MAAM,EAQ5B;CACF;AAKD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,YAAY,UAAU,CAAC,EAAE,MAAM,EAQ9B;IAED;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;;;;;;;;;OAUG;IACH,IAAI,IAAI,mBAAmB,CAyC1B;IAED;;;OAGG;IACH,OAAO,CAAC,IAAI;IAkBZ;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,eAAe;IA+DvB;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAI5C;IAED;;OAEG;IACH,MAAM,IAAI,mBAAmB,CAE5B;IAED;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,YAAY,CAAC,GAAG,aAAa,CAkC1F;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAa7B;IAED;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAI1B;IAED;;OAEG;IACH,KAAK,IAAI,MAAM,CAGd;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAKZ;IAED;;OAEG;IACH,YAAY,IAAI,MAAM,CAErB;CACF"}
|
|
@@ -2,15 +2,39 @@
|
|
|
2
2
|
* Service for managing saved/favorite locations
|
|
3
3
|
* Stores locations in ~/.weather-mcp/locations.json
|
|
4
4
|
*/
|
|
5
|
-
import { readFileSync,
|
|
5
|
+
import { readFileSync, mkdirSync, existsSync, lstatSync, readlinkSync, statSync, openSync, writeSync, fsyncSync, fchmodSync, closeSync, renameSync, unlinkSync } from 'fs';
|
|
6
|
+
import { randomBytes } from 'crypto';
|
|
6
7
|
import { homedir } from 'os';
|
|
7
|
-
import { join } from 'path';
|
|
8
|
+
import { join, dirname, basename, resolve, isAbsolute } from 'path';
|
|
8
9
|
import { logger } from '../utils/logger.js';
|
|
9
10
|
import { validateLatitude, validateLongitude } from '../utils/validation.js';
|
|
11
|
+
/**
|
|
12
|
+
* Thrown when `~/.weather-mcp/locations.json` exists but cannot be read, parsed,
|
|
13
|
+
* or does not hold a plain JSON object at the top level.
|
|
14
|
+
*
|
|
15
|
+
* The store is **contract**, not garnish: it is user data that only this server
|
|
16
|
+
* writes, so "empty" and "unreadable" must never render as the same answer. An
|
|
17
|
+
* unreadable file is refused by every read and every write — it is never renamed,
|
|
18
|
+
* copied, or overwritten. `ENOENT`, and only `ENOENT`, means an empty store.
|
|
19
|
+
*
|
|
20
|
+
* The message is fixed apart from the path. The underlying cause goes to the log,
|
|
21
|
+
* never into the message.
|
|
22
|
+
*/
|
|
23
|
+
export class LocationStoreUnreadableError extends Error {
|
|
24
|
+
storePath;
|
|
25
|
+
constructor(storePath) {
|
|
26
|
+
super(`Saved locations file could not be read: ${storePath}\n\n` +
|
|
27
|
+
'The file was not modified. To recover, either repair it so it contains a valid JSON object,\n' +
|
|
28
|
+
'or move it aside (rename or delete it) to start with an empty list. No restart is needed.');
|
|
29
|
+
this.name = 'LocationStoreUnreadableError';
|
|
30
|
+
this.storePath = storePath;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Most symlink hops followed when resolving the write target. A cycle must not spin. */
|
|
34
|
+
const MAX_SYMLINK_HOPS = 32;
|
|
10
35
|
export class LocationStore {
|
|
11
36
|
storePath;
|
|
12
37
|
storeDir;
|
|
13
|
-
cache = null;
|
|
14
38
|
constructor(customPath) {
|
|
15
39
|
if (customPath) {
|
|
16
40
|
this.storePath = customPath;
|
|
@@ -40,47 +64,55 @@ export class LocationStore {
|
|
|
40
64
|
}
|
|
41
65
|
}
|
|
42
66
|
/**
|
|
43
|
-
* Load all saved locations from disk
|
|
67
|
+
* Load all saved locations from disk.
|
|
68
|
+
*
|
|
69
|
+
* Reads the file on **every** call — there is no cache. Two clients on one
|
|
70
|
+
* machine share this file, so a cached copy written back whole silently deletes
|
|
71
|
+
* the other client's saves. Every call returns a fresh object.
|
|
72
|
+
*
|
|
73
|
+
* @throws {LocationStoreUnreadableError} when the file exists but cannot be
|
|
74
|
+
* read, cannot be parsed, or is not a plain JSON object at the top level.
|
|
75
|
+
* A zero-byte or whitespace-only file is a parse failure like any other.
|
|
44
76
|
*/
|
|
45
77
|
load() {
|
|
46
|
-
|
|
47
|
-
if (this.cache !== null) {
|
|
48
|
-
return this.cache;
|
|
49
|
-
}
|
|
50
|
-
// If file doesn't exist, return empty store
|
|
51
|
-
if (!existsSync(this.storePath)) {
|
|
52
|
-
logger.info('No saved locations file found, starting fresh', {
|
|
53
|
-
path: this.storePath
|
|
54
|
-
});
|
|
55
|
-
this.cache = {};
|
|
56
|
-
return this.cache;
|
|
57
|
-
}
|
|
78
|
+
let data;
|
|
58
79
|
try {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (
|
|
63
|
-
logger.
|
|
80
|
+
data = readFileSync(this.storePath, 'utf-8');
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (error.code === 'ENOENT') {
|
|
84
|
+
logger.debug('No saved locations file found, starting fresh', {
|
|
64
85
|
path: this.storePath
|
|
65
86
|
});
|
|
66
|
-
|
|
67
|
-
return this.cache;
|
|
87
|
+
return {};
|
|
68
88
|
}
|
|
69
|
-
|
|
70
|
-
|
|
89
|
+
// Any other read failure (EISDIR, EACCES, EIO, ENOTDIR) is unreadable, not empty.
|
|
90
|
+
logger.error('Failed to read saved locations', error, {
|
|
71
91
|
path: this.storePath
|
|
72
92
|
});
|
|
73
|
-
this.
|
|
74
|
-
|
|
93
|
+
throw new LocationStoreUnreadableError(this.storePath);
|
|
94
|
+
}
|
|
95
|
+
let parsed;
|
|
96
|
+
try {
|
|
97
|
+
parsed = JSON.parse(data);
|
|
75
98
|
}
|
|
76
99
|
catch (error) {
|
|
77
|
-
logger.error('Failed to
|
|
100
|
+
logger.error('Failed to parse saved locations', error, {
|
|
101
|
+
path: this.storePath
|
|
102
|
+
});
|
|
103
|
+
throw new LocationStoreUnreadableError(this.storePath);
|
|
104
|
+
}
|
|
105
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
106
|
+
logger.error('Saved locations file is not a JSON object', undefined, {
|
|
78
107
|
path: this.storePath
|
|
79
108
|
});
|
|
80
|
-
|
|
81
|
-
this.cache = {};
|
|
82
|
-
return this.cache;
|
|
109
|
+
throw new LocationStoreUnreadableError(this.storePath);
|
|
83
110
|
}
|
|
111
|
+
logger.debug('Loaded saved locations', {
|
|
112
|
+
count: Object.keys(parsed).length,
|
|
113
|
+
path: this.storePath
|
|
114
|
+
});
|
|
115
|
+
return parsed;
|
|
84
116
|
}
|
|
85
117
|
/**
|
|
86
118
|
* Save all locations to disk
|
|
@@ -90,8 +122,7 @@ export class LocationStore {
|
|
|
90
122
|
this.ensureDirectoryExists();
|
|
91
123
|
try {
|
|
92
124
|
const data = JSON.stringify(locations, null, 2);
|
|
93
|
-
|
|
94
|
-
this.cache = locations; // Update cache
|
|
125
|
+
this.writeAtomically(data);
|
|
95
126
|
logger.info('Saved locations to disk', {
|
|
96
127
|
count: Object.keys(locations).length,
|
|
97
128
|
path: this.storePath
|
|
@@ -104,6 +135,109 @@ export class LocationStore {
|
|
|
104
135
|
throw new Error(`Failed to save locations to ${this.storePath}`);
|
|
105
136
|
}
|
|
106
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Resolve the pathname this store should actually write, by walking the symlink
|
|
140
|
+
* chain from `storePath`.
|
|
141
|
+
*
|
|
142
|
+
* `realpathSync` cannot be used here: it reports `ENOENT` both for a path that is
|
|
143
|
+
* absent and for a symlink whose target is absent, so falling back to the literal
|
|
144
|
+
* path on `ENOENT` renames **over the symlink**, destroying it and writing the
|
|
145
|
+
* JSON at the link's own pathname. Dotfile managers and synced folders make a
|
|
146
|
+
* not-yet-created link target an ordinary first-run state.
|
|
147
|
+
*
|
|
148
|
+
* @private
|
|
149
|
+
*/
|
|
150
|
+
resolveWriteTarget() {
|
|
151
|
+
let current = this.storePath;
|
|
152
|
+
for (let hop = 0; hop < MAX_SYMLINK_HOPS; hop++) {
|
|
153
|
+
let stats;
|
|
154
|
+
try {
|
|
155
|
+
stats = lstatSync(current);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
if (error.code === 'ENOENT') {
|
|
159
|
+
// Absent: a fresh install, or the intended target of a dangling link.
|
|
160
|
+
return current;
|
|
161
|
+
}
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
if (!stats.isSymbolicLink()) {
|
|
165
|
+
return current;
|
|
166
|
+
}
|
|
167
|
+
const link = readlinkSync(current);
|
|
168
|
+
current = isAbsolute(link) ? link : resolve(dirname(current), link);
|
|
169
|
+
}
|
|
170
|
+
throw new Error(`Symlink chain too deep at ${this.storePath}`);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Replace the store file atomically: write a uniquely named temp file in the same
|
|
174
|
+
* directory, fsync it, then rename it over the target. A reader sees the old file
|
|
175
|
+
* or the new one, never a partial — today's in-place write truncates first, and a
|
|
176
|
+
* reader landing in that window destroys the file through the parse-failure path.
|
|
177
|
+
*
|
|
178
|
+
* On any failure the temp file is removed and the target is left untouched. There
|
|
179
|
+
* is deliberately **no** fallback to an in-place write: that would reintroduce the
|
|
180
|
+
* truncation window exactly where the environment is already unusual.
|
|
181
|
+
*
|
|
182
|
+
* @private
|
|
183
|
+
*/
|
|
184
|
+
writeAtomically(data) {
|
|
185
|
+
const target = this.resolveWriteTarget();
|
|
186
|
+
// A rename replaces the directory entry, where an in-place write goes through
|
|
187
|
+
// it — so the mode has to be carried over explicitly or a user's 0600 is lost.
|
|
188
|
+
// A file that does not exist yet keeps the process default, as before.
|
|
189
|
+
let mode;
|
|
190
|
+
try {
|
|
191
|
+
mode = statSync(target).mode & 0o777;
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
mode = undefined;
|
|
195
|
+
}
|
|
196
|
+
const tmp = join(dirname(target), `.${basename(target)}.${process.pid}.${randomBytes(4).toString('hex')}.tmp`);
|
|
197
|
+
let fd;
|
|
198
|
+
try {
|
|
199
|
+
fd = openSync(tmp, 'wx');
|
|
200
|
+
if (mode !== undefined) {
|
|
201
|
+
// The open mode is masked by umask, so set it explicitly.
|
|
202
|
+
fchmodSync(fd, mode);
|
|
203
|
+
}
|
|
204
|
+
// writeSync returns the number of bytes written and is NOT documented to
|
|
205
|
+
// write the buffer whole. A short write under ENOSPC or a signal, followed
|
|
206
|
+
// by fsync and rename, would durably and atomically publish truncated JSON
|
|
207
|
+
// as a successful save — the exact unreadable state this replace exists to
|
|
208
|
+
// prevent. Loop to completion and treat no progress as a failure.
|
|
209
|
+
const buf = Buffer.from(data, 'utf8');
|
|
210
|
+
for (let off = 0; off < buf.length;) {
|
|
211
|
+
const written = writeSync(fd, buf, off, buf.length - off);
|
|
212
|
+
if (!(written > 0)) {
|
|
213
|
+
throw new Error(`Write made no progress at offset ${off} of ${buf.length}`);
|
|
214
|
+
}
|
|
215
|
+
off += written;
|
|
216
|
+
}
|
|
217
|
+
// Only after the whole buffer is written.
|
|
218
|
+
fsyncSync(fd);
|
|
219
|
+
closeSync(fd);
|
|
220
|
+
fd = undefined;
|
|
221
|
+
renameSync(tmp, target);
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
if (fd !== undefined) {
|
|
225
|
+
try {
|
|
226
|
+
closeSync(fd);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// Ignore: the original error is what matters.
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
unlinkSync(tmp);
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
// Ignore: the temp file may never have been created.
|
|
237
|
+
}
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
107
241
|
/**
|
|
108
242
|
* Get a saved location by alias
|
|
109
243
|
*/
|
|
@@ -182,6 +316,8 @@ export class LocationStore {
|
|
|
182
316
|
* Clear all saved locations
|
|
183
317
|
*/
|
|
184
318
|
clear() {
|
|
319
|
+
// Load first so clear() refuses an unreadable file like every other operation.
|
|
320
|
+
this.load();
|
|
185
321
|
this.save({});
|
|
186
322
|
logger.info('Cleared all saved locations');
|
|
187
323
|
}
|
|
@@ -191,11 +327,5 @@ export class LocationStore {
|
|
|
191
327
|
getStorePath() {
|
|
192
328
|
return this.storePath;
|
|
193
329
|
}
|
|
194
|
-
/**
|
|
195
|
-
* Invalidate the cache, forcing reload on next access
|
|
196
|
-
*/
|
|
197
|
-
invalidateCache() {
|
|
198
|
-
this.cache = null;
|
|
199
|
-
}
|
|
200
330
|
}
|
|
201
331
|
//# sourceMappingURL=locationStore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locationStore.js","sourceRoot":"","sources":["../../src/services/locationStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"locationStore.js","sourceRoot":"","sources":["../../src/services/locationStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -76,7 +76,7 @@ export declare function getMajorCoastalBayRegions(): GeographicRegion[];
|
|
|
76
76
|
*/
|
|
77
77
|
export declare function getCountryFromCoordinates(lat: number, lon: number): string;
|
|
78
78
|
/**
|
|
79
|
-
* Determine if coordinates are within the United States (including Alaska, Hawaii
|
|
79
|
+
* Determine if coordinates are within the United States (including Alaska, Hawaii and Puerto Rico; the other NWS-served territories are `isInNwsTerritory`)
|
|
80
80
|
* Uses bounding box approach for simplicity
|
|
81
81
|
* @param latitude Latitude coordinate
|
|
82
82
|
* @param longitude Longitude coordinate
|
|
@@ -129,5 +129,69 @@ export declare function isInUS(latitude: number, longitude: number): boolean;
|
|
|
129
129
|
* @returns True if coordinates fall within Great Britain's generous routing box
|
|
130
130
|
*/
|
|
131
131
|
export declare function isInGreatBritain(latitude: number, longitude: number): boolean;
|
|
132
|
+
/**
|
|
133
|
+
* Determine if coordinates fall within one of the NWS-served US territories that
|
|
134
|
+
* `isInUS` deliberately leaves out — Guam, the Northern Mariana Islands (southern
|
|
135
|
+
* arc only), the US Virgin Islands and American Samoa.
|
|
136
|
+
*
|
|
137
|
+
* It answers exactly one question: **will api.weather.gov accept an alerts point
|
|
138
|
+
* here?** Not "is this the United States", not "does NWS forecast here" (it reports
|
|
139
|
+
* no `gridId` for American Samoa at all), and not "does any other service cover
|
|
140
|
+
* this place".
|
|
141
|
+
*
|
|
142
|
+
* This function is **routing only and NEVER renders.** No sentence in any tool
|
|
143
|
+
* output may be derived from it. Its one consumer is the critical-alert banner's
|
|
144
|
+
* pre-filter in `src/handlers/criticalAlertBanner.ts`, which uses it to decide
|
|
145
|
+
* whether one `getAlerts` call is worth making. See GOTCHAS G53: promoting a
|
|
146
|
+
* routing heuristic to a rendered claim inherits every edge the heuristic was
|
|
147
|
+
* previously allowed to get wrong. The moment a rendered sentence names a
|
|
148
|
+
* territory off this predicate, every box below owes a fresh audit against the
|
|
149
|
+
* jurisdiction that sentence names.
|
|
150
|
+
*
|
|
151
|
+
* **Why these boxes are drawn tightly to the islands, which is the opposite of
|
|
152
|
+
* `isInGreatBritain`'s posture.** There, a false positive costs one cheap
|
|
153
|
+
* Nominatim call, so the boxes are deliberately generous. Here a false positive
|
|
154
|
+
* costs an HTTP 400 `Parameter "point" is invalid: out of bounds` from
|
|
155
|
+
* api.weather.gov, which `NOAAService.makeRequest` turns into an
|
|
156
|
+
* `InvalidLocationError` after its own `securityEvent: true` warn; the banner's
|
|
157
|
+
* catch then warns a second time, and `getAlerts` never caches a failure, so every
|
|
158
|
+
* call repeats both. Two security-event log lines per request is the price of a
|
|
159
|
+
* loose edge, so every corner below was probed against the live endpoint on
|
|
160
|
+
* 2026-09-18 and the seams measured. An edge moved "for tidiness" is a 400 or a
|
|
161
|
+
* dropped island. The probe table is in `.devdocs/plan-nws-alert-jurisdiction.md`.
|
|
162
|
+
*
|
|
163
|
+
* **Why Guam and the CNMI are two boxes and not one.** The union's northwest
|
|
164
|
+
* corner, `15.2 N, 144.8 E`, is a measured 400 — the accepted region is not convex
|
|
165
|
+
* there, so a single merged box would admit open ocean NWS rejects.
|
|
166
|
+
*
|
|
167
|
+
* **Why the CNMI box stops at 15.35 N.** NWS rejects every point from 16.0 N north
|
|
168
|
+
* along 145.7 E: Anatahan, Pagan, Agrihan and Farallon de Pajaros are all out of
|
|
169
|
+
* bounds. The northern Marianas are excluded because the service excludes them,
|
|
170
|
+
* not because they were forgotten.
|
|
171
|
+
*
|
|
172
|
+
* **The USVI box admits the British Virgin Islands** (Tortola, Virgin Gorda). NWS
|
|
173
|
+
* answers 200 at those points and nothing here is rendered, so the admission is
|
|
174
|
+
* harmless and deliberate — tightening the box to exclude them would buy nothing
|
|
175
|
+
* and risk clipping St Thomas and St John.
|
|
176
|
+
*
|
|
177
|
+
* **Why American Samoa is two boxes.** The territory is not a rectangle: the main
|
|
178
|
+
* box holds the Tutuila–Manuʻa–Rose band, and Swains Island is a separate pocket
|
|
179
|
+
* ~350 km north. Apia (`−13.83, −171.76`, sovereign Samoa) and the `−168.05`
|
|
180
|
+
* corners outside the band are measured 400s.
|
|
181
|
+
*
|
|
182
|
+
* **`isInUS` must never be widened to absorb these.** That predicate backs a
|
|
183
|
+
* *rendered* coverage claim in `get_river_conditions` (G53), and the two questions
|
|
184
|
+
* have different answers: NWPS gauges Puerto Rico and gauges nothing in Guam, so a
|
|
185
|
+
* widened `isInUS` would tell a caller in Guam that NWPS covers Guam. The two
|
|
186
|
+
* predicates are **disjoint by construction** — the Puerto Rico box's east edge is
|
|
187
|
+
* `−65.2` and the USVI box's west edge is `−65.15`, so they touch without
|
|
188
|
+
* overlapping.
|
|
189
|
+
*
|
|
190
|
+
* @param latitude Latitude coordinate
|
|
191
|
+
* @param longitude Longitude coordinate
|
|
192
|
+
* @returns True if NWS accepts an alerts point at these coordinates in one of the
|
|
193
|
+
* four territories `isInUS` excludes
|
|
194
|
+
*/
|
|
195
|
+
export declare function isInNwsTerritory(latitude: number, longitude: number): boolean;
|
|
132
196
|
export {};
|
|
133
197
|
//# sourceMappingURL=geography.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geography.d.ts","sourceRoot":"","sources":["../../src/utils/geography.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAgID;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOrF;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO3F;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IACxE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,aAAa,GAAG,aAAa,GAAG,OAAO,CAAC;CACjD,CA2BA;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAQtF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,gBAAgB,EAAE,CAEzD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,gBAAgB,EAAE,CAE9D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAgD1E;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAgBnE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAY7E"}
|
|
1
|
+
{"version":3,"file":"geography.d.ts","sourceRoot":"","sources":["../../src/utils/geography.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAgID;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOrF;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO3F;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IACxE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,aAAa,GAAG,aAAa,GAAG,OAAO,CAAC;CACjD,CA2BA;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAQtF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,gBAAgB,EAAE,CAEzD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,gBAAgB,EAAE,CAE9D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAgD1E;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAgBnE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAY7E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAQ7E"}
|
package/dist/utils/geography.js
CHANGED
|
@@ -264,7 +264,7 @@ export function getCountryFromCoordinates(lat, lon) {
|
|
|
264
264
|
return 'OTHER';
|
|
265
265
|
}
|
|
266
266
|
/**
|
|
267
|
-
* Determine if coordinates are within the United States (including Alaska, Hawaii
|
|
267
|
+
* Determine if coordinates are within the United States (including Alaska, Hawaii and Puerto Rico; the other NWS-served territories are `isInNwsTerritory`)
|
|
268
268
|
* Uses bounding box approach for simplicity
|
|
269
269
|
* @param latitude Latitude coordinate
|
|
270
270
|
* @param longitude Longitude coordinate
|
|
@@ -340,4 +340,75 @@ export function isInGreatBritain(latitude, longitude) {
|
|
|
340
340
|
const inNorthernScotlandIsles = latitude >= 55.45 && latitude <= 61.05 && longitude >= -9.0 && longitude <= 2.0;
|
|
341
341
|
return inSouthwestApproaches || inEnglandWalesScotland || inNorthernScotlandIsles;
|
|
342
342
|
}
|
|
343
|
+
/**
|
|
344
|
+
* Determine if coordinates fall within one of the NWS-served US territories that
|
|
345
|
+
* `isInUS` deliberately leaves out — Guam, the Northern Mariana Islands (southern
|
|
346
|
+
* arc only), the US Virgin Islands and American Samoa.
|
|
347
|
+
*
|
|
348
|
+
* It answers exactly one question: **will api.weather.gov accept an alerts point
|
|
349
|
+
* here?** Not "is this the United States", not "does NWS forecast here" (it reports
|
|
350
|
+
* no `gridId` for American Samoa at all), and not "does any other service cover
|
|
351
|
+
* this place".
|
|
352
|
+
*
|
|
353
|
+
* This function is **routing only and NEVER renders.** No sentence in any tool
|
|
354
|
+
* output may be derived from it. Its one consumer is the critical-alert banner's
|
|
355
|
+
* pre-filter in `src/handlers/criticalAlertBanner.ts`, which uses it to decide
|
|
356
|
+
* whether one `getAlerts` call is worth making. See GOTCHAS G53: promoting a
|
|
357
|
+
* routing heuristic to a rendered claim inherits every edge the heuristic was
|
|
358
|
+
* previously allowed to get wrong. The moment a rendered sentence names a
|
|
359
|
+
* territory off this predicate, every box below owes a fresh audit against the
|
|
360
|
+
* jurisdiction that sentence names.
|
|
361
|
+
*
|
|
362
|
+
* **Why these boxes are drawn tightly to the islands, which is the opposite of
|
|
363
|
+
* `isInGreatBritain`'s posture.** There, a false positive costs one cheap
|
|
364
|
+
* Nominatim call, so the boxes are deliberately generous. Here a false positive
|
|
365
|
+
* costs an HTTP 400 `Parameter "point" is invalid: out of bounds` from
|
|
366
|
+
* api.weather.gov, which `NOAAService.makeRequest` turns into an
|
|
367
|
+
* `InvalidLocationError` after its own `securityEvent: true` warn; the banner's
|
|
368
|
+
* catch then warns a second time, and `getAlerts` never caches a failure, so every
|
|
369
|
+
* call repeats both. Two security-event log lines per request is the price of a
|
|
370
|
+
* loose edge, so every corner below was probed against the live endpoint on
|
|
371
|
+
* 2026-09-18 and the seams measured. An edge moved "for tidiness" is a 400 or a
|
|
372
|
+
* dropped island. The probe table is in `.devdocs/plan-nws-alert-jurisdiction.md`.
|
|
373
|
+
*
|
|
374
|
+
* **Why Guam and the CNMI are two boxes and not one.** The union's northwest
|
|
375
|
+
* corner, `15.2 N, 144.8 E`, is a measured 400 — the accepted region is not convex
|
|
376
|
+
* there, so a single merged box would admit open ocean NWS rejects.
|
|
377
|
+
*
|
|
378
|
+
* **Why the CNMI box stops at 15.35 N.** NWS rejects every point from 16.0 N north
|
|
379
|
+
* along 145.7 E: Anatahan, Pagan, Agrihan and Farallon de Pajaros are all out of
|
|
380
|
+
* bounds. The northern Marianas are excluded because the service excludes them,
|
|
381
|
+
* not because they were forgotten.
|
|
382
|
+
*
|
|
383
|
+
* **The USVI box admits the British Virgin Islands** (Tortola, Virgin Gorda). NWS
|
|
384
|
+
* answers 200 at those points and nothing here is rendered, so the admission is
|
|
385
|
+
* harmless and deliberate — tightening the box to exclude them would buy nothing
|
|
386
|
+
* and risk clipping St Thomas and St John.
|
|
387
|
+
*
|
|
388
|
+
* **Why American Samoa is two boxes.** The territory is not a rectangle: the main
|
|
389
|
+
* box holds the Tutuila–Manuʻa–Rose band, and Swains Island is a separate pocket
|
|
390
|
+
* ~350 km north. Apia (`−13.83, −171.76`, sovereign Samoa) and the `−168.05`
|
|
391
|
+
* corners outside the band are measured 400s.
|
|
392
|
+
*
|
|
393
|
+
* **`isInUS` must never be widened to absorb these.** That predicate backs a
|
|
394
|
+
* *rendered* coverage claim in `get_river_conditions` (G53), and the two questions
|
|
395
|
+
* have different answers: NWPS gauges Puerto Rico and gauges nothing in Guam, so a
|
|
396
|
+
* widened `isInUS` would tell a caller in Guam that NWPS covers Guam. The two
|
|
397
|
+
* predicates are **disjoint by construction** — the Puerto Rico box's east edge is
|
|
398
|
+
* `−65.2` and the USVI box's west edge is `−65.15`, so they touch without
|
|
399
|
+
* overlapping.
|
|
400
|
+
*
|
|
401
|
+
* @param latitude Latitude coordinate
|
|
402
|
+
* @param longitude Longitude coordinate
|
|
403
|
+
* @returns True if NWS accepts an alerts point at these coordinates in one of the
|
|
404
|
+
* four territories `isInUS` excludes
|
|
405
|
+
*/
|
|
406
|
+
export function isInNwsTerritory(latitude, longitude) {
|
|
407
|
+
const inGuam = latitude >= 13.2 && latitude <= 13.7 && longitude >= 144.6 && longitude <= 145.0;
|
|
408
|
+
const inMarianasSouthernArc = latitude >= 14.05 && latitude <= 15.35 && longitude >= 145.05 && longitude <= 145.9;
|
|
409
|
+
const inVirginIslands = latitude >= 17.6 && latitude <= 18.45 && longitude >= -65.15 && longitude <= -64.5;
|
|
410
|
+
const inAmericanSamoaMain = latitude >= -14.65 && latitude <= -14.05 && longitude >= -171.0 && longitude <= -168.05;
|
|
411
|
+
const inSwainsIsland = latitude >= -11.2 && latitude <= -10.95 && longitude >= -171.2 && longitude <= -170.95;
|
|
412
|
+
return inGuam || inMarianasSouthernArc || inVirginIslands || inAmericanSamoaMain || inSwainsIsland;
|
|
413
|
+
}
|
|
343
414
|
//# sourceMappingURL=geography.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geography.js","sourceRoot":"","sources":["../../src/utils/geography.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"geography.js","sourceRoot":"","sources":["../../src/utils/geography.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locationResolver.d.ts","sourceRoot":"","sources":["../../src/utils/locationResolver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"locationResolver.d.ts","sourceRoot":"","sources":["../../src/utils/locationResolver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAgC,MAAM,8BAA8B,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAK5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,GAAG,gBAAgB,GAAG,UAAU,GAAG,SAAS,CAAC;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAerE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,SAAS;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,EAC7D,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,gBAAgB,GAAG,CAAC,CAO1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,0BAA0B,CACxC,CAAC,SAAS;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,EAC7D,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAM9B;AAwBD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,aAAa,EACnB,aAAa,EAAE,aAAa,GAC3B,gBAAgB,CAyElB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,aAAa,EACnB,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CA4F3B;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,mBAAmB,EAAE,MAAM,GAAG,SAAS,EACvC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC,CAmBhE"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Utility for resolving location coordinates from various input formats
|
|
3
3
|
*/
|
|
4
|
+
import { LocationStoreUnreadableError } from '../services/locationStore.js';
|
|
4
5
|
import { validateLatitude, validateLongitude } from './validation.js';
|
|
5
6
|
import { Cache } from './cache.js';
|
|
6
7
|
import { CacheConfig } from '../config/cache.js';
|
|
@@ -316,8 +317,15 @@ async function resolveDefaultLocation(raw, locationStore, geocodingService) {
|
|
|
316
317
|
const saved = resolveLocation({ location_name: raw }, locationStore);
|
|
317
318
|
return { ...saved, source: 'default' };
|
|
318
319
|
}
|
|
319
|
-
catch {
|
|
320
|
-
//
|
|
320
|
+
catch (error) {
|
|
321
|
+
// An unreadable saved-locations file is not "this alias is not saved" — the
|
|
322
|
+
// alias may well be in there. Falling through would geocode the alias as a
|
|
323
|
+
// place name and return the weather for wherever Nominatim puts "home",
|
|
324
|
+
// which is worse than an error. Every other failure here really does mean
|
|
325
|
+
// "not a saved alias" and still falls through to the geocode below.
|
|
326
|
+
if (error instanceof LocationStoreUnreadableError) {
|
|
327
|
+
throw error;
|
|
328
|
+
}
|
|
321
329
|
}
|
|
322
330
|
// Free-text place name -> geocode (shares the city_name cache)
|
|
323
331
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locationResolver.js","sourceRoot":"","sources":["../../src/utils/locationResolver.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"locationResolver.js","sourceRoot":"","sources":["../../src/utils/locationResolver.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dangahagan/weather-mcp",
|
|
3
|
-
"version": "1.31.
|
|
3
|
+
"version": "1.31.2",
|
|
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",
|