Merge remote-tracking branch 'origin/main' into fix/sanitize-openai-proxy-errors

# Conflicts:
#	CHANGELOG.md
This commit is contained in:
Pedro Lobato committed 2026-09-15 11:58:25 -05:00
commit 92350b8412
332 files changed
+56273 -6359

No files matched your search

+123
View File
@@ -1,5 +1,63 @@
# Changelog
- Separate map-feature acquisition from annotation/search selection. Move road and mapped-installation decoding into source adapters while preserving geometry policy, cancellation, retry outcomes and compatibility exports.
- Cancel hidden Nepal provider preloads on Stop, event disable and replacement, and respect drawing-tool pointer ownership for fallback evidence cards. Preserve @manjunath22466’s Nepal scene contribution and source attribution.
- Cancel the Nepal Upper Valley locator's pending approach and orbit on scene Stop, replacement, seek, and teardown; late camera callbacks cannot take over a newer shot.
- Keep completed flood history visible when later Nepal media-only shots arrive and reveal their source cards.
- Reconcile an already-playing Nepal video when the YouTube API attaches, so missed playback notifications cannot truncate the seven-second clip or replay an already-ended clip.
- Clamp the Nepal flood trail and surge marker to the active terrain or photoreal surface so refined 3D tiles cannot bury the path.
- Preserve Nepal shot camera and map ownership through the public layer lifecycle; passive restoration does not start standalone playback.
- Separate transit snapshot/history acquisition from the layer and expose its bounded request service independently of Vite. Preserve feed selection, playback, cache policy and compatibility exports.
- Widen opaque sensor halos to 3 display pixels with a 30 px fleet core while retaining at least 60% opaque core coverage, adding contrast margin through thermal blur and bloom on bright roofs.
- Exclude Noir's intentionally vignetted outer field from transit core measurements and add separate Boston live oblique selection/readability coverage.
- Judge NVG transit readability by phosphor peak and halo contrast, use opaque black sensor halos, reject overlapping pixel samples, and report each selected-trail acceptance condition. Simplify transit source credits and ground-placement wording.
- Reserve numeric playback scratch before sampling, including resolved transit surface heights, and reuse the same output and segment objects on every frame.
- Keep moving and stationary transit above CCTV/Bikeshare consistently, and share camera sensitivity across the actual Traffic, Bikeshare and Transit lifecycles.
- Reject isolated transit history outliers without changing the active playback bracket; rejected live reports retain the last accepted route, mode and detection text.
- Isolate optional scene-card presentation callbacks from the shared overlay projection path, preserving ordinary-layer allocation budgets and recovering from failed animation callbacks.
- Rename scene shots inline with a double-click; Enter or focus loss saves, and Escape cancels.
- Stop scene playback and delayed media when its event layer is explicitly closed; reject stale seek and replay completions. Ship only the Nepal incident default, without a separate reconstruction recipe.
- Keep Nepal flood and locator components available through Scenes without separate entries in Data Layers.
- Start the shared Nepal flood route at the Debris-Dammed Lake river reach, removing the earlier upstream section from overview paths.
- Remove the redundant WITNESS panel shortcut; retain per-shot source media and Open Original links.
- Follow the Mailung Bazzar, Dandaguan video's source clock through 0:07 and advance after its brief fade-out, including older saved scenes. Bound delayed or blocked playback and cancel late provider callbacks on Stop or replacement.
- Keep the completed flood trail visible during the Debris-Dammed Lake to Second landslide camera handoff, without revealing the next reach early.
- Preserve loaded base imagery when successive scene shots use the same provider, avoiding a bare-globe flash at shot handoffs.
- Add the Nepal Flood Incident scene with geographic labels, synchronized event controls, linked witness sources, and Vantor comparison imagery over Esri. Nepal uses Google 3D when available and falls back to Esri with keyless terrain without rewriting saved shots. Bundled event imagery and derived data retain their separate non-commercial terms.
- Add an optional Nominatim geocoding adapter with configurable search/reverse endpoints, cancellation, bounded responses and retryable upstream errors. Extract portable response-reading and Overpass lexical helpers while retaining existing server exports.
- Expose reference feed factories independently of standalone catalog construction; preserve source choices and asset attribution.
- Add source-only layer exports and enforce source, browser, standalone and voice import directions. Move plain record/feed helpers and settings filesystem hardening to their owners while preserving compatibility and behavior.
- Separate voice session lifetime and common controls from the default Realtime protocol adapter.
- Add live public transit: vehicles from seven open GTFS-Realtime feeds played back a lag behind real time at their reported speed, a selected-vehicle trail with bounded MBTA history caching, mode-coloured detection brackets in every preset, and sprites that stay readable in night-vision and thermal views.
- Separate canonical voice action arguments from descriptive wording, preserving the existing Realtime tool inventory.
- Expose portable radio, camera-type and regional source helpers; keep HTTP transport separate from record normalization.
- Three proxy paths no longer relay upstream or JS error text to the client. The HUD summary passed OpenAI's own `error.message` through whenever upstream was not ok, carrying request ids and quota wording; the Realtime token route echoed the JS error, which for a network fault names the upstream host; and a failed CCTV media fetch stored the raw errno as the camera's health message, which reaches the screen through `GET /api/cctv/health` rather than through the sanitized response beside it. Logs now name the failure and the upstream status without the text.
- Separate vessel records and feed acquisition from rendering while preserving selection, partial-feed retention, sea-surface placement and request cancellation.
@@ -135,6 +193,46 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
### Fixed
- Bikeshare stations load again. The extracted station source addressed the
proxy as `/api/gbfs?url=`, but the proxy reads its upstream target from the
path, so every request answered 400 and the layer reported a fetch error for
every city (#441 — thanks @MiguelGFerreira).
- Overpass requests now carry a User-Agent that names the application, its
version and the project address, which is what the OpenStreetMap API usage
policy asks for; the previous string identified neither. A mirror may refuse
a client it cannot identify, and a refused mirror is one the fan-out has to
skip, so this affects every Overpass-backed layer: Mapped Installations,
traffic roads and annotation geometry. Mirror rotation, cooldown and cache
admission are unchanged (#420 — thanks @GladiatorrX9).
- Place search has a last resort. With no Google Maps key, and when Photon does
not answer, a named-place search now falls back to OpenStreetMap's Nominatim
through `/api/geocode`, so search and voice fly-to still work on a keyless
globe. The route keeps to the service's usage policy: an identifying
User-Agent and Referer, at most one request per second, answers cached, one
upstream call shared between identical searches in flight, a bounded queue so
a burst is refused rather than held, and a queued search dropped once its
caller has given up (#350 — thanks @sendmebits).
- Regional upstream reads now hold their deadline through the response body. The
abort timer was cleared as soon as the headers arrived, so an upstream that
answered and then stalled mid-body had no deadline at all. Redirect policy is
now stated per call rather than inherited, and the fixed Nominatim endpoints
refuse to be redirected.
- The location search box answers two kinds of query without a network request
or an API key. A decimal-degree coordinate — `43.1731, -79.0384`, or either
order when N/S/E/W say which is which — flies straight there; a bundled city
or landmark name typed exactly (`paris`, `sf`, `Golden Gate Bridge`) flies to
the bundled place. Anything else, including anything malformed, goes to the
existing geocoders unchanged. Degrees/minutes/seconds and grid references are
not parsed and fall through the same way (#388 — thanks @KuraPiee).
- A data-layer control a provider key is holding back now names that key. With
no FIRMS key the fire layer's control read KEY REQUIRED without saying which
key or where to put it; it now reads "Needs FIRMS_MAP_KEY — add it in Provider
Settings", on the control and in its accessible name. A layer that needs no
key, or already holds one, carries no such text, and an unrecognised key name
produces none rather than a guess (#296 — thanks @Matthew-Selvam).
- Draped annotation geometry — area fills and outlines, routes and arrows —
classifies onto terrain as well as 3D tiles. On a keyless boot, where Cesium's
own globe carries the imagery, marks previously rendered their labels and no
@@ -153,6 +251,22 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
### Added
- Two map-orientation controls sit beside Share in the top-center globe
actions. Tilt Map swings between a straight-down map and a 35-degree oblique
around the point under the centre of the view, keeping that point and the
distance to it. North Up rotates around the same point until north is at the
top, keeping the pitch, and its needle shows the current bearing. Both decline
without moving the camera when nothing is under the centre of the view, and
both follow Reset Globe out of Clean UI, recording, Scene playback and Cockpit
(#442 — thanks @yashveeeeeeer).
- The location search box answers two kinds of query without a network request
or an API key. A decimal-degree coordinate — `43.1731, -79.0384`, or either
order when N/S/E/W say which is which — flies straight there; a bundled city
or landmark name typed exactly (`paris`, `sf`, `Golden Gate Bridge`) flies to
the bundled place. Anything else, including anything malformed, goes to the
existing geocoders unchanged. Degrees/minutes/seconds and grid references are
not parsed and fall through the same way (#388 — thanks @KuraPiee).
- Add Open Calgary traffic cameras as a keyless CCTV source pack (thanks
@rileygramlich): the public City of Calgary catalog, frames pinned to the
city's own host and upgraded to HTTPS, with the Open Government Licence –
@@ -161,6 +275,15 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
address grid — so headings use the shared id-hash fallback at low confidence
and are corrected with the calibration gizmo. `CCTV_CALGARY_MAX_SOURCES` sets
the cap and `CCTV_CALGARY_ENABLED=0` turns the pack off.
- **Transit layer** — keyless buses, trams, subways, trains and ferries in
Boston, Austin, Minneapolis–St Paul, Helsinki, the Netherlands, Norway and
South East Queensland. Vehicles use delayed timestamp playback and explicit
waiting states. Selection shows available recent history, mode-coloured cards
and clear report ages; MBTA history can survive a browser reload while the
proxy remains running. Heights are aligned to work with Google 3D tiles.
Subways are projected to street level and their cards explain that choice.
Visible animation, detection membership, history storage and proxy requests
are bounded. Share links carry Transit as token `j`.
- Add Ontario 511 as a keyless CCTV source pack, including Kitchener-area
highway cameras, with server-registered still URLs and attribution.