diff --git a/work/config/.env.example b/work/config/.env.example index 86585e4..04ba643 100644 --- a/work/config/.env.example +++ b/work/config/.env.example @@ -15,7 +15,6 @@ MQTT_PASSWORD= TOMTOM_API_KEY= FIRMS_MAP_KEY= ROADS511_API_KEY= -WZDX_API_KEY= # Notification Credentials SMTP_PASSWORD= diff --git a/work/dashboard-frontend/src/pages/Environment.tsx b/work/dashboard-frontend/src/pages/Environment.tsx index 55d6a5d..58db532 100644 --- a/work/dashboard-frontend/src/pages/Environment.tsx +++ b/work/dashboard-frontend/src/pages/Environment.tsx @@ -31,7 +31,7 @@ interface EnvConfig { usgs_quake: { enabled: boolean; tick_seconds: number; feed_url: string; min_magnitude?: number; bbox?: number[]; global_mag_floor: number; regional_mag_floor: number; regional_radius_mi: number; escalate_mag_floor: number; broadcast_pager_alerts: string[]; region: string; feed_source?: FeedSource } traffic: { enabled: boolean; tick_seconds: number; api_key: string; corridors: { name: string; lat: number; lon: number }[]; feed_source?: FeedSource } roads511: { enabled: boolean; tick_seconds: number; api_key: string; base_url: string; endpoints: string[]; bbox: number[]; feed_source?: FeedSource } - wzdx: { enabled: boolean; tick_seconds: number; api_key: string; base_url: string; endpoints: string[]; bbox: number[]; states: string[]; registry_url: string; registry_ttl?: number; feed_source?: FeedSource } + wzdx: { enabled: boolean; tick_seconds: number; base_url: string; bbox: number[]; states: string[]; registry_url: string; registry_ttl?: number; feed_source?: FeedSource } firms: { enabled: boolean; tick_seconds: number; map_key: string; source: string; bbox: number[]; day_range: number; confidence_min: string; proximity_km: number; feed_source?: FeedSource } // FEMA IPAWS-OPEN civil-alert feed (native only). Two-stage Atom+CAP fetch; // NON-weather emergencies (evacuation, AMBER, HazMat, 911 outage, …) → the @@ -1392,9 +1392,7 @@ const save = async () => { {env.wzdx?.feed_source !== 'central' && ( <> up({ wzdx: { ...env.wzdx!, base_url: v } })} placeholder="https://511.yourstate.gov/api/v2" /> - up({ wzdx: { ...env.wzdx!, tick_seconds: v } })} min={60} /> - up({ wzdx: { ...env.wzdx!, endpoints: v } })} helper="e.g., /get/event" /> {scopedByCoverage('wzdx') ? (
Bounding box and states are set by the{' '} diff --git a/work/meshai/config.py b/work/meshai/config.py index 2976d5d..52cd438 100644 --- a/work/meshai/config.py +++ b/work/meshai/config.py @@ -482,14 +482,12 @@ class WZDxConfig(_SourcedFeed): Native adapter discovers state DOT WZDx v4 GeoJSON feeds via the FHWA WZDx Feed Registry (keyless), filters to `states`, then polls each matching feed and parses ``work-zone`` road_events into canonical - ``work_zone`` events. Keyless: ``api_key`` is retained but unused. + ``work_zone`` events. """ enabled: bool = False tick_seconds: int = 300 # per-feed poll interval - api_key: str = "" # unused (keyless); retained for parity / ${ENV_VAR} base_url: str = "" # optional single-feed override (skips registry when set) - endpoints: list = field(default_factory=lambda: ["/get/event"]) bbox: list = field(default_factory=list) # [west, south, east, north] optional filter # FHWA WZDx Feed Registry (Socrata) — rows describe every state DOT feed. registry_url: str = ( diff --git a/work/meshai/config_loader.py b/work/meshai/config_loader.py index 34d73bc..ed2e883 100644 --- a/work/meshai/config_loader.py +++ b/work/meshai/config_loader.py @@ -84,7 +84,6 @@ SECRET_FIELDS: set[str] = { "environmental.traffic.api_key", "environmental.firms.map_key", "environmental.roads511.api_key", - "environmental.wzdx.api_key", "notifications.rules.*.smtp_password", "notifications.toggles.*.smtp_password", "danger_zones.webhook_url", @@ -100,7 +99,6 @@ EXPECTED_SECRETS: list[str] = [ "TOMTOM_API_KEY", "FIRMS_MAP_KEY", "ROADS511_API_KEY", - "WZDX_API_KEY", "SMTP_PASSWORD", ] diff --git a/work/meshai/env/wzdx.py b/work/meshai/env/wzdx.py index 0410487..2818d41 100644 --- a/work/meshai/env/wzdx.py +++ b/work/meshai/env/wzdx.py @@ -51,7 +51,6 @@ restart-seed all dedup on the same coalesced value). import calendar import json import logging -import os import time from datetime import datetime from typing import TYPE_CHECKING, Optional @@ -110,7 +109,6 @@ class WZDxAdapter: """FHWA WZDx work-zone polling adapter (native ``work_zone`` source).""" def __init__(self, config: "WZDxConfig", coverage: dict = None): - self._api_key = self._resolve_env(config.api_key or "") # unused (keyless) self._base_url = (config.base_url or "").strip().rstrip("/") self._registry_url = (config.registry_url or "").strip() self._registry_ttl = config.registry_ttl or 21600 @@ -135,12 +133,6 @@ class WZDxAdapter: # ── helpers ──────────────────────────────────────────────────────────── - def _resolve_env(self, value: str) -> str: - """Resolve ${ENV_VAR} references in value.""" - if value and value.startswith("${") and value.endswith("}"): - return os.environ.get(value[2:-1], "") - return value - def _wanted_states(self) -> set: """Lowercased set of accepted state tokens (abbrev + full name).""" wanted = set() diff --git a/work/meshai/secrets_store.py b/work/meshai/secrets_store.py index 7b04fff..e30ef38 100644 --- a/work/meshai/secrets_store.py +++ b/work/meshai/secrets_store.py @@ -24,7 +24,6 @@ SECRET_FIELD_TO_ENV: dict[str, str] = { "environmental.traffic.api_key": "TOMTOM_API_KEY", "environmental.firms.map_key": "FIRMS_MAP_KEY", "environmental.roads511.api_key": "ROADS511_API_KEY", - "environmental.wzdx.api_key": "WZDX_API_KEY", "notifications.toggles.*.smtp_password": "SMTP_PASSWORD", "notifications.rules.*.smtp_password": "SMTP_PASSWORD", "mesh_sources.*.api_token": "MESHMONITOR_API_TOKEN", @@ -51,7 +50,6 @@ SECRET_LABELS: dict[str, str] = { "TOMTOM_API_KEY": "TomTom API key", "FIRMS_MAP_KEY": "NASA FIRMS MAP_KEY", "ROADS511_API_KEY": "511 Roads API key", - "WZDX_API_KEY": "WZDx API key", "SMTP_PASSWORD": "SMTP password", "MESHMONITOR_API_TOKEN": "MeshMonitor API token", "MQTT_PASSWORD": "MQTT password", diff --git a/work/tests/test_adapter_wzdx.py b/work/tests/test_adapter_wzdx.py index c8d5eb8..b347324 100644 --- a/work/tests/test_adapter_wzdx.py +++ b/work/tests/test_adapter_wzdx.py @@ -35,7 +35,6 @@ def mock_config(): return SimpleNamespace( enabled=True, feed_source="native", - api_key="", base_url="", registry_url="https://datahub.transportation.gov/resource/69qe-yiui.json?$limit=200", registry_ttl=21600, diff --git a/work/tests/test_coverage_wiring.py b/work/tests/test_coverage_wiring.py index 1ff234f..f7d10be 100644 --- a/work/tests/test_coverage_wiring.py +++ b/work/tests/test_coverage_wiring.py @@ -97,7 +97,6 @@ def test_roads511_fallback_to_config(): def _wzdx_cfg(states=None, bbox=None): cfg = MagicMock() - cfg.api_key = "" cfg.base_url = "" cfg.registry_url = "https://example.test/registry.json" cfg.registry_ttl = 21600 diff --git a/work/tests/test_secrets_store.py b/work/tests/test_secrets_store.py index 0d8ae76..3104015 100644 --- a/work/tests/test_secrets_store.py +++ b/work/tests/test_secrets_store.py @@ -131,7 +131,7 @@ def test_env_to_fields_llm(): def test_secret_labels_keys(): expected = { "GOOGLE_API_KEY", "OPENAI_API_KEY", "ANTHROPIC_API_KEY", "LLM_API_KEY", - "TOMTOM_API_KEY", "FIRMS_MAP_KEY", "ROADS511_API_KEY", "WZDX_API_KEY", + "TOMTOM_API_KEY", "FIRMS_MAP_KEY", "ROADS511_API_KEY", "SMTP_PASSWORD", "MESHMONITOR_API_TOKEN", "MQTT_PASSWORD", } assert set(secrets_store.SECRET_LABELS.keys()) == expected diff --git a/work/tests/test_wzdx_coalescing.py b/work/tests/test_wzdx_coalescing.py index 4362d2e..0957043 100644 --- a/work/tests/test_wzdx_coalescing.py +++ b/work/tests/test_wzdx_coalescing.py @@ -25,7 +25,6 @@ def mock_config(): return SimpleNamespace( enabled=True, feed_source="native", - api_key="", base_url="", registry_url="https://datahub.transportation.gov/resource/69qe-yiui.json?$limit=200", registry_ttl=21600,