Add the news report model, markers and source

The pure half of a news layer: validated records for a news server's
`/api/news/hotspots|feed|outline` contract, a presentation model and canvas
markers and picture cards, and a fetch client.

- Colour carries severity only (0 no physical event, 1 minor, 2 significant,
  3 major), never a side; the category is the icon, the rim is attestation
  (confirmed, a claim, one side's own press), size grows with sources and
  markers fade with age.
- Cards say "Reported by {side} sources" and mark official channels; a
  machine-read English headline is labelled as such.
- `createNewsSource` reads same-origin routes with a 15 s timeout, a 4 MiB cap
  and record-by-record validation; `NEWS_API_PATHS` and `newsQueryAllowed`
  let a host proxy exactly what the client sends. A 503 marked unavailable
  means "not configured": no retries.
- Exported as `./layers/news/source`, with its own package boundary.
This commit is contained in:
Denis Groshev committed 2026-11-06 00:45:22 +01:00
1 parent dd83812a21
commit 2d9d518946
21 files changed
+2653

No files matched your search

+22
View File
@@ -85,6 +85,7 @@
"House",
"Hybrid",
"Indie",
"International",
"Ironbow",
"Jazz",
"LIVE",
@@ -129,6 +130,7 @@
"Pin",
"Plan",
"Pop",
"Protest",
"Punk",
"RADAR · {units}",
"RADIO",
@@ -152,6 +154,7 @@
"STD",
"SW",
"SYNC",
"Sahel",
"San Francisco",
"Scanlines",
"Scope",
@@ -160,6 +163,7 @@
"Soul",
"Station",
"Station {id}",
"Sudan",
"T minus {seconds}",
"TAGS · {tags}",
"TANKER",
@@ -171,6 +175,7 @@
"Turboprop",
"UPSTREAM",
"Upstream HTTP {status}",
"Video",
"Vignette",
"WHOT/BHOT",
"WIND",
@@ -295,6 +300,7 @@
"SRC {value}",
"SSE",
"STD",
"Sahel",
"San Francisco",
"Sector",
"Sonar",
@@ -325,6 +331,8 @@
"panel",
"view band|GLOBAL",
"voice|ERROR",
"{hours} h",
"{minutes} min",
"{rate} msg/s",
"{speed} kn",
"{type} SPD: {speed} HDG: {heading}",
@@ -446,6 +454,7 @@
"PROPAGATION",
"Paris",
"Pause",
"Photos",
"Plan",
"Pop",
"Punk",
@@ -466,6 +475,7 @@
"STANDARD",
"STATION",
"STD",
"Sahel",
"San Francisco",
"Satellites",
"Saturation",
@@ -509,6 +519,9 @@
"{count} MSGS",
"{count} SOURCES",
"{count} messages",
"{count} sources",
"{hours} h",
"{minutes} min",
"{n} cyclones",
"{n} satellites",
"{rate} msg/s",
@@ -582,6 +595,7 @@
"Hip-Hop",
"House",
"Indie",
"Iran–Hormuz",
"Ironbow",
"Jazz",
"KTS",
@@ -636,11 +650,13 @@
"STD",
"STOP",
"SYNC",
"Sahel",
"San Francisco",
"Scope",
"Sentinel-2",
"Sonar",
"Soul",
"Sudan",
"TEMP",
"TIMEOUT",
"Talk",
@@ -657,6 +673,7 @@
"VIEWSHED ON",
"VOLUME",
"VS",
"Video",
"WHOT/BHOT",
"Washington DC",
"World",
@@ -681,6 +698,8 @@
"{count} MSGS",
"{count} feeds live",
"{count} scenes",
"{hours} h",
"{minutes} min",
"{rate} msg/s",
"{scene} / {pack}: {status}. File: {path}. {attribution} · {license}",
"{source} HTTP {status}",
@@ -840,6 +859,7 @@
"SSE",
"STATUS",
"STATUS · ",
"Sahel",
"Sentinel-2",
"Sentinel-2 via HLS",
"Sonar",
@@ -870,6 +890,8 @@
"mph",
"nominal",
"view band|GLOBAL",
"{hours} h",
"{minutes} min",
"{rate} msg/s",
"{type} SPD: {speed} HDG: {heading}",
"{value} KM",