Commit Graph

1465 Commits

Author SHA1 Message Date
Elie Habib
0beaffb4a0 feat(map): native mobile map experience with location detection and full feature parity (#619)
- Fix URL restore: lat/lon now override view center when explicitly provided
- Fix touch scroll: 8px threshold before drag activation, preventDefault once active
- Add location bootstrap: timezone-first detection, optional geolocation upgrade
- Enable DeckGL on mobile with deviceMemory capability guard
- Add DeckGL state sync on moveend/zoomend for URL param updates
- Fix breakpoint off-by-one: JS now uses <= to match CSS max-width: 768px
- Add country-click on SVG fallback with CSS transform inversion
- Add fitCountry() to both map engines (DeckGL uses fitBounds, SVG uses projection)
- Add SVG inertial touch animation with exponential velocity decay
- Add mobile map e2e tests for timezone, URL restore, touch, and breakpoint
v2.5.21
2026-03-01 04:37:32 +04:00
Elie Habib
d24e094487 feat(oref): show history waves timeline with translation and NaN fix (#618)
- Fetch and display alert history waves in OrefSirensPanel (cap 50 most recent)
- Last-hour waves highlighted with amber border and RECENT badge
- Translate Hebrew history alerts via existing translateAlerts pipeline
- Guard formatAlertTime/formatWaveTime against NaN from unparseable OREF dates
- Cap relay history bootstrap to 500 records
- Add 3-minute TTL to prevent re-fetching history on every 10s poll
- Remove dead .oref-footer/.oref-history CSS; add i18n key for history summary
2026-03-01 04:23:47 +04:00
Elie Habib
e0d86613e3 fix(aviation): increase cache TTL from 30min to 2h to reduce API quota usage (#617) 2026-03-01 04:22:18 +04:00
Elie Habib
087c3a7477 docs(changelog): add v2.5.21 entry covering 86 merged PRs (#616)
Comprehensive changelog for 2026-03-01 release including Iran Attacks
layer, Telegram Intel panel, OREF sirens, GPS jamming, AviationStack,
breaking news alerts, and strategic risk score.
2026-03-01 04:22:06 +04:00
Elie Habib
a41af6322c fix(api): harden cache-control headers for polymarket and rss-proxy (#613) 2026-03-01 03:40:37 +04:00
Elie Habib
6073189ac3 perf(rss): raise news refresh interval to 10min and cache TTL to 20min (#612)
Reduces upstream RSS polling frequency and extends client-side cache
lifetime to lower API load and bandwidth usage.
2026-03-01 03:33:32 +04:00
Elie Habib
fcf09957a2 Expand country brief and CII signal coverage (#611) 2026-03-01 03:25:53 +04:00
Elie Habib
e1b02f380a fix(docs): add blank lines after CHANGELOG headings for markdownlint (#608) 2026-03-01 03:25:35 +04:00
Elie Habib
0bfd9d568b fix: RT channel HLS-only recovery, test shim, and LiveNOW fallback (#610)
- Remove useFallbackOnly from RT channel — RT is HLS-only (banned from
  YouTube), so the flag was causing undefined videoId on HLS failure
  instead of graceful offline state
- Add response-headers shim to redis-caching test so military flights
  bbox tests can import list-military-flights.ts
- Restore LiveNOW from FOX fallbackVideoId (removed in channel audit)
2026-03-01 03:25:17 +04:00
Elie Habib
1d7547fbb1 fix(relay): increase OREF curl maxBuffer to prevent ENOBUFS (#609)
* fix(relay): increase OREF curl maxBuffer to 10MB to prevent ENOBUFS

AlertsHistory.json response exceeds execFileSync default 1MB buffer,
causing spawnSync ENOBUFS on Railway container at startup.

* fix(relay): use curl -o tmpfile for OREF history instead of stdout buffer

Large AlertsHistory.json overflows execFileSync stdout buffer (ENOBUFS).
Now writes to temp file via curl -o, reads with fs.readFileSync, cleans up.
Live alerts (tiny payload) still use stdout path.
2026-03-01 03:23:57 +04:00
Elie Habib
d3f2c7696b fix(aviation): invalidate stale IndexedDB cache + reduce CDN TTL (#607)
Bump circuit breaker name from 'FAA Flight Delays' to 'Flight Delays v2'
to force all clients to discard stale IndexedDB entries that predate
PR #603 (which added normal-ops airport fill). Also downgrade CDN cache
tier from 'slow' (15 min) to 'medium' (5 min) since airport status
changes more frequently than other slow-tier endpoints.
2026-03-01 02:42:46 +04:00
Elie Habib
39d81600e3 chore: bump version to 2.5.21 (#605) 2026-03-01 02:40:41 +04:00
Elie Habib
863bbbffbc docs(readme): comprehensive update for Telegram, OREF, GPS jamming, airports, and more (#606)
Reflects 30+ recent commits with updates across the README:
- Update data layer counts (36 → 40+), webcam counts (19 → 22), data sources (16 → 28+)
- Add 6 new How It Works sections: Telegram OSINT, OREF Rocket Alerts, GPS/GNSS
  Interference, Security Advisories, Airport Delays/NOTAMs, Strategic Risk Score
- Expand Railway relay section with service table (AIS, OpenSky, Telegram, OREF,
  Polymarket, NOTAM) and update architecture ASCII diagram
- Add Iran/Attacks webcam tab, HLS native streaming details, RT coverage
- Add Algorithmic Design Decisions section (log vs linear scoring, Welford's,
  H3 hex grids, cosine-lat correction, negative caching)
- Add 2 new architecture principles (graceful degradation, multi-source corroboration)
- Add 8 new roadmap items for recently shipped features
- Update Tech Stack table with Telegram, OREF, gpsjam.org in Geopolitical APIs
2026-03-01 02:40:22 +04:00
Elie Habib
64a029d83e fix(webcams): fix broken live news channels — eNCA handle, remove VTC NOW, fix CTI News (#604)
- eNCA: fix YouTube handle from @eNCA to @encanews
- VTC NOW: remove — VTC shut down Jan 2025 (Vietnam govt restructuring)
- CTI News: remove stale fallbackVideoId and useFallbackOnly, let auto-detect work
2026-03-01 02:22:29 +04:00
Elie Habib
6ae95afda8 fix(aviation): always show all monitored airports on flight delays map (#603)
* fix(aviation): always show MENA airports on map regardless of delay status

MENA airports only appeared when they had active delays/closures.
GCC airports like DOH, AUH, RUH were invisible during normal operations.
Now fills in "normal operations" entries for all MENA airports without
alerts so they always render as gray dots on the flight delays layer.

* fix(aviation): show all monitored airports globally, not just MENA

Extend normal-operations fill to all 128 monitored airports worldwide,
not just the 35 MENA airports. Any airport without active delays now
appears as a gray dot on the flight delays map layer.
2026-03-01 02:04:56 +04:00
Elie Habib
9fb95c01df fix(sentry): guard YT player methods + filter GM/InvalidState noise (#602)
- Guard loadVideoById/cueVideoById with typeof check in LiveNewsPanel
  (race condition: YT.Player object exists before onReady fires)
- Add ignoreErrors for GM_getValue (Greasemonkey extension) and
  InvalidStateError (IndexedDB/DOM state errors from browser internals)
2026-03-01 01:39:54 +04:00
Elie Habib
cc224e7aab chore(telegram): update channel list — remove nexta_live, air_alert_ua; add wfwitness (#600) 2026-03-01 01:30:30 +04:00
Elie Habib
333c98ee1a fix(aviation): route NOTAM through relay + improve intl logging (#599)
Root cause: ICAO NOTAM API times out from Vercel edge (>10s).
AviationStack alerts indistinguishable from simulation in logs.

Changes:
- Add /notam proxy endpoint to Railway relay (25s timeout, 30min cache)
- Route fetchNotamClosures through relay when WS_RELAY_URL is set
- Fall back to direct ICAO call (20s timeout) when no relay
- Log cache hits with real vs simulated alert counts
- Send all MENA airports in single NOTAM request (was batched by 20)

Requires: ICAO_API_KEY env var on Railway relay
2026-03-01 01:30:02 +04:00
Elie Habib
da1c4f4f2e fix(webcams): add 4th Iran Attacks feed to fill 2x2 grid (#601)
Add Middle East multi-cam (4E-iFtUM2kk) as 4th Iran region feed.
Previously only 3 feeds for a 4-cell grid, leaving one cell black.
2026-03-01 01:26:17 +04:00
Elie Habib
3a7190d081 fix(polymarket): add queue backpressure and response limit slicing (#593)
- Add POLYMARKET_MAX_QUEUED=20 cap to prevent unbounded queue growth
  under sustained load (rejects with negative cache when full)
- Use requestedLimit to slice cached responses — callers requesting
  limit=20 now get 20 items instead of the full 50-item upstream payload
- Hoist PROXY_STRIP_KEYS Set to module level (avoids per-call allocation)
2026-03-01 00:50:45 +04:00
Elie Habib
9efb473886 fix(relay): stop Polymarket cache stampede from concurrent limit + CDN bypass (#592)
Three issues caused continuous MISS every 5 seconds:

1. Concurrent limit rejection poisoned cache: 11 tags fire via Promise.all
   but POLYMARKET_MAX_CONCURRENT=3, so 8 tags got negative-cached with
   empty [] (5 min TTL). Those 8 tags NEVER got positive cache because
   they were always throttled. Fix: replace reject-with-negative-cache
   with a proper queue — excess requests wait for a slot instead of
   being silently rejected.

2. Cache key fragmentation: fetchPredictions(limit=20) and
   fetchCountryMarkets(limit=30) created separate cache entries for the
   same tag. Fix: normalize to canonical limit=50 upstream, cache key
   is shared regardless of caller's requested limit.

3. CDN bypass: end_date_min timestamp in query string made every URL
   unique, preventing Vercel CDN caching entirely. Fix: strip
   end_date_min, active, archived from proxy params (relay ignores them
   anyway).
2026-03-01 00:46:53 +04:00
Elie Habib
39278bf624 fix(aviation): replace broken lock mechanism with direct cache, add cancellation tiers (#591)
The Redis SETNX lock for AviationStack had a 3s wait but the API takes
~25s for 50 airports. Every lock-loser fell back to simulation — meaning
AviationStack data was never served despite the API key being configured.

Changes:
- Remove fetchIntlWithLock/tryAcquireLock, use getCachedJson/setCachedJson
  with conditional TTL (30min real data, 5min simulation fallback)
- Add cancellation severity tiers: ≥20% moderate, ≥10% minor (DXB at 32%
  cancelled was previously dropped as null)
- Bump cache key to v2 to invalidate stale simulation data
- Add HTML content-type detection for NOTAM API (ICAO CloudFront returns
  HTML challenge pages from Vercel datacenter IPs)
2026-03-01 00:40:04 +04:00
Elie Habib
9dc98ebb02 fix(telegram): add missing relay auth headers to telegram-feed edge function (#590)
The edge function was the only relay proxy missing RELAY_SHARED_SECRET
auth headers. The relay returns 401 for all non-public routes, so the
panel always received an error response → "No messages available".
2026-03-01 00:34:38 +04:00
Elie Habib
05bd705baa feat(live-news): add RT channel via HLS + enable HLS on web (#586)
- Add RT (rt.com) as optional channel in Europe region
- HLS stream: rt-glb.rttv.com/dvr/rtnews/playlist.m3u8 (CORS: *)
- Enable native <video> HLS playback on web (was desktop-only)
- Channels in DIRECT_HLS_MAP with CORS headers now work everywhere
2026-03-01 00:14:02 +04:00
Elie Habib
a12cab8222 feat(feeds): add RT (Russia Today) RSS feeds (#585)
- Add RT main feed (rt.com/rss/) and RT Russia desk (rt.com/rss/russia/)
- Add to SOURCE_TIERS (tier 3), SOURCE_TYPES (wire), SOURCE_CREDIBILITY
- Add rt.com to rss-proxy ALLOWED_DOMAINS
2026-03-01 00:13:43 +04:00
Elie Habib
5364de3e04 fix(relay): delay Telegram connect 60s on startup to prevent AUTH_KEY_DUPLICATED (#587)
Railway zero-downtime deploys start the new container before the old one
receives SIGTERM. Both containers connect with the same session string
simultaneously, triggering Telegram's AUTH_KEY_DUPLICATED which permanently
invalidates the session. A 60s startup delay gives the old container time
to disconnect gracefully. Configurable via TELEGRAM_STARTUP_DELAY_MS env.
2026-03-01 00:13:31 +04:00
Elie Habib
3bbe21e6d6 feat(risk): wire theater posture + breaking news into strategic risk score (#584)
The composite score ignored theater military buildup and breaking news
alerts, causing misleadingly low scores during active military events.

- Add theater boost from raw asset counts + strike capability (capped +25)
- Add breaking news severity boost (critical=15, high=8, capped +15)
- Listen for wm:breaking-news events with 30-min TTL and auto-expiry
- Read cached theater postures via getCachedPosture() with stale discount
- Lower trend threshold from ±5 to ±3 for faster escalation detection
- Cleanup listeners and timers in destroy()
2026-02-28 23:29:33 +04:00
Elie Habib
e474ebd4bf feat(aviation): add NOTAM closure detection via ICAO API (#583)
* feat(aviation): add NOTAM closure detection via ICAO API

Adds international airport closure detection via ICAO NOTAMs:
- New fetchNotamClosures() queries ICAO realtime-notams endpoint
- Detects closures via Q-codes (FA/AH/AL/AW/AC/AM) and text patterns
- Batches airports in groups of 20 per API call
- 4-hour cache TTL via cachedFetchJson (stampede-safe)
- NOTAM closures override existing AviationStack alerts for same airport
- Graceful: no ICAO_API_KEY env var = silently skipped

To activate: set ICAO_API_KEY env var (register at dataservices.icao.int)

* feat(settings): add ICAO_API_KEY to desktop app settings

Adds ICAO NOTAM API key to the desktop settings UI:
- Rust: SUPPORTED_SECRET_KEYS [23→24]
- TypeScript: RuntimeSecretKey + RuntimeFeatureId unions
- Feature definition: 'icaoNotams' in Tracking & Sensing category
- Settings UI: label, signup URL, analytics name

* feat(aviation): limit NOTAM queries to MENA airports only

Per user request, ICAO NOTAM closure detection is scoped to
Middle East airports only (region='mena', ~35 airports).
This reduces API calls (2 batches vs 5) and focuses on the
region where closures are most relevant.

* fix(aviation): align NOTAM cache TTL to 30 min (matching FAA/intl)
2026-02-28 23:25:41 +04:00
Elie Habib
882a486ae9 feat: add GPS/GNSS jamming map layer + CII integration (#570)
* feat: add GPS/GNSS jamming data ingestion from gpsjam.org

- scripts/fetch-gpsjam.mjs: standalone fetcher that downloads daily H3
  hex data, filters medium/high interference, converts to lat/lon via
  h3-js, and writes JSON. Can be run on cron.
- api/gpsjam.js: Vercel Edge Function that proxies gpsjam.org data with
  1hr cache, returns medium/high hexes for frontend consumption.
- src/services/gps-interference.ts: frontend service that fetches from
  the Edge API, converts H3→lat/lon, and classifies by conflict region.
- h3-js added as dependency for hex→coordinate conversion.

* feat: add GPS jamming map layer, CII integration, and country brief signals

Wire gpsjam.org data into map visualization, instability scoring, and
country intelligence. ScatterplotLayer renders high (red) and medium
(orange) interference hexes. CII security score incorporates jamming
counts per country via h3→country geocoding with cache. Country briefs
show jamming zone chip. Full i18n across 18 locales including popup
labels. Data loads with intelligence signals cycle (15min), gated by
1hr client-side cache.
2026-02-28 23:10:15 +04:00
Elie Habib
55d9b42530 feat(aviation): add comprehensive logging to flight delay pipeline (#581)
Adds structured [Aviation] logging throughout the handler chain:
- Handler: timing, FAA/intl alert counts
- fetchIntlWithLock: cache hit/miss, lock status, fallback triggers
- fetchAviationStackDelays: airport count, deadline hits, success/fail stats
- fetchSingleAirport: per-airport flight stats, API errors, severity
- Annotate empty catches with error context
2026-02-28 23:06:48 +04:00
Elie Habib
14d18a62c8 feat(relay): bootstrap OREF 24h history on startup (#582)
* fix(relay): improve OREF curl error logging with stderr capture

-s flag silenced curl errors. Add -S to show errors, capture stderr
via stdio pipes, and log curl's actual error message instead of
generic "Command failed" from execFileSync.

* feat(relay): bootstrap OREF 24h history on startup and add missing headers

- Fetch AlertsHistory.json once on startup to populate orefState.history
  immediately instead of starting empty
- Add X-Requested-With: XMLHttpRequest header required by Akamai WAF
- Add IST→UTC date converter handling DST ambiguity
- Redact proxy credentials from error logs and client responses
- Fix historyCount24h to count individual alert records, not snapshots
- Guard historyCount24h reducer for both array and string data shapes
- Add input validation to orefDateToUTC for malformed dates
2026-02-28 23:06:33 +04:00
Elie Habib
071f36a311 fix(sentry): guard setView against invalid preset + filter translateNotifyError (#580)
- DeckGLMap.setView(): early-return if VIEW_PRESETS[view] is undefined,
  preventing TypeError on 'longitude' when select value is invalid
- Add ignoreErrors pattern for Google Translate widget crash
2026-02-28 23:01:46 +04:00
Elie Habib
b5865b2acd feat(cii): hook security advisories into CII scoring & country briefs (#579)
Travel advisories (Do Not Travel, Reconsider, Caution) from US, AU, UK,
NZ now act as a floor and boost on CII scores. Do Not Travel guarantees
a minimum score of 60 (elevated), Reconsider floors at 50. Multi-source
corroboration (3+ govts) adds +5 bonus.

Advisory chips appear in country brief signal grid with level-appropriate
styling, and advisory context is passed to AI brief generation.

- Extract target country from advisory titles via embassy feed tags and
  country name matching
- Add advisoryMaxLevel/advisoryCount/advisorySources to CII CountryData
- Wire ingestAdvisoriesForCII into data loader pipeline
- Add travelAdvisories/travelAdvisoryMaxLevel to CountryBriefSignals
- Render advisory signal chips in CountryBriefPage
2026-02-28 22:56:41 +04:00
Elie Habib
66300fad33 fix(relay): add timeouts and logging to Telegram poll loop (#578)
GramJS getEntity/getMessages have no built-in timeout. When the first
channel hangs (FLOOD_WAIT, MTProto stall), telegramPollInFlight stays
true forever, blocking all future polls — zero messages collected, zero
errors logged, frontend shows "No messages available".

- Add 15s per-channel timeout on getEntity + getMessages calls
- Add 3-min overall poll cycle timeout
- Force-clear stuck in-flight flag after 3.5 minutes
- Detect FLOOD_WAIT errors and break loop early
- Log per-cycle summary: channels polled, new msgs, errors, duration
- Track media-only messages separately (no text → not a bug)
- Expose lastError, pollInFlight, pollInFlightSince on /status endpoint
2026-02-28 22:53:28 +04:00
Elie Habib
980983e4c1 feat(scripts): add Iran events seed script and latest data (#575)
Add seed-iran-events.mjs for importing Iran conflict events into Redis
(conflict:iran-events:v1). Includes geocoding by location keywords and
category-to-severity mapping. Data file contains 100 events from
2026-02-28.
2026-02-28 22:20:54 +04:00
Elie Habib
3f18b40a8f fix(webcams): replace duplicate Tehran feed with Tel Aviv, rename Iran tab (#572)
- Remove duplicate iran-tehran2 feed (same channel/video as iran-tehran)
- Remove iran-mideast feed
- Add Tel Aviv feed (-VLcYT5QBrY) to Iran Attacks tab
- Rename tab label from "IRAN" to "IRAN ATTACKS" across all 18 locales
2026-02-28 21:30:27 +04:00
Elie Habib
8704829ffb fix(relay): replace nixpacks.toml with railpack.json for curl (#571)
Railway uses Railpack (not Nixpacks). nixpacks.toml in scripts/ was
silently skipped. Use railpack.json at repo root with deploy.aptPackages
to install curl at runtime for OREF polling.
2026-02-28 21:26:47 +04:00
Elie Habib
5fa006979a feat(webcams): add Iran tab to live webcams panel (#569)
Add dedicated Iran region tab as the first/default tab with 4 feeds:
Tehran, Middle East overview, Tehran (alt angle), and Jerusalem.
2026-02-28 21:11:07 +04:00
Elie Habib
e7ff791e7d fix(relay): increase Polymarket cache TTL to 10 minutes (#568)
* fix(relay): increase Polymarket cache TTL to 10 minutes

All requests were MISS with 2-min TTL under concurrent load.
Bump to 10-min cache and 5-min negative cache to reduce upstream pressure.

* fix(relay): normalize Polymarket cache key from canonical params

Raw url.search as cache key meant ?tag=fed&endpoint=events and
?endpoint=events&tag_slug=fed produced different keys for the same
upstream request — defeating both cache and inflight dedup, causing
121 MISS entries in 3 seconds.

Build cache key from parsed canonical params (endpoint + sorted
query string) so all equivalent requests share one cache entry.
2026-02-28 21:08:25 +04:00
Elie Habib
5e82bcaa4a fix(relay): install curl in Railway container for OREF polling (#567) 2026-02-28 20:55:23 +04:00
Elie Habib
ee3b2c078e fix(relay): upstreamWs → upstreamSocket in graceful shutdown (#565) 2026-02-28 20:46:59 +04:00
Elie Habib
f60be3b2e1 fix(cii): resolve Gulf country strike misattribution via multi-match bbox disambiguation (#564)
Dubai/Doha/Bahrain/Kuwait coordinates matched Iran's bounding box first
due to iteration order. Now collects ALL matching bboxes, disambiguates
via isCoordinateInCountry() geometry, and falls back to smallest-area bbox.

- Add BH, QA, KW, JO, OM to bounds tables (previously missing entirely)
- Extract ME_STRIKE_BOUNDS + resolveCountryFromBounds() into country-geometry.ts
- All 4 consumer files use shared constant (single source of truth)
- Bump CDN cache-bust param for iran-events endpoint
2026-02-28 20:40:16 +04:00
Elie Habib
b1b1db488a fix(relay): replace smart quotes crashing relay on startup (#563)
* fix(relay): replace Unicode smart quotes crashing Node.js CJS parser

* fix(relay): await Telegram disconnect + guard startup poll
2026-02-28 20:38:00 +04:00
Elie Habib
0094cb3f15 fix(aviation): query all airports instead of rotating batch (#557)
* fix(aviation): query all airports instead of rotating batch of 20

The rotating batch (20 airports/cycle) caused major airports like DXB
(52% cancellations) to be missed entirely for multiple cache cycles.
With a paid AviationStack plan, query all ~90 non-US airports per
refresh with concurrency 10 and 50s deadline (~9 chunks × 5s = 45s).

* feat(cii): feed airport disruptions into CII and country brief

Major/severe airport delays and closures now boost the CII security
score and appear as signal chips in country briefs. Only major+
severity alerts are ingested to avoid noise from minor delays.

- Add aviationDisruptions to CountryData and ingestAviationForCII()
- Boost security score: closure +20, severe +15, major +10, moderate +5
- Store flight delays in intelligenceCache for country brief access
- Add aviation disruptions chip in country brief signals grid
2026-02-28 20:30:09 +04:00
Elie Habib
427b0ac006 fix(relay): add graceful shutdown + poll concurrency guard for Telegram (#562)
- SIGTERM/SIGINT handler disconnects Telegram client before container dies
- telegramPollInFlight guard prevents overlapping poll cycles
- Mid-poll AUTH_KEY_DUPLICATED now permanently disables (was reconnect loop)
2026-02-28 20:17:24 +04:00
Elie Habib
d0163f6288 feat(cii): wire OREF sirens into CII score & country brief (#559)
* feat(cii): wire OREF sirens into CII score and country brief

Active OREF sirens now boost Israel's CII score through two channels:
- Conflict component: +25 base + min(25, alertCount*5) for active sirens
- Blended score: +15 for active sirens, +5/+10 for 24h history thresholds

Country brief for Israel shows a siren signal chip when alerts are active.

* refactor(cii): extract getOrefBlendBoost helper to DRY scoring paths
2026-02-28 20:16:27 +04:00
Elie Habib
390e647b6d fix(sentry): add noise filters and fix beforeSend null-filename leak (#561)
- Add 8 new ignoreErrors patterns: signal timeout, premium gate,
  hybridExecute/mag/webkit bridge injections, postMessage null,
  NotSupportedError, appendChild injection, luma assignment
- Fix LIDNotify regex to match both LIDNotify and LIDNotifyId
- Fix beforeSend: strip null/anonymous filename frames so deck.gl
  TypeErrors (28 events, 8 users) are properly suppressed
2026-02-28 20:15:13 +04:00
Elie Habib
a0f0f5caac fix(live-news): annotate empty catches and sanitize error output (#560)
- Add context comments to empty catch blocks for debuggability
- Replace error.message leak with generic client-safe message
2026-02-28 20:14:56 +04:00
Elie Habib
2b91858f44 fix(i18n): rename OREF Sirens panel to Israel Sirens (#556)
Remove internal implementation references (OREF, proxy relay, oref.org.il)
from all user-facing strings across 18 locales and panel config.
2026-02-28 19:53:54 +04:00
Elie Habib
13e4446a66 fix(live-news): align YouTube edge function with relay auth pattern (#555)
Use same getRelayBaseUrl/getRelayHeaders as other edge functions:
- WS_RELAY_URL env var instead of VITE_WS_API_URL
- RELAY_SHARED_SECRET + RELAY_AUTH_HEADER for flexible auth
- Dual x-relay-key + Authorization headers
2026-02-28 19:47:57 +04:00