Merge origin/main into fix/realtime-debug-log-hardening

# Conflicts:
#	CHANGELOG.md
#	src/tooling/localServices.test.mjs
This commit is contained in:
Sameh Khamis committed 2026-09-20 19:19:49 -07:00
commit a948274326
161 files changed
+19838 -6545

No files matched your search

+92 -9
View File
@@ -1,5 +1,80 @@
# Changelog
- Report AIS speed and course that carry the standard "not available" code as
unknown instead of 102.3 knots and 360 degrees. Genuine readings, including a
stopped vessel's zero and the highest encodable values, are unchanged.
- Render native `<select>` option lists in the dark UI palette. The closed
controls were already skinned, but the browser-painted popups fell back to the
platform light palette, leaving near-white option text on a white surface in
the HUD layout, Scenes, CCTV camera, Radio filter and Draw colour menus.
- Credit adsbdb, which supplies the aircraft type, model name and registration
on enriched flights and the airline and origin/destination pair behind the
tracked contact's route strip. `DATA_SOURCES.md` now records adsbdb's
published credits and route-data restriction, along with the request bounds
and gitignored 24-hour local cache. A matching `DATA_CREDITS` entry surfaces
the credit in the in-app Data attribution popover, and a test protects it
against accidental removal.
- Size the TomTom daily tile budget to the provider's real free allowance.
`TOMTOM_DAILY_TILE_BUDGET` defaulted to 40,000/day against an allowance
granted monthly (200,000 tile requests/month), exhausting a month in five
days and leaving the traffic layer dead for the rest of the period. The
default is now 6,000/day (186,000 over a 31-day month). Corrects the stale
"~50k/day" free-tier figure in the proxy, `.env.example` and
`DATA_SOURCES.md`. Still an application-side ceiling, not a billing cap.
- Distinguish PARTIAL vessel snapshots from STALE data in the layer panel, with
accepted-record counts and unchanged retention, freshness and outage safeguards.
- Keep Nepal provider media inside the Pinokio compatibility boundary: use
source-linked fallback cards instead of automatic embeds or hidden preloads
that launch an external browser. Ordinary browsers retain embedded playback.
Source-only timed shots use their authored card dwell and continue normally.
Media autoplay now requires a live Play Scene or Play Shot action; passive
loading, saved state and seeking do not grant playback authority.
- Add Director import previews, validated scene/shot detail drafts and selected-scene
JSON or asset-bundle sharing. Preserve attribution; verify bounded bundle bytes
before admission and release staged work on cancellation or teardown.
- Director scene documents now support bounded data-pack manifests, per-shot
selection and registered GeoJSON/PNG/media loaders with explicit placement,
visible attribution and cancellation/disposal on Stop or replacement.
- Director version 4 adds named camera anchors and explicit pose-to-pose moves
with shared playback/seek interpolation, easing and holds. Navigation and
manual input cancel authored motion; older scene files retain existing flights.
- Director validates bounded version-3 scene files before replacing a project,
preserves unreadable browser saves, migrates legacy bloom once and preserves
zero-pitch/low-altitude camera and scope/detection edits. Project normalization has a separate owner.
- Separate Director timing, seek calculations, playback clocks and registered
scene-pack presentation rules. Preserve authored content and controls; Stop
releases pending hold timers and stale ticks cannot affect replacement playback.
- Keep parked transit vehicles aligned to their world course during camera orbits, fall back to reported bearing, and keep vehicles with no course consistently screen-up.
- Separate Realtime connection, response/tool, Radio, input/audio, cost, viewport
and diagnostic ownership while preserving voice controls and protocol behavior.
Revoke stale connection offers/capture callbacks and release failed or stopped audio
meters. Discard late action continuations after Stop or restart; add recorded
push-to-talk acceptance alongside click-start voice.
- Separate application-shell responsibilities and state ownership while preserving
the layer, scene and voice API. Revoke pending globe-reset callbacks on disposal
and detach old Directions services when replacing a data manager.
- Transit: keep the normal vehicle silhouettes under NVG, thermal and noir (opaque white, CRT sizing, a 2 px dark halo) instead of solid bodies; drape the selected vehicle's trail onto Google 3D tiles and terrain so retained history is actually visible, with the head clipped to the sprite and markers recovering as soon as the camera arrives; place Transit in the Movement panel between Street Traffic and Bike Share.
- Extract a portable Director shot runner and connect existing scene playback to
it. Preserve authored content, project files, camera/layer behavior and source
attribution; document the planned timeline, scene-file and data-pack boundaries.
- 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.
@@ -60,6 +135,8 @@
- The Realtime debug-log endpoint is bounded on every axis it was not: an always-on per-client rate limit, asynchronous appends through a serialized queue instead of a synchronous write on the request path, and rotation of the log file at 32 MB keeping one prior generation. The 8 MB cap applied to a single request body and never to the file those requests accumulated into, so any local page could grow it for as long as the dev server ran. A malformed record and a failed write are now told apart, 400 from 500, and neither answer carries the error text.
- 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 passed through non-success response bodies and echoed JS errors, which can expose upstream details; 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.
- Separate military-flight records and acquisition from rendering while preserving ground-model ownership, source units and follow behavior.
@@ -80,14 +157,12 @@
- Allow compatible endpoints and server-selected models through construction options.
- Cancel pending token/SDP requests on Stop or teardown and reject expired secrets.
## Configurable geospatial services
- Compose geocoding, place context and routes through independent providers.
- Allow compatible endpoint configuration without changing voice tools or annotation behavior.
- Isolate configured source caches and reject results after cancellation.
## ALPR camera locations
- Port Manjunath's (@manjunath22466) cyan camera badges, coral selection brackets,
@@ -167,6 +242,9 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
## [Unreleased]
- Add bounded Director feature actions with accessible controls, explicit camera/layer admission and cancellation; restore pack geometry on same-shot seek. Preserve existing scenes and content attribution.
- Give application request services, terrain/floor caches and annotation lookup state explicit owners and cancellation; share them across controls, layers and voice.
- Construct application layers from explicit sources, with standalone provider selection and catalog-owned aircraft classification; controls and voice queries use those instances.
@@ -193,6 +271,15 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
### Fixed
- Keep traffic-road bounds crossing the antimeridian monotonic and inside the
longitude range accepted by the Overpass request path, preserving the small
wrapped span instead of producing an inverted or rejected box (#392 — thanks
@Ashfaqbs).
- Make `npm run doctor` report keyless anonymous OpenSky access for explicit
`OPENSKY_AUTH_MODE=anon` and OAuth mode without a client pair, retain the
existing OAuth-pair capability wording, and identify selected Basic or auto
modes without guessing their eventual credential choice. OpenSky proxy
authentication is unchanged.
- 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
@@ -317,7 +404,6 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
- Press backtick (`) to toggle a rendered-frame-rate readout beneath the logo.
Typing fields retain the key; monitoring stops when hidden.
- Extract vessel feed, store, rendering, selection, trail and card components with explicit source and scene services.
- Bound contact retention for incomplete vessel observations, preserve source freshness and refresh history references in place.
- Cancel pending vessel history during selection and layer teardown.
@@ -401,10 +487,8 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
- Bound CCTV media response headers to 15 seconds and cancel error bodies.
Cap buffered snapshot downloads at 16 MiB while streaming.
- Cancel the active location lookup when its controls are disposed.
### Fixed
- `DATA_SOURCES.md` states what the project does with camera frame content: a
@@ -455,7 +539,6 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
- GBFS rejects upstream redirects, caps streamed responses at 5 MiB, and keeps
its deadline active through body reads. Rejected downloads are cancelled.
- Split Overpass/installation search, regional briefing/weather, local voice
handlers and standalone key setup into focused modules. Preserve routes,
source behavior, tool schemas and credential restrictions.
@@ -485,7 +568,6 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
fetching, AIS records/tracks and shared request helpers; preserve existing
routes, local setup, fallback behavior and rendering.
### Added
- **Directions layer** — keyless A→B directions without a geocoder or a
@@ -529,7 +611,6 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
- Rename standalone browser startup to `src/standalone/` and add a Node-only
`gods-eye-view/build/vite` export with checked package ownership.
### Development
- The CCTV launcher and preview-server tests resolve their temporary fixture
@@ -588,7 +669,6 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
First-run QA now checks the existing attribution Escape-close/focus-return
behavior while preserving the launcher-underneath regression checks.
- Datacenter and dam factories are available through scoped package exports with
explicit context, overlay and render callbacks. The standalone app uses the
same implementation and bundled datasets.
@@ -751,6 +831,7 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
## [0.1.0] — 2026-08-31 — One-click install, keyless boot, Provider Settings
### Added
- **One-click install** via Pinokio. Keyless boot lands on a live Esri World
Imagery satellite globe with keyless terrain; OSM takes over automatically if
Esri is unreachable, and the globe continues without terrain if its source is
@@ -766,6 +847,7 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
test suite out of the box (#81 — thanks @ethanstoner).
### Changed
- README rewritten keyless-first around the provider ladder: zero keys → free
Cesium ion (eligible personal, non-commercial use) → billing-enabled Google
Maps.
@@ -775,6 +857,7 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
and say so plainly when enrichment is unavailable instead of guessing.
### Security
- Provider Settings answers only local, unproxied requests and disables itself
entirely whenever the server is shared. Public datacenter and dam datasets
omit contact-oriented fields (see the dataset READMEs).