@jablum/weather-mcp 1.7.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/LICENSE +21 -0
- package/README.md +1319 -0
- package/dist/analytics/anonymizer.d.ts +37 -0
- package/dist/analytics/anonymizer.d.ts.map +1 -0
- package/dist/analytics/anonymizer.js +112 -0
- package/dist/analytics/anonymizer.js.map +1 -0
- package/dist/analytics/collector.d.ts +72 -0
- package/dist/analytics/collector.d.ts.map +1 -0
- package/dist/analytics/collector.js +282 -0
- package/dist/analytics/collector.js.map +1 -0
- package/dist/analytics/config.d.ts +15 -0
- package/dist/analytics/config.d.ts.map +1 -0
- package/dist/analytics/config.js +172 -0
- package/dist/analytics/config.js.map +1 -0
- package/dist/analytics/index.d.ts +8 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +7 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/middleware.d.ts +33 -0
- package/dist/analytics/middleware.d.ts.map +1 -0
- package/dist/analytics/middleware.js +99 -0
- package/dist/analytics/middleware.js.map +1 -0
- package/dist/analytics/transport.d.ts +11 -0
- package/dist/analytics/transport.d.ts.map +1 -0
- package/dist/analytics/transport.js +92 -0
- package/dist/analytics/transport.js.map +1 -0
- package/dist/analytics/types.d.ts +74 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +6 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/config/api.d.ts +30 -0
- package/dist/config/api.d.ts.map +1 -0
- package/dist/config/api.js +32 -0
- package/dist/config/api.js.map +1 -0
- package/dist/config/cache.d.ts +31 -0
- package/dist/config/cache.d.ts.map +1 -0
- package/dist/config/cache.js +108 -0
- package/dist/config/cache.js.map +1 -0
- package/dist/config/displayThresholds.d.ts +83 -0
- package/dist/config/displayThresholds.d.ts.map +1 -0
- package/dist/config/displayThresholds.js +83 -0
- package/dist/config/displayThresholds.js.map +1 -0
- package/dist/config/tools.d.ts +44 -0
- package/dist/config/tools.d.ts.map +1 -0
- package/dist/config/tools.js +269 -0
- package/dist/config/tools.js.map +1 -0
- package/dist/errors/ApiError.d.ts +62 -0
- package/dist/errors/ApiError.d.ts.map +1 -0
- package/dist/errors/ApiError.js +171 -0
- package/dist/errors/ApiError.js.map +1 -0
- package/dist/handlers/airQualityHandler.d.ts +11 -0
- package/dist/handlers/airQualityHandler.d.ts.map +1 -0
- package/dist/handlers/airQualityHandler.js +154 -0
- package/dist/handlers/airQualityHandler.js.map +1 -0
- package/dist/handlers/alertsHandler.d.ts +11 -0
- package/dist/handlers/alertsHandler.d.ts.map +1 -0
- package/dist/handlers/alertsHandler.js +98 -0
- package/dist/handlers/alertsHandler.js.map +1 -0
- package/dist/handlers/currentConditionsHandler.d.ts +13 -0
- package/dist/handlers/currentConditionsHandler.d.ts.map +1 -0
- package/dist/handlers/currentConditionsHandler.js +296 -0
- package/dist/handlers/currentConditionsHandler.js.map +1 -0
- package/dist/handlers/forecastHandler.d.ts +16 -0
- package/dist/handlers/forecastHandler.d.ts.map +1 -0
- package/dist/handlers/forecastHandler.js +454 -0
- package/dist/handlers/forecastHandler.js.map +1 -0
- package/dist/handlers/historicalWeatherHandler.d.ts +12 -0
- package/dist/handlers/historicalWeatherHandler.d.ts.map +1 -0
- package/dist/handlers/historicalWeatherHandler.js +188 -0
- package/dist/handlers/historicalWeatherHandler.js.map +1 -0
- package/dist/handlers/lightningHandler.d.ts +14 -0
- package/dist/handlers/lightningHandler.d.ts.map +1 -0
- package/dist/handlers/lightningHandler.js +258 -0
- package/dist/handlers/lightningHandler.js.map +1 -0
- package/dist/handlers/locationHandler.d.ts +12 -0
- package/dist/handlers/locationHandler.d.ts.map +1 -0
- package/dist/handlers/locationHandler.js +149 -0
- package/dist/handlers/locationHandler.js.map +1 -0
- package/dist/handlers/marineConditionsHandler.d.ts +13 -0
- package/dist/handlers/marineConditionsHandler.d.ts.map +1 -0
- package/dist/handlers/marineConditionsHandler.js +270 -0
- package/dist/handlers/marineConditionsHandler.js.map +1 -0
- package/dist/handlers/riverConditionsHandler.d.ts +11 -0
- package/dist/handlers/riverConditionsHandler.d.ts.map +1 -0
- package/dist/handlers/riverConditionsHandler.js +176 -0
- package/dist/handlers/riverConditionsHandler.js.map +1 -0
- package/dist/handlers/savedLocationsHandler.d.ts +50 -0
- package/dist/handlers/savedLocationsHandler.d.ts.map +1 -0
- package/dist/handlers/savedLocationsHandler.js +397 -0
- package/dist/handlers/savedLocationsHandler.js.map +1 -0
- package/dist/handlers/statusHandler.d.ts +12 -0
- package/dist/handlers/statusHandler.d.ts.map +1 -0
- package/dist/handlers/statusHandler.js +115 -0
- package/dist/handlers/statusHandler.js.map +1 -0
- package/dist/handlers/weatherImageryHandler.d.ts +14 -0
- package/dist/handlers/weatherImageryHandler.d.ts.map +1 -0
- package/dist/handlers/weatherImageryHandler.js +143 -0
- package/dist/handlers/weatherImageryHandler.js.map +1 -0
- package/dist/handlers/wildfireHandler.d.ts +11 -0
- package/dist/handlers/wildfireHandler.d.ts.map +1 -0
- package/dist/handlers/wildfireHandler.js +186 -0
- package/dist/handlers/wildfireHandler.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +735 -0
- package/dist/index.js.map +1 -0
- package/dist/services/blitzortung.d.ts +67 -0
- package/dist/services/blitzortung.d.ts.map +1 -0
- package/dist/services/blitzortung.js +475 -0
- package/dist/services/blitzortung.js.map +1 -0
- package/dist/services/geocoding.d.ts +57 -0
- package/dist/services/geocoding.d.ts.map +1 -0
- package/dist/services/geocoding.js +393 -0
- package/dist/services/geocoding.js.map +1 -0
- package/dist/services/locationStore.d.ts +62 -0
- package/dist/services/locationStore.d.ts.map +1 -0
- package/dist/services/locationStore.js +201 -0
- package/dist/services/locationStore.js.map +1 -0
- package/dist/services/ncei.d.ts +61 -0
- package/dist/services/ncei.d.ts.map +1 -0
- package/dist/services/ncei.js +126 -0
- package/dist/services/ncei.js.map +1 -0
- package/dist/services/nifc.d.ts +44 -0
- package/dist/services/nifc.d.ts.map +1 -0
- package/dist/services/nifc.js +159 -0
- package/dist/services/nifc.js.map +1 -0
- package/dist/services/noaa.d.ts +161 -0
- package/dist/services/noaa.d.ts.map +1 -0
- package/dist/services/noaa.js +681 -0
- package/dist/services/noaa.js.map +1 -0
- package/dist/services/nominatim.d.ts +62 -0
- package/dist/services/nominatim.d.ts.map +1 -0
- package/dist/services/nominatim.js +254 -0
- package/dist/services/nominatim.js.map +1 -0
- package/dist/services/openmeteo.d.ts +189 -0
- package/dist/services/openmeteo.d.ts.map +1 -0
- package/dist/services/openmeteo.js +936 -0
- package/dist/services/openmeteo.js.map +1 -0
- package/dist/services/rainviewer.d.ts +37 -0
- package/dist/services/rainviewer.d.ts.map +1 -0
- package/dist/services/rainviewer.js +115 -0
- package/dist/services/rainviewer.js.map +1 -0
- package/dist/types/imagery.d.ts +82 -0
- package/dist/types/imagery.d.ts.map +1 -0
- package/dist/types/imagery.js +6 -0
- package/dist/types/imagery.js.map +1 -0
- package/dist/types/lightning.d.ts +89 -0
- package/dist/types/lightning.d.ts.map +1 -0
- package/dist/types/lightning.js +6 -0
- package/dist/types/lightning.js.map +1 -0
- package/dist/types/noaa.d.ts +535 -0
- package/dist/types/noaa.d.ts.map +1 -0
- package/dist/types/noaa.js +5 -0
- package/dist/types/noaa.js.map +1 -0
- package/dist/types/nominatim.d.ts +72 -0
- package/dist/types/nominatim.d.ts.map +1 -0
- package/dist/types/nominatim.js +6 -0
- package/dist/types/nominatim.js.map +1 -0
- package/dist/types/openmeteo.d.ts +583 -0
- package/dist/types/openmeteo.d.ts.map +1 -0
- package/dist/types/openmeteo.js +6 -0
- package/dist/types/openmeteo.js.map +1 -0
- package/dist/types/savedLocations.d.ts +58 -0
- package/dist/types/savedLocations.d.ts.map +1 -0
- package/dist/types/savedLocations.js +5 -0
- package/dist/types/savedLocations.js.map +1 -0
- package/dist/types/wildfire.d.ts +83 -0
- package/dist/types/wildfire.d.ts.map +1 -0
- package/dist/types/wildfire.js +5 -0
- package/dist/types/wildfire.js.map +1 -0
- package/dist/utils/airQuality.d.ts +54 -0
- package/dist/utils/airQuality.d.ts.map +1 -0
- package/dist/utils/airQuality.js +251 -0
- package/dist/utils/airQuality.js.map +1 -0
- package/dist/utils/cache.d.ts +69 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +164 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/distance.d.ts +25 -0
- package/dist/utils/distance.d.ts.map +1 -0
- package/dist/utils/distance.js +40 -0
- package/dist/utils/distance.js.map +1 -0
- package/dist/utils/fireWeather.d.ts +76 -0
- package/dist/utils/fireWeather.d.ts.map +1 -0
- package/dist/utils/fireWeather.js +243 -0
- package/dist/utils/fireWeather.js.map +1 -0
- package/dist/utils/geography.d.ts +79 -0
- package/dist/utils/geography.d.ts.map +1 -0
- package/dist/utils/geography.js +266 -0
- package/dist/utils/geography.js.map +1 -0
- package/dist/utils/geohash.d.ts +62 -0
- package/dist/utils/geohash.d.ts.map +1 -0
- package/dist/utils/geohash.js +146 -0
- package/dist/utils/geohash.js.map +1 -0
- package/dist/utils/locationResolver.d.ts +34 -0
- package/dist/utils/locationResolver.d.ts.map +1 -0
- package/dist/utils/locationResolver.js +120 -0
- package/dist/utils/locationResolver.js.map +1 -0
- package/dist/utils/logger.d.ts +75 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +153 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/marine.d.ts +59 -0
- package/dist/utils/marine.d.ts.map +1 -0
- package/dist/utils/marine.js +215 -0
- package/dist/utils/marine.js.map +1 -0
- package/dist/utils/normals.d.ts +86 -0
- package/dist/utils/normals.d.ts.map +1 -0
- package/dist/utils/normals.js +223 -0
- package/dist/utils/normals.js.map +1 -0
- package/dist/utils/snow.d.ts +45 -0
- package/dist/utils/snow.d.ts.map +1 -0
- package/dist/utils/snow.js +144 -0
- package/dist/utils/snow.js.map +1 -0
- package/dist/utils/temperatureConversion.d.ts +12 -0
- package/dist/utils/temperatureConversion.d.ts.map +1 -0
- package/dist/utils/temperatureConversion.js +17 -0
- package/dist/utils/temperatureConversion.js.map +1 -0
- package/dist/utils/timezone.d.ts +56 -0
- package/dist/utils/timezone.d.ts.map +1 -0
- package/dist/utils/timezone.js +167 -0
- package/dist/utils/timezone.js.map +1 -0
- package/dist/utils/units.d.ts +69 -0
- package/dist/utils/units.d.ts.map +1 -0
- package/dist/utils/units.js +158 -0
- package/dist/utils/units.js.map +1 -0
- package/dist/utils/validation.d.ts +89 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +177 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/version.d.ts +15 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +24 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for get_river_conditions tool
|
|
3
|
+
*/
|
|
4
|
+
import { validateCoordinates } from '../utils/validation.js';
|
|
5
|
+
import { formatInTimezone, guessTimezoneFromCoords } from '../utils/timezone.js';
|
|
6
|
+
import { calculateDistance } from '../utils/distance.js';
|
|
7
|
+
export async function handleGetRiverConditions(args, noaaService) {
|
|
8
|
+
// Validate input parameters with runtime checks
|
|
9
|
+
const { latitude, longitude } = validateCoordinates(args);
|
|
10
|
+
// Validate radius parameter
|
|
11
|
+
let radius = args?.radius ?? 50; // default 50 km
|
|
12
|
+
if (typeof radius !== 'number' || isNaN(radius) || !isFinite(radius)) {
|
|
13
|
+
radius = 50;
|
|
14
|
+
}
|
|
15
|
+
// Clamp to valid range (1-500 km)
|
|
16
|
+
radius = Math.max(1, Math.min(radius, 500));
|
|
17
|
+
// Get timezone for proper time formatting
|
|
18
|
+
const timezone = guessTimezoneFromCoords(latitude, longitude);
|
|
19
|
+
let output = `# River Conditions Report\n\n`;
|
|
20
|
+
output += `**Location:** ${latitude.toFixed(4)}, ${longitude.toFixed(4)}\n`;
|
|
21
|
+
output += `**Search Radius:** ${radius} km (${(radius * 0.621371).toFixed(1)} miles)\n\n`;
|
|
22
|
+
try {
|
|
23
|
+
// Calculate bounding box for the search radius
|
|
24
|
+
// 1 degree of latitude ≈ 111 km, 1 degree of longitude varies by latitude
|
|
25
|
+
const latDelta = radius / 111; // Convert radius from km to degrees latitude
|
|
26
|
+
const lonDelta = radius / (111 * Math.cos(latitude * Math.PI / 180)); // Adjust for latitude
|
|
27
|
+
const west = Math.max(-180, longitude - lonDelta);
|
|
28
|
+
const east = Math.min(180, longitude + lonDelta);
|
|
29
|
+
const south = Math.max(-90, latitude - latDelta);
|
|
30
|
+
const north = Math.min(90, latitude + latDelta);
|
|
31
|
+
// Get gauges within bounding box (much more efficient than downloading all gauges)
|
|
32
|
+
const gaugesInBox = await noaaService.getNWPSGaugesInBoundingBox(west, south, east, north);
|
|
33
|
+
// Calculate precise distance to each gauge and filter by radius
|
|
34
|
+
// (bounding box is a square, but we want a circle)
|
|
35
|
+
const gaugesWithDistance = gaugesInBox
|
|
36
|
+
.map(gauge => ({
|
|
37
|
+
gauge,
|
|
38
|
+
distance: calculateDistance(latitude, longitude, gauge.latitude, gauge.longitude)
|
|
39
|
+
}))
|
|
40
|
+
.filter(item => item.distance <= radius)
|
|
41
|
+
.sort((a, b) => a.distance - b.distance); // Sort by nearest first
|
|
42
|
+
if (gaugesWithDistance.length === 0) {
|
|
43
|
+
output += `ℹ️ **No river gauges found within ${radius} km**\n\n`;
|
|
44
|
+
output += `Try expanding the search radius or choosing a location closer to rivers or streams.\n\n`;
|
|
45
|
+
output += `**Tip:** River gauges are typically located along major rivers and waterways.\n`;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
output += `📊 **Found ${gaugesWithDistance.length} river gauge${gaugesWithDistance.length > 1 ? 's' : ''}**\n\n`;
|
|
49
|
+
// Show details for nearest gauges (limit to 5 to avoid overwhelming output)
|
|
50
|
+
const maxGaugesToShow = 5;
|
|
51
|
+
const gaugesToShow = gaugesWithDistance.slice(0, maxGaugesToShow);
|
|
52
|
+
for (const { gauge, distance } of gaugesToShow) {
|
|
53
|
+
output += formatGaugeDetails(gauge, distance, timezone);
|
|
54
|
+
}
|
|
55
|
+
if (gaugesWithDistance.length > maxGaugesToShow) {
|
|
56
|
+
output += `\n*Note: ${gaugesWithDistance.length - maxGaugesToShow} additional gauge${gaugesWithDistance.length - maxGaugesToShow > 1 ? 's' : ''} found within radius (showing nearest ${maxGaugesToShow} only)*\n`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
output += `❌ **Error retrieving river gauge data**\n\n`;
|
|
62
|
+
output += `Unable to fetch river conditions. This may be due to:\n`;
|
|
63
|
+
output += `- Temporary service unavailability\n`;
|
|
64
|
+
output += `- Network connectivity issues\n`;
|
|
65
|
+
output += `- Location outside NOAA coverage area (US only)\n\n`;
|
|
66
|
+
output += `Error details: ${error instanceof Error ? error.message : String(error)}\n`;
|
|
67
|
+
}
|
|
68
|
+
output += `\n---\n`;
|
|
69
|
+
output += `*Data sources: NOAA National Water Prediction Service (NWPS), USGS Water Services*\n`;
|
|
70
|
+
output += `*River conditions are updated hourly. Always consult official sources for critical decisions.*\n`;
|
|
71
|
+
return {
|
|
72
|
+
content: [
|
|
73
|
+
{
|
|
74
|
+
type: 'text',
|
|
75
|
+
text: output
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Format detailed information for a single river gauge
|
|
82
|
+
*/
|
|
83
|
+
function formatGaugeDetails(gauge, distance, timezone) {
|
|
84
|
+
let output = `## ${gauge.name}\n\n`;
|
|
85
|
+
output += `**Distance:** ${distance.toFixed(1)} km (${(distance * 0.621371).toFixed(1)} mi)\n`;
|
|
86
|
+
output += `**Location:** ${gauge.state}${gauge.county ? `, ${gauge.county} County` : ''}\n`;
|
|
87
|
+
output += `**Coordinates:** ${gauge.latitude.toFixed(4)}, ${gauge.longitude.toFixed(4)}\n`;
|
|
88
|
+
output += `**Gauge ID:** ${gauge.lid}${gauge.usgsId ? ` (USGS: ${gauge.usgsId})` : ''}\n`;
|
|
89
|
+
output += `**Status:** ${gauge.inService ? '✅ Active' : '❌ Out of Service'}\n\n`;
|
|
90
|
+
// Current conditions
|
|
91
|
+
if (gauge.status.observed) {
|
|
92
|
+
const obs = gauge.status.observed;
|
|
93
|
+
output += `### Current Conditions\n`;
|
|
94
|
+
output += `**Observed:** ${formatInTimezone(obs.validTime, timezone)}\n`;
|
|
95
|
+
if (obs.primary !== null) {
|
|
96
|
+
output += `**River Stage:** ${obs.primary.toFixed(2)} ft\n`;
|
|
97
|
+
}
|
|
98
|
+
if (obs.secondary !== null) {
|
|
99
|
+
output += `**Flow Rate:** ${obs.secondary.toFixed(2)} kcfs (${(obs.secondary * 1000).toFixed(0)} cfs)\n`;
|
|
100
|
+
}
|
|
101
|
+
// Flood category with emoji
|
|
102
|
+
const floodEmoji = getFloodEmoji(obs.floodCategory);
|
|
103
|
+
const floodText = obs.floodCategory ? obs.floodCategory.toUpperCase() : 'NO FLOODING';
|
|
104
|
+
output += `**Flood Category:** ${floodEmoji} ${floodText}\n\n`;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
output += `### Current Conditions\n`;
|
|
108
|
+
output += `*No current observations available*\n\n`;
|
|
109
|
+
}
|
|
110
|
+
// Flood stages
|
|
111
|
+
if (gauge.flood?.categories) {
|
|
112
|
+
const cat = gauge.flood.categories;
|
|
113
|
+
output += `### Flood Stages\n`;
|
|
114
|
+
output += `**Action Stage:** ${cat.action.toFixed(1)} ft\n`;
|
|
115
|
+
output += `**Minor Flood:** ${cat.minor.toFixed(1)} ft\n`;
|
|
116
|
+
output += `**Moderate Flood:** ${cat.moderate.toFixed(1)} ft\n`;
|
|
117
|
+
output += `**Major Flood:** ${cat.major.toFixed(1)} ft\n\n`;
|
|
118
|
+
// Show stage relative to flood levels if we have current stage
|
|
119
|
+
if (gauge.status.observed?.primary !== null && gauge.status.observed?.primary !== undefined) {
|
|
120
|
+
const currentStage = gauge.status.observed.primary;
|
|
121
|
+
const pctToAction = ((currentStage / cat.action) * 100).toFixed(0);
|
|
122
|
+
output += `**Current stage is ${pctToAction}% of action stage**\n\n`;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Forecast (if available)
|
|
126
|
+
if (gauge.status.forecast) {
|
|
127
|
+
const forecast = gauge.status.forecast;
|
|
128
|
+
output += `### Forecast\n`;
|
|
129
|
+
output += `**Valid Time:** ${formatInTimezone(forecast.validTime, timezone)}\n`;
|
|
130
|
+
if (forecast.primary !== null) {
|
|
131
|
+
output += `**Forecasted Stage:** ${forecast.primary.toFixed(2)} ft\n`;
|
|
132
|
+
}
|
|
133
|
+
if (forecast.secondary !== null) {
|
|
134
|
+
output += `**Forecasted Flow:** ${forecast.secondary.toFixed(2)} kcfs\n`;
|
|
135
|
+
}
|
|
136
|
+
const forecastFloodEmoji = getFloodEmoji(forecast.floodCategory);
|
|
137
|
+
const forecastFloodText = forecast.floodCategory ? forecast.floodCategory.toUpperCase() : 'NO FLOODING';
|
|
138
|
+
output += `**Forecasted Category:** ${forecastFloodEmoji} ${forecastFloodText}\n\n`;
|
|
139
|
+
}
|
|
140
|
+
// Historic crests (if available and significant)
|
|
141
|
+
if (gauge.flood?.crests?.recent && gauge.flood.crests.recent.length > 0) {
|
|
142
|
+
output += `### Recent Historic Crests\n`;
|
|
143
|
+
const recentCrests = gauge.flood.crests.recent.slice(0, 3); // Show top 3
|
|
144
|
+
for (const crest of recentCrests) {
|
|
145
|
+
const crestDate = new Date(crest.date);
|
|
146
|
+
output += `- **${crestDate.getFullYear()}:** ${crest.value.toFixed(2)} ft`;
|
|
147
|
+
if (crest.flow) {
|
|
148
|
+
output += ` (${crest.flow.toFixed(0)} cfs)`;
|
|
149
|
+
}
|
|
150
|
+
if (crest.description) {
|
|
151
|
+
output += ` - ${crest.description}`;
|
|
152
|
+
}
|
|
153
|
+
output += `\n`;
|
|
154
|
+
}
|
|
155
|
+
output += `\n`;
|
|
156
|
+
}
|
|
157
|
+
output += `---\n\n`;
|
|
158
|
+
return output;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get emoji for flood category
|
|
162
|
+
*/
|
|
163
|
+
function getFloodEmoji(category) {
|
|
164
|
+
if (!category || category === 'no flooding')
|
|
165
|
+
return '✅';
|
|
166
|
+
if (category === 'action')
|
|
167
|
+
return '🟡';
|
|
168
|
+
if (category === 'minor')
|
|
169
|
+
return '🟠';
|
|
170
|
+
if (category === 'moderate')
|
|
171
|
+
return '🔴';
|
|
172
|
+
if (category === 'major')
|
|
173
|
+
return '🔴🔴';
|
|
174
|
+
return '⚪';
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=riverConditionsHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"riverConditionsHandler.js","sourceRoot":"","sources":["../../src/handlers/riverConditionsHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AASzD,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAa,EACb,WAAwB;IAExB,gDAAgD;IAChD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAE1D,4BAA4B;IAC5B,IAAI,MAAM,GAAI,IAA4B,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,gBAAgB;IAC1E,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrE,MAAM,GAAG,EAAE,CAAC;IACd,CAAC;IACD,kCAAkC;IAClC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAE5C,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE9D,IAAI,MAAM,GAAG,+BAA+B,CAAC;IAC7C,MAAM,IAAI,iBAAiB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,MAAM,IAAI,sBAAsB,MAAM,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;IAE1F,IAAI,CAAC;QACH,+CAA+C;QAC/C,0EAA0E;QAC1E,MAAM,QAAQ,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC,6CAA6C;QAC5E,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,sBAAsB;QAE5F,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC;QAEhD,mFAAmF;QACnF,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,0BAA0B,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAE3F,gEAAgE;QAChE,mDAAmD;QACnD,MAAM,kBAAkB,GAAG,WAAW;aACnC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACb,KAAK;YACL,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;SAClF,CAAC,CAAC;aACF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;aACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,wBAAwB;QAEpE,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,qCAAqC,MAAM,WAAW,CAAC;YACjE,MAAM,IAAI,yFAAyF,CAAC;YACpG,MAAM,IAAI,iFAAiF,CAAC;QAC9F,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,cAAc,kBAAkB,CAAC,MAAM,eAAe,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;YAEjH,4EAA4E;YAC5E,MAAM,eAAe,GAAG,CAAC,CAAC;YAC1B,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;YAElE,KAAK,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,YAAY,EAAE,CAAC;gBAC/C,MAAM,IAAI,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC1D,CAAC;YAED,IAAI,kBAAkB,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;gBAChD,MAAM,IAAI,YAAY,kBAAkB,CAAC,MAAM,GAAG,eAAe,oBAAoB,kBAAkB,CAAC,MAAM,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,yCAAyC,eAAe,WAAW,CAAC;YACrN,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,6CAA6C,CAAC;QACxD,MAAM,IAAI,yDAAyD,CAAC;QACpE,MAAM,IAAI,sCAAsC,CAAC;QACjD,MAAM,IAAI,iCAAiC,CAAC;QAC5C,MAAM,IAAI,qDAAqD,CAAC;QAChE,MAAM,IAAI,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IACzF,CAAC;IAED,MAAM,IAAI,SAAS,CAAC;IACpB,MAAM,IAAI,sFAAsF,CAAC;IACjG,MAAM,IAAI,kGAAkG,CAAC;IAE7G,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,MAAM;aACb;SACF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAgB,EAAE,QAAgB,EAAE,QAAgB;IAC9E,IAAI,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC;IACpC,MAAM,IAAI,iBAAiB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/F,MAAM,IAAI,iBAAiB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IAC5F,MAAM,IAAI,oBAAoB,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3F,MAAM,IAAI,iBAAiB,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IAC1F,MAAM,IAAI,eAAe,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,MAAM,CAAC;IAEjF,qBAAqB;IACrB,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAClC,MAAM,IAAI,0BAA0B,CAAC;QACrC,MAAM,IAAI,iBAAiB,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC;QAEzE,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,oBAAoB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9D,CAAC;QAED,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,kBAAkB,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3G,CAAC;QAED,4BAA4B;QAC5B,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;QACtF,MAAM,IAAI,uBAAuB,UAAU,IAAI,SAAS,MAAM,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,0BAA0B,CAAC;QACrC,MAAM,IAAI,yCAAyC,CAAC;IACtD,CAAC;IAED,eAAe;IACf,IAAI,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;QACnC,MAAM,IAAI,oBAAoB,CAAC;QAC/B,MAAM,IAAI,qBAAqB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,MAAM,IAAI,oBAAoB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1D,MAAM,IAAI,uBAAuB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAChE,MAAM,IAAI,oBAAoB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAE5D,+DAA+D;QAC/D,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;YAC5F,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YACnD,MAAM,WAAW,GAAG,CAAC,CAAC,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACnE,MAAM,IAAI,sBAAsB,WAAW,yBAAyB,CAAC;QACvE,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QACvC,MAAM,IAAI,gBAAgB,CAAC;QAC3B,MAAM,IAAI,mBAAmB,gBAAgB,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC;QAEhF,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,yBAAyB,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QACxE,CAAC;QAED,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAChC,MAAM,IAAI,wBAAwB,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3E,CAAC;QAED,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACjE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;QACxG,MAAM,IAAI,4BAA4B,kBAAkB,IAAI,iBAAiB,MAAM,CAAC;IACtF,CAAC;IAED,iDAAiD;IACjD,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,8BAA8B,CAAC;QACzC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa;QACzE,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,IAAI,OAAO,SAAS,CAAC,WAAW,EAAE,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;YAC3E,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9C,CAAC;YACD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,MAAM,IAAI,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC;YACtC,CAAC;YACD,MAAM,IAAI,IAAI,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,IAAI,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,SAAS,CAAC;IACpB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,QAAmC;IACxD,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,aAAa;QAAE,OAAO,GAAG,CAAC;IACxD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC;IACxC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handlers for saved location management tools
|
|
3
|
+
*/
|
|
4
|
+
import { LocationStore } from '../services/locationStore.js';
|
|
5
|
+
import { NominatimService } from '../services/nominatim.js';
|
|
6
|
+
/**
|
|
7
|
+
* Save a location for future use
|
|
8
|
+
*/
|
|
9
|
+
export declare function handleSaveLocation(args: unknown, locationStore: LocationStore, nominatimService: NominatimService): Promise<{
|
|
10
|
+
content: Array<{
|
|
11
|
+
type: string;
|
|
12
|
+
text: string;
|
|
13
|
+
}>;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* List all saved locations
|
|
17
|
+
*/
|
|
18
|
+
export declare function handleListSavedLocations(locationStore: LocationStore): Promise<{
|
|
19
|
+
content: Array<{
|
|
20
|
+
type: string;
|
|
21
|
+
text: string;
|
|
22
|
+
}>;
|
|
23
|
+
}>;
|
|
24
|
+
/**
|
|
25
|
+
* Get details for a specific saved location
|
|
26
|
+
*/
|
|
27
|
+
export declare function handleGetSavedLocation(args: unknown, locationStore: LocationStore): Promise<{
|
|
28
|
+
content: Array<{
|
|
29
|
+
type: string;
|
|
30
|
+
text: string;
|
|
31
|
+
}>;
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Remove a saved location
|
|
35
|
+
*/
|
|
36
|
+
export declare function handleRemoveSavedLocation(args: unknown, locationStore: LocationStore): Promise<{
|
|
37
|
+
content: Array<{
|
|
38
|
+
type: string;
|
|
39
|
+
text: string;
|
|
40
|
+
}>;
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Resolve a location_name to coordinates
|
|
44
|
+
* This is a helper function used by weather tools
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveLocationName(locationName: string, locationStore: LocationStore): {
|
|
47
|
+
latitude: number;
|
|
48
|
+
longitude: number;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=savedLocationsHandler.d.ts.map
|
|
@@ -0,0 +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,CA0M7D;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,CAgF7D;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"}
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handlers for saved location management tools
|
|
3
|
+
*/
|
|
4
|
+
import { validateLatitude, validateLongitude } from '../utils/validation.js';
|
|
5
|
+
/**
|
|
6
|
+
* Escape user input for safe embedding in Markdown
|
|
7
|
+
*/
|
|
8
|
+
function escapeMarkdown(text) {
|
|
9
|
+
return text
|
|
10
|
+
.replace(/\\/g, '\\\\')
|
|
11
|
+
.replace(/\*/g, '\\*')
|
|
12
|
+
.replace(/_/g, '\\_')
|
|
13
|
+
.replace(/\[/g, '\\[')
|
|
14
|
+
.replace(/\]/g, '\\]')
|
|
15
|
+
.replace(/\(/g, '\\(')
|
|
16
|
+
.replace(/\)/g, '\\)')
|
|
17
|
+
.replace(/</g, '<')
|
|
18
|
+
.replace(/>/g, '>')
|
|
19
|
+
.replace(/`/g, '\\`')
|
|
20
|
+
.replace(/~/g, '\\~')
|
|
21
|
+
.replace(/#/g, '\\#')
|
|
22
|
+
.replace(/!/g, '\\!')
|
|
23
|
+
.replace(/\n/g, ' ')
|
|
24
|
+
.replace(/\r/g, '');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Save a location for future use
|
|
28
|
+
*/
|
|
29
|
+
export async function handleSaveLocation(args, locationStore, nominatimService) {
|
|
30
|
+
const saveArgs = args;
|
|
31
|
+
// Validate alias
|
|
32
|
+
if (!saveArgs.alias || typeof saveArgs.alias !== 'string') {
|
|
33
|
+
throw new Error('alias parameter is required and must be a string');
|
|
34
|
+
}
|
|
35
|
+
const alias = saveArgs.alias.toLowerCase().trim();
|
|
36
|
+
if (alias.length === 0) {
|
|
37
|
+
throw new Error('alias cannot be empty');
|
|
38
|
+
}
|
|
39
|
+
if (alias.length > 50) {
|
|
40
|
+
throw new Error('alias must be 50 characters or less');
|
|
41
|
+
}
|
|
42
|
+
// Validate activities if provided
|
|
43
|
+
let activities;
|
|
44
|
+
let activitiesProvided = false;
|
|
45
|
+
if (saveArgs.activities !== undefined) {
|
|
46
|
+
activitiesProvided = true;
|
|
47
|
+
if (!Array.isArray(saveArgs.activities)) {
|
|
48
|
+
throw new Error('activities must be an array of strings');
|
|
49
|
+
}
|
|
50
|
+
// Validate each activity
|
|
51
|
+
const validatedActivities = [];
|
|
52
|
+
for (const activity of saveArgs.activities) {
|
|
53
|
+
if (typeof activity !== 'string') {
|
|
54
|
+
throw new Error('Each activity must be a string');
|
|
55
|
+
}
|
|
56
|
+
const trimmed = activity.trim();
|
|
57
|
+
if (trimmed.length === 0) {
|
|
58
|
+
continue; // Skip empty strings
|
|
59
|
+
}
|
|
60
|
+
if (trimmed.length > 50) {
|
|
61
|
+
throw new Error('Each activity must be 50 characters or less');
|
|
62
|
+
}
|
|
63
|
+
validatedActivities.push(trimmed.toLowerCase());
|
|
64
|
+
}
|
|
65
|
+
// Only set activities if there are valid ones
|
|
66
|
+
if (validatedActivities.length > 0) {
|
|
67
|
+
activities = validatedActivities;
|
|
68
|
+
}
|
|
69
|
+
// If empty array provided, activities stays undefined but activitiesProvided is true
|
|
70
|
+
}
|
|
71
|
+
// Check for partial update mode (updating existing location without re-specifying coordinates)
|
|
72
|
+
const hasLocationDetails = saveArgs.location_query ||
|
|
73
|
+
(typeof saveArgs.latitude === 'number' && typeof saveArgs.longitude === 'number');
|
|
74
|
+
const existingLocation = locationStore.get(alias);
|
|
75
|
+
const isPartialUpdate = existingLocation && !hasLocationDetails;
|
|
76
|
+
let latitude;
|
|
77
|
+
let longitude;
|
|
78
|
+
let name;
|
|
79
|
+
let timezone;
|
|
80
|
+
let country_code;
|
|
81
|
+
let admin1;
|
|
82
|
+
let admin2;
|
|
83
|
+
if (isPartialUpdate) {
|
|
84
|
+
// Partial update: preserve existing location data, only update specified fields
|
|
85
|
+
latitude = existingLocation.latitude;
|
|
86
|
+
longitude = existingLocation.longitude;
|
|
87
|
+
name = saveArgs.name || existingLocation.name;
|
|
88
|
+
timezone = existingLocation.timezone;
|
|
89
|
+
country_code = existingLocation.country_code;
|
|
90
|
+
admin1 = existingLocation.admin1;
|
|
91
|
+
admin2 = existingLocation.admin2;
|
|
92
|
+
// If activities not provided, preserve existing ones
|
|
93
|
+
// If activities provided (even if empty array), use the new value (which may be undefined)
|
|
94
|
+
if (!activitiesProvided) {
|
|
95
|
+
activities = existingLocation.activities;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else if (saveArgs.location_query && typeof saveArgs.location_query === 'string') {
|
|
99
|
+
// Geocode the query
|
|
100
|
+
const query = saveArgs.location_query.trim();
|
|
101
|
+
const results = await nominatimService.searchLocation(query, 1);
|
|
102
|
+
if (!results.results || results.results.length === 0) {
|
|
103
|
+
throw new Error(`Could not find location "${query}". Please try:\n` +
|
|
104
|
+
`- Being more specific (e.g., "Seattle, WA, USA" instead of "Seattle")\n` +
|
|
105
|
+
`- Using a different spelling\n` +
|
|
106
|
+
`- Providing coordinates directly with latitude and longitude parameters`);
|
|
107
|
+
}
|
|
108
|
+
const location = results.results[0];
|
|
109
|
+
latitude = location.latitude;
|
|
110
|
+
longitude = location.longitude;
|
|
111
|
+
name = saveArgs.name || location.name;
|
|
112
|
+
timezone = location.timezone;
|
|
113
|
+
country_code = location.country_code;
|
|
114
|
+
admin1 = location.admin1;
|
|
115
|
+
admin2 = location.admin2;
|
|
116
|
+
}
|
|
117
|
+
else if (typeof saveArgs.latitude === 'number' &&
|
|
118
|
+
typeof saveArgs.longitude === 'number') {
|
|
119
|
+
// Use provided coordinates
|
|
120
|
+
latitude = saveArgs.latitude;
|
|
121
|
+
longitude = saveArgs.longitude;
|
|
122
|
+
validateLatitude(latitude);
|
|
123
|
+
validateLongitude(longitude);
|
|
124
|
+
if (!saveArgs.name || typeof saveArgs.name !== 'string') {
|
|
125
|
+
throw new Error('name parameter is required when providing coordinates directly');
|
|
126
|
+
}
|
|
127
|
+
name = saveArgs.name;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
throw new Error('Either location_query OR (latitude + longitude + name) must be provided');
|
|
131
|
+
}
|
|
132
|
+
// Check if this is an update or new location
|
|
133
|
+
const isUpdate = locationStore.has(alias);
|
|
134
|
+
// Save the location
|
|
135
|
+
locationStore.set(alias, {
|
|
136
|
+
name,
|
|
137
|
+
latitude,
|
|
138
|
+
longitude,
|
|
139
|
+
timezone,
|
|
140
|
+
country_code,
|
|
141
|
+
admin1,
|
|
142
|
+
admin2,
|
|
143
|
+
description: saveArgs.description,
|
|
144
|
+
alternateNames: saveArgs.alternateNames,
|
|
145
|
+
notes: saveArgs.notes,
|
|
146
|
+
activities
|
|
147
|
+
});
|
|
148
|
+
// Determine what type of operation this was
|
|
149
|
+
let operationType = 'Saved';
|
|
150
|
+
if (isPartialUpdate) {
|
|
151
|
+
operationType = 'Updated';
|
|
152
|
+
}
|
|
153
|
+
else if (isUpdate) {
|
|
154
|
+
operationType = 'Updated';
|
|
155
|
+
}
|
|
156
|
+
let output = `# ${operationType} Location\n\n`;
|
|
157
|
+
output += `**Alias:** \`${escapeMarkdown(alias)}\`\n`;
|
|
158
|
+
output += `**Name:** ${escapeMarkdown(name)}\n`;
|
|
159
|
+
output += `**Coordinates:** ${latitude.toFixed(4)}°, ${longitude.toFixed(4)}°\n`;
|
|
160
|
+
if (timezone) {
|
|
161
|
+
output += `**Timezone:** ${timezone}\n`;
|
|
162
|
+
}
|
|
163
|
+
if (country_code) {
|
|
164
|
+
output += `**Country:** ${country_code.toUpperCase()}\n`;
|
|
165
|
+
}
|
|
166
|
+
if (admin1) {
|
|
167
|
+
output += `**Region:** ${escapeMarkdown(admin1)}\n`;
|
|
168
|
+
}
|
|
169
|
+
if (saveArgs.description) {
|
|
170
|
+
output += `**Description:** ${escapeMarkdown(saveArgs.description)}\n`;
|
|
171
|
+
}
|
|
172
|
+
if (saveArgs.alternateNames && saveArgs.alternateNames.length > 0) {
|
|
173
|
+
output += `**Alternate Names:** ${saveArgs.alternateNames.map(escapeMarkdown).join(', ')}\n`;
|
|
174
|
+
}
|
|
175
|
+
if (saveArgs.notes) {
|
|
176
|
+
output += `**Notes:** ${escapeMarkdown(saveArgs.notes)}\n`;
|
|
177
|
+
}
|
|
178
|
+
if (activities && activities.length > 0) {
|
|
179
|
+
output += `**Activities:** ${activities.map(a => escapeMarkdown(a)).join(', ')}\n`;
|
|
180
|
+
}
|
|
181
|
+
output += `\n`;
|
|
182
|
+
output += `---\n\n`;
|
|
183
|
+
output += `This location is now saved and can be used with any weather tool:\n\n`;
|
|
184
|
+
output += `- \`get_forecast(location_name="${alias}")\`\n`;
|
|
185
|
+
output += `- \`get_alerts(location_name="${alias}")\`\n`;
|
|
186
|
+
output += `- And all other weather tools\n\n`;
|
|
187
|
+
if (activities && activities.length > 0) {
|
|
188
|
+
output += `The activities you've tagged will help the AI provide relevant weather information.\n\n`;
|
|
189
|
+
}
|
|
190
|
+
output += `*Storage location: ${locationStore.getStorePath()}*\n`;
|
|
191
|
+
return {
|
|
192
|
+
content: [
|
|
193
|
+
{
|
|
194
|
+
type: 'text',
|
|
195
|
+
text: output
|
|
196
|
+
}
|
|
197
|
+
]
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* List all saved locations
|
|
202
|
+
*/
|
|
203
|
+
export async function handleListSavedLocations(locationStore) {
|
|
204
|
+
const locations = locationStore.getAll();
|
|
205
|
+
const aliases = Object.keys(locations).sort();
|
|
206
|
+
if (aliases.length === 0) {
|
|
207
|
+
return {
|
|
208
|
+
content: [
|
|
209
|
+
{
|
|
210
|
+
type: 'text',
|
|
211
|
+
text: `# Saved Locations\n\n` +
|
|
212
|
+
`No saved locations yet.\n\n` +
|
|
213
|
+
`Use \`save_location\` to save your favorite locations:\n\n` +
|
|
214
|
+
`\`\`\`\n` +
|
|
215
|
+
`save_location(alias="home", location_query="Seattle, WA")\n` +
|
|
216
|
+
`save_location(alias="cabin", location_query="Lake Tahoe, CA")\n` +
|
|
217
|
+
`\`\`\`\n\n` +
|
|
218
|
+
`*Storage location: ${locationStore.getStorePath()}*\n`
|
|
219
|
+
}
|
|
220
|
+
]
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
let output = `# Saved Locations\n\n`;
|
|
224
|
+
output += `**Total:** ${aliases.length} location${aliases.length > 1 ? 's' : ''}\n\n`;
|
|
225
|
+
output += `---\n\n`;
|
|
226
|
+
for (const alias of aliases) {
|
|
227
|
+
const location = locations[alias];
|
|
228
|
+
output += `## \`${escapeMarkdown(alias)}\`\n\n`;
|
|
229
|
+
output += `**Name:** ${escapeMarkdown(location.name)}\n`;
|
|
230
|
+
output += `**Coordinates:** ${location.latitude.toFixed(4)}°, ${location.longitude.toFixed(4)}°\n`;
|
|
231
|
+
if (location.description) {
|
|
232
|
+
output += `**Description:** ${escapeMarkdown(location.description)}\n`;
|
|
233
|
+
}
|
|
234
|
+
if (location.alternateNames && location.alternateNames.length > 0) {
|
|
235
|
+
output += `**Alternate Names:** ${location.alternateNames.map(escapeMarkdown).join(', ')}\n`;
|
|
236
|
+
}
|
|
237
|
+
if (location.timezone) {
|
|
238
|
+
output += `**Timezone:** ${location.timezone}\n`;
|
|
239
|
+
}
|
|
240
|
+
if (location.country_code) {
|
|
241
|
+
output += `**Country:** ${location.country_code.toUpperCase()}\n`;
|
|
242
|
+
}
|
|
243
|
+
if (location.admin1) {
|
|
244
|
+
output += `**Region:** ${escapeMarkdown(location.admin1)}\n`;
|
|
245
|
+
}
|
|
246
|
+
if (location.notes) {
|
|
247
|
+
output += `**Notes:** ${escapeMarkdown(location.notes)}\n`;
|
|
248
|
+
}
|
|
249
|
+
if (location.activities && location.activities.length > 0) {
|
|
250
|
+
output += `**Activities:** ${location.activities.map(a => escapeMarkdown(a)).join(', ')}\n`;
|
|
251
|
+
}
|
|
252
|
+
output += `**Saved:** ${new Date(location.saved_at).toLocaleDateString()}\n`;
|
|
253
|
+
if (location.saved_at !== location.updated_at) {
|
|
254
|
+
output += `**Updated:** ${new Date(location.updated_at).toLocaleDateString()}\n`;
|
|
255
|
+
}
|
|
256
|
+
output += `\n`;
|
|
257
|
+
}
|
|
258
|
+
output += `---\n\n`;
|
|
259
|
+
output += `**Usage Examples:**\n\n`;
|
|
260
|
+
output += `\`\`\`\n`;
|
|
261
|
+
for (const alias of aliases.slice(0, 3)) {
|
|
262
|
+
output += `get_forecast(location_name="${alias}")\n`;
|
|
263
|
+
}
|
|
264
|
+
output += `\`\`\`\n\n`;
|
|
265
|
+
output += `*Storage location: ${locationStore.getStorePath()}*\n`;
|
|
266
|
+
return {
|
|
267
|
+
content: [
|
|
268
|
+
{
|
|
269
|
+
type: 'text',
|
|
270
|
+
text: output
|
|
271
|
+
}
|
|
272
|
+
]
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Get details for a specific saved location
|
|
277
|
+
*/
|
|
278
|
+
export async function handleGetSavedLocation(args, locationStore) {
|
|
279
|
+
const getArgs = args;
|
|
280
|
+
if (!getArgs.alias || typeof getArgs.alias !== 'string') {
|
|
281
|
+
throw new Error('alias parameter is required and must be a string');
|
|
282
|
+
}
|
|
283
|
+
const alias = getArgs.alias.toLowerCase().trim();
|
|
284
|
+
const location = locationStore.get(alias);
|
|
285
|
+
if (!location) {
|
|
286
|
+
const available = Object.keys(locationStore.getAll());
|
|
287
|
+
throw new Error(`Location "${alias}" not found.\n\n` +
|
|
288
|
+
(available.length > 0
|
|
289
|
+
? `Available locations: ${available.join(', ')}\n\n`
|
|
290
|
+
: 'No saved locations yet. Use save_location to create one.\n\n') +
|
|
291
|
+
`Use list_saved_locations to see all saved locations.`);
|
|
292
|
+
}
|
|
293
|
+
let output = `# Saved Location: \`${escapeMarkdown(alias)}\`\n\n`;
|
|
294
|
+
output += `**Name:** ${escapeMarkdown(location.name)}\n`;
|
|
295
|
+
output += `**Coordinates:** ${location.latitude.toFixed(4)}°, ${location.longitude.toFixed(4)}°\n`;
|
|
296
|
+
if (location.description) {
|
|
297
|
+
output += `**Description:** ${escapeMarkdown(location.description)}\n`;
|
|
298
|
+
}
|
|
299
|
+
if (location.alternateNames && location.alternateNames.length > 0) {
|
|
300
|
+
output += `**Alternate Names:** ${location.alternateNames.map(escapeMarkdown).join(', ')}\n`;
|
|
301
|
+
}
|
|
302
|
+
if (location.timezone) {
|
|
303
|
+
output += `**Timezone:** ${location.timezone}\n`;
|
|
304
|
+
}
|
|
305
|
+
if (location.country_code) {
|
|
306
|
+
output += `**Country:** ${location.country_code.toUpperCase()}\n`;
|
|
307
|
+
}
|
|
308
|
+
if (location.admin1) {
|
|
309
|
+
output += `**Region:** ${escapeMarkdown(location.admin1)}\n`;
|
|
310
|
+
}
|
|
311
|
+
if (location.admin2) {
|
|
312
|
+
output += `**County:** ${escapeMarkdown(location.admin2)}\n`;
|
|
313
|
+
}
|
|
314
|
+
if (location.notes) {
|
|
315
|
+
output += `**Notes:** ${escapeMarkdown(location.notes)}\n`;
|
|
316
|
+
}
|
|
317
|
+
if (location.activities && location.activities.length > 0) {
|
|
318
|
+
output += `**Activities:** ${location.activities.map(a => escapeMarkdown(a)).join(', ')}\n`;
|
|
319
|
+
}
|
|
320
|
+
output += `**Saved:** ${new Date(location.saved_at).toLocaleString()}\n`;
|
|
321
|
+
if (location.saved_at !== location.updated_at) {
|
|
322
|
+
output += `**Last Updated:** ${new Date(location.updated_at).toLocaleString()}\n`;
|
|
323
|
+
}
|
|
324
|
+
output += `\n`;
|
|
325
|
+
output += `---\n\n`;
|
|
326
|
+
output += `**Usage Examples:**\n\n`;
|
|
327
|
+
output += `\`\`\`\n`;
|
|
328
|
+
output += `get_forecast(location_name="${alias}")\n`;
|
|
329
|
+
output += `get_alerts(location_name="${alias}")\n`;
|
|
330
|
+
output += `get_air_quality(location_name="${alias}")\n`;
|
|
331
|
+
output += `\`\`\`\n`;
|
|
332
|
+
return {
|
|
333
|
+
content: [
|
|
334
|
+
{
|
|
335
|
+
type: 'text',
|
|
336
|
+
text: output
|
|
337
|
+
}
|
|
338
|
+
]
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Remove a saved location
|
|
343
|
+
*/
|
|
344
|
+
export async function handleRemoveSavedLocation(args, locationStore) {
|
|
345
|
+
const removeArgs = args;
|
|
346
|
+
if (!removeArgs.alias || typeof removeArgs.alias !== 'string') {
|
|
347
|
+
throw new Error('alias parameter is required and must be a string');
|
|
348
|
+
}
|
|
349
|
+
const alias = removeArgs.alias.toLowerCase().trim();
|
|
350
|
+
const existed = locationStore.remove(alias);
|
|
351
|
+
if (!existed) {
|
|
352
|
+
const available = Object.keys(locationStore.getAll());
|
|
353
|
+
throw new Error(`Location "${alias}" not found.\n\n` +
|
|
354
|
+
(available.length > 0
|
|
355
|
+
? `Available locations: ${available.join(', ')}`
|
|
356
|
+
: 'No saved locations.'));
|
|
357
|
+
}
|
|
358
|
+
const remaining = locationStore.count();
|
|
359
|
+
let output = `# Location Removed\n\n`;
|
|
360
|
+
output += `Successfully removed location: \`${escapeMarkdown(alias)}\`\n\n`;
|
|
361
|
+
output += `**Remaining locations:** ${remaining}\n\n`;
|
|
362
|
+
if (remaining > 0) {
|
|
363
|
+
output += `Use \`list_saved_locations\` to see remaining locations.\n`;
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
output += `No saved locations remaining.\n\n`;
|
|
367
|
+
output += `Use \`save_location\` to save new locations.`;
|
|
368
|
+
}
|
|
369
|
+
return {
|
|
370
|
+
content: [
|
|
371
|
+
{
|
|
372
|
+
type: 'text',
|
|
373
|
+
text: output
|
|
374
|
+
}
|
|
375
|
+
]
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Resolve a location_name to coordinates
|
|
380
|
+
* This is a helper function used by weather tools
|
|
381
|
+
*/
|
|
382
|
+
export function resolveLocationName(locationName, locationStore) {
|
|
383
|
+
const location = locationStore.get(locationName);
|
|
384
|
+
if (!location) {
|
|
385
|
+
const available = Object.keys(locationStore.getAll());
|
|
386
|
+
throw new Error(`Saved location "${locationName}" not found.\n\n` +
|
|
387
|
+
(available.length > 0
|
|
388
|
+
? `Available locations: ${available.join(', ')}\n\n`
|
|
389
|
+
: 'No saved locations yet. Use save_location to create one.\n\n') +
|
|
390
|
+
`Use list_saved_locations to see all saved locations.`);
|
|
391
|
+
}
|
|
392
|
+
return {
|
|
393
|
+
latitude: location.latitude,
|
|
394
|
+
longitude: location.longitude
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=savedLocationsHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savedLocationsHandler.js","sourceRoot":"","sources":["../../src/handlers/savedLocationsHandler.ts"],"names":[],"mappings":"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"}
|