mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 02:14:01 +00:00
Merge remote-tracking branch 'origin/main' into german/hal-641-it
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
commit
e451b496ae
87 files changed
+3634
-308
No files matched your search
+68
-4
@@ -4,6 +4,24 @@ Docker Compose mounts the checkout with the shared SELinux `:z` label so
|
||||
containers can read it on enforcing SELinux hosts. The separate image-owned
|
||||
`node_modules` volume and loopback-only port publishing remain unchanged.
|
||||
|
||||
The HUD's AI summary line looks up place names for the view only when the
|
||||
summary can use them. The page asks `GET /api/openai/hud-summary/status` once;
|
||||
a server without an OpenAI key answers `{ configured: false }`, and the HUD then
|
||||
makes no reverse-geocode or Nearby Places request until the page reloads. A
|
||||
server without the route is asked once, and an unconfigured summary reply
|
||||
stops the lookups the same way. Each lookup reverse-geocodes at most two
|
||||
points: the view center alone below 10 km, the center and one viewport point
|
||||
up to 750 km, and two viewport points up to 3000 km; Nearby Places is still
|
||||
added below 25 km. A lookup is reused until the view center moves a quarter of
|
||||
the visible width, the camera's distance to the center doubles or halves, or
|
||||
the camera crosses one of those heights. The width is measured from the
|
||||
camera's distance to the view center, so terrain and tilt scale it. A reused
|
||||
lookup asks again only for what it did not get (a timeout, a failure, an empty
|
||||
answer); everything else is a cache hit. A small pan over a reused lookup
|
||||
repaints the last AI reply instead of asking for a new one. A host passing
|
||||
`cachedOnly` keeps reading every cached sample. Voice context lookups are
|
||||
unchanged.
|
||||
|
||||
The HUD's LAT/LON degrees-minutes-seconds readout rounds the coordinate once, to
|
||||
hundredths of a second, and then splits it. A value within 0.005" of the next
|
||||
whole minute carries into the minutes and degrees, so `-122.35` reads
|
||||
@@ -560,6 +578,11 @@ dateline while preserving both authored endpoint longitudes, and turns heading
|
||||
and roll the short way for any authored angles.
|
||||
A seek to a shot's start, as a shot action makes, selects that shot rather than
|
||||
the end of the previous one.
|
||||
Same-shot seeking restores declared layer visibility after a manual toggle,
|
||||
including one still in flight, by reconciling only the changed layers through
|
||||
the cancellable layer admission path. Refused restoration reports a failed
|
||||
seek and keeps the last settled position. Undeclared operator layers remain
|
||||
untouched, and the shot is not rebuilt.
|
||||
See [camera directions](DIRECTOR-CAMERA.md).
|
||||
|
||||
Realtime voice composes separate connection, response/tool, Radio handoff, input
|
||||
@@ -793,6 +816,11 @@ rendered detection set. The legacy manager retains panel helper compatibility;
|
||||
registration sealing, restoration order and failed-transition rollback remain
|
||||
unchanged.
|
||||
|
||||
Polled layer refreshes and the HUD's camera readout pause while the page is
|
||||
hidden. An app embedded inline in a panel keeps both running, because the
|
||||
panel's host can report the page as hidden while it is on screen. This is the
|
||||
same rule the render loop follows (`keepPanelRendering` in `app/embed.js`).
|
||||
|
||||
Application scene setup owns request services, terrain/floor caches and annotation
|
||||
lookup state. Controls, layers and voice share those owners, and cancellation
|
||||
clears caches and removes map-stack listeners. Standalone setup supplies the
|
||||
@@ -1144,6 +1172,10 @@ Shot selection updates the highlight without replacing the row, preserving
|
||||
native double-click rename. Replacing rows revokes their old listeners. Disposal stops controls immediately;
|
||||
late file and failed-action completions cannot update removed presentation.
|
||||
|
||||
Director clock listeners, interaction observers and scene release failures no
|
||||
longer leave the director inconsistent, and a phase error is kept when cleanup
|
||||
also fails.
|
||||
|
||||
## Cockpit component ownership
|
||||
|
||||
Cockpit presentation is separated from its camera/controller behavior. Existing
|
||||
@@ -2254,6 +2286,16 @@ fetching, trailing-24-hour filtering and partial-success caching are unchanged.
|
||||
> SCOPE toggle + FEATHER slider, hash keys `sc`/`scf`) — it is NOT the
|
||||
> six zero-intensity style stages anymore (those are disabled; see the
|
||||
> history note in `_initStages`). Hidden tabs stop the render loop.
|
||||
> AIS vessels no longer hold the loop while enabled (2026-09-30): vessels move
|
||||
> only when a poll lands, so the layer requests a frame for every forced pass
|
||||
> (new data, selection), leaves one trailing frame when the camera moved inside
|
||||
> the 800 ms visibility cadence, and holds `ais-vessels` only while focus
|
||||
> emphasis animates or any vessel stays dimmed under a live focus target. The
|
||||
> trailing frame goes through the layer's injectable runtime clock and is
|
||||
> cancelled on disable, destroy and reset (`renderGovernor.test.mjs` pins the
|
||||
> no-self-wake invariant). The 80 ms focus pass also skips hidden sprites whose
|
||||
> focus state is at rest (`spriteFocusAtRest`), since advancing them changes
|
||||
> nothing; with a 12k worldwide feed that is most of the fleet.
|
||||
> The scope's OUTSIDE terminus is **altitude-adaptive** (2026-08-17): 0.94
|
||||
> at/above **10 Mm**, so
|
||||
> faint stars survive in the corners of a TRUE full-globe view, fading quickly
|
||||
@@ -3078,7 +3120,14 @@ down | auth-failed` (plus the unchanged `missing-key`/`unsupported`) with
|
||||
> usable per point, while an uncached absent height still returns 502 rather
|
||||
> than becoming a fabricated ground value. A position the upstream answers
|
||||
> with a null ellipsoid is reported as an absent height rather than a refresh
|
||||
> failure, and is left uncached so a later poll re-asks it. Client geoid
|
||||
> failure, and is left uncached so a later poll re-asks it. A `Retry-After`
|
||||
> longer than the 10 s retry budget ends the retries at once. After a 429 that
|
||||
> outlasts its retries, the proxy pauses upstream calls for the `Retry-After`
|
||||
> (60 seconds when none, at most 10 minutes). A request whose points are all
|
||||
> cached, fresh or stale, is still served; a request with any uncached point
|
||||
> gets 502 and the page uses its geoid fallback for that chunk. Each request
|
||||
> that was waiting on the upstream when the 429 came back logs one warning;
|
||||
> requests refused during the pause do not log. Client geoid
|
||||
> fallbacks wait 60 seconds before retrying and self-heal to Re:Earth on the
|
||||
> first later successful fetch. Smaller chunks reduce timeout risk; complete
|
||||
> camera batches still wait for their sequential requests, and unresolved
|
||||
@@ -3851,7 +3900,7 @@ anchors, recovery, keyboard and mobile states; emergency repainting is covered
|
||||
by `scripts/qa-emergency-squawk.mjs`. Both accept `--timeout-ms` for slow boot.
|
||||
|
||||
|
||||
Fire Perimeters uses capped, timed server reads with stale-on-error caching and a per-client limit. Unchanged snapshots retain geometry; link checks cancel on disable or selection change, and the row legend shows reported containment.
|
||||
Fire Perimeters uses capped, timed server reads with stale-on-error caching and a per-client limit. A stale snapshot is served for at most 24 hours; the layer row then reads STALE, dated by that snapshot's fetch, and `get_fire_perimeters` returns `stale` and `retrieved_at` with "(data may be stale)" in its summary. Unchanged snapshots retain geometry; link checks cancel on disable or selection change, and the row legend shows reported containment.
|
||||
|
||||
Street Level is a docked, collapsible right-rail panel (`#street-level-panel`,
|
||||
layer token `0`, option owner `street-level`, panel `ui` token `t`) that starts
|
||||
@@ -5267,7 +5316,13 @@ HTTP refusals and outages remain retryable. Searches share a 12-second total
|
||||
deadline, with Photon requests capped at six seconds each. Caller/application
|
||||
cancellation stops retries and late cache writes. Replacing a location search
|
||||
cancels the previous lookup; disposing its controls cancels the active lookup. Photon uses a soft proximity bias, up to five
|
||||
candidates, and an unbiased retry for name mismatches. Invalid or wrapped bounds returned by providers
|
||||
candidates, and an unbiased retry for name mismatches. A "place, region" query
|
||||
prefers a candidate named exactly for the place whose city, county, state,
|
||||
country or country code (or USA/UK) contains every word of the region, and a
|
||||
settlement or administrative area over a POI when both fit. Nearby results that
|
||||
fail that check are retried unbiased. After the region checks of both passes, a
|
||||
nearby place whose whole name is the query (one with a comma in it) comes next,
|
||||
then the unbiased name match. Invalid or wrapped bounds returned by providers
|
||||
are omitted rather than framing the wrong part of the globe.
|
||||
|
||||
A location search that finds nothing, or fails, leaves the field open with the
|
||||
@@ -5758,7 +5813,11 @@ easier to meet (detection is now on more often), but does not create it.
|
||||
coverage number. `stats.loading` covers outstanding flow work as well as the
|
||||
road fetch, so a flow failure landing after the first paint still ends the
|
||||
shared loading batch as LOAD FAILED. Harnesses must gate on `!stats.error`,
|
||||
never on `mode === 'live'` alone.
|
||||
never on `mode === 'live'` alone. When the drawn flow came from the proxy's
|
||||
cached STALE-BUDGET / STALE-ERROR tiles, `getStats()` reports `stale: true`
|
||||
and `oldestTileAt`, the row reads STALE with the oldest tile's age, and the
|
||||
sync chip reads
|
||||
`STALE · Roads: <source> · Flow: cached TomTom tiles` instead of LIVE.
|
||||
- Traffic runs in `sim` mode (white dots, hardcoded speeds) unless `TOMTOM_API_KEY`
|
||||
is configured (env or Keychain `tomtom-api`/`api-key`), which enables `live` mode:
|
||||
TomTom flow vector tiles via the budget-governed `/api/tomtom` proxy
|
||||
@@ -6061,6 +6120,11 @@ reception does not interrupt internet radio.
|
||||
Changes apply to the open receiver without reconnecting.
|
||||
- **Receiver stats (ADS-B).** CRC-valid messages per second, aircraft heard,
|
||||
aircraft with a fresh position and the IQ level.
|
||||
- **Error text.** A receiver error sets two fields (`errorState()` in
|
||||
`src/sdr/controller.js`): `message` is the UI language for the Radio card,
|
||||
`errorText` is the English text the Local ADS-B layer reports as its stats
|
||||
`error` (`localAdsbStatus()`, falling back to `message` when a receiver sets
|
||||
none); the Layers panel translates it where it shows it.
|
||||
- **Devices.** An already-authorized receiver opens without the WebUSB
|
||||
picker. ADS-B prefers a device whose product name matches ADS-B or 1090 (the
|
||||
1090 MHz channel of a dual-channel board); FM avoids ADS-B/UAT channels.
|
||||
|
||||
Reference in new issue
Block a user