Commit Graph
53 Commits
Author SHA1 Message Date
Sameh Khamis 280fc00a51 fix: return JSON errors for unmatched local API routes
Test development and built-preview route registration, preserve development-only credential editing, and document local preview configuration.
2026-09-12 12:43:54 -07:00
Sameh Khamis c69416ff6b style: adopt formatting for CCTV and radio provider modules 2026-09-12 12:09:04 -07:00
Sameh Khamis 79b4929b88 refactor: extract CCTV media and radio directory providers 2026-09-12 12:09:02 -07:00
Sameh Khamis c6462be066 fix: simplify Google Maps provider setup 2026-09-12 11:36:23 -07:00
Sameh Khamis eadeac6c10 test: follow extracted FIRMS aggregation code 2026-09-11 22:01:12 -07:00
Sameh Khamis a2d6461b52 style: format terrain traffic fire and bike-share modules 2026-09-11 21:57:51 -07:00
Sameh Khamis f4054469d5 refactor: split terrain traffic fire and bike-share providers 2026-09-11 21:57:50 -07:00
Sameh Khamis 290afd808d style: format satellite and launch provider modules 2026-09-11 21:22:41 -07:00
Sameh Khamis 9a4b98700e refactor: split satellite and launch provider modules 2026-09-11 21:22:15 -07:00
Sameh Khamis 38b591863c fix: preserve landmark identity when resolving annotation outlines 2026-09-11 21:07:32 -07:00
Sameh Khamis 7e6d89d8f5 style: format extracted place and route modules 2026-09-11 19:57:22 -07:00
Sameh Khamis 2793d7a8df refactor: extract place-search and routing provider modules 2026-09-11 19:56:48 -07:00
Sameh Khamis 2e3cb6270a test: keep provider fixtures independent of calendar time 2026-09-11 19:08:02 -07:00
Sameh Khamis f9a85528fe style: format extracted live provider modules 2026-09-11 19:06:10 -07:00
Sameh Khamis 0e221441b4 refactor: separate aircraft and vessel server providers 2026-09-11 19:06:09 -07:00
Sameh Khamis fb67024f43 style: format standalone configuration and build boundaries 2026-09-11 18:08:26 -07:00
Sameh Khamis 8de1018c21 refactor: separate standalone Vite wiring and provider middleware 2026-09-11 18:08:01 -07:00
Sameh Khamis 8666705e12 style: adopt application modules into scoped formatting 2026-09-11 17:03:35 -07:00
Sameh Khamis 4d37760314 refactor: extract application construction and lifecycle 2026-09-11 17:02:54 -07:00
Sameh Khamis f70b5a3631 style: format the reusable infrastructure component 2026-09-11 16:07:53 -07:00
Sameh Khamis 04f4d54bfe test: allow line wrapping in the stem buffer regression pin 2026-09-11 16:07:53 -07:00
Sameh Khamis 76ddc6a9ef chore: enforce scoped formatting and browser package boundaries 2026-09-11 16:06:35 -07:00
Tom-NeverwinterandSameh Khamis 205c58efbd fix: separate Google browser and server keys (#110)
Use a separate optional server key for Places and Street View, with consistent local and Pinokio configuration, server-first CLI selection, and credential isolation checks.

Original contribution by Tom-Neverwinter; reviewed and completed by Sameh Khamis.

Co-authored-by: Tom-Neverwinter <[email protected]>
Co-authored-by: Sameh Khamis <[email protected]>
2026-09-11 15:08:23 -07:00
Sameh Khamis ed15c5b38e style: remove inherited trailing whitespace from extracted layer 2026-09-11 13:35:52 -07:00
Sameh Khamis 106a794afa fix: preserve standalone overlay defaults for undefined overrides 2026-09-11 13:32:49 -07:00
Sameh Khamis 4688eca9af test: verify infrastructure consumer asset paths and imports 2026-09-11 13:28:55 -07:00
Sameh Khamis 142bf583f8 refactor: export infrastructure layers with explicit application callbacks 2026-09-11 13:21:22 -07:00
Sameh Khamis e465197cee fix: dispose pending infrastructure loads and entity contexts 2026-09-11 13:18:59 -07:00
Sameh Khamis 412ee211b5 fix(infrastructure): follow refined terrain after initial sampling 2026-09-11 09:05:41 -07:00
Sameh Khamis b5568de9fa fix(infrastructure): stop idle republishing and respect settled terrain
Skip unchanged overlay cohorts while detecting moved positions and lifecycle changes. Defer ground sampling until visible terrain settles, retain the loaded surface as a floor, and preserve roof heights and bounded retries. Keep regression and idle-render gates intact.
2026-09-11 08:59:32 -07:00
Bilawal Sidhu 6dd00d1e76 fix(infrastructure): declutter stems and correct close-up sizing 2026-09-11 08:59:32 -07:00
manjunath22466 5228ab9e40 fix: preserve keyboard focus and separate Space activation from voice
Keep focus visible across controls and stable during Contacts, Cockpit and mission roster updates. Preserve native short Space activation, and claim push-to-talk only after a 500 ms hold. Add panel Escape handling and keyboard-accessible attribution controls.

Retains the Map Source foundation contributed in https://github.com/bilawalsidhu/gods-eye-view/pull/171.
2026-09-10 23:48:12 -07:00
Sameh Khamis f47cd792d1 fix: share CCTV startup and keep proxy diagnostics bounded 2026-09-10 23:01:51 -07:00
Sameh Khamis 231d339e92 test(a11y): cover delayed and interrupted Map Source focus
Keep the Esri settlement assertion exact, verify selected-source focus and Tab departure in Chromium, cancel pending work during disposal, and document the focused behavior.
2026-09-10 22:12:48 -07:00
manjunath22466 60812df34c fix(a11y): keep Map Source focus on the selected source and cancel stale requests
Build on Tom-Neverwinter’s Map Source focus retry. Prefer the selected tile, and revoke delayed focus when the user moves focus, clicks, or closes the tray.
2026-09-10 22:08:49 -07:00
Sameh Khamis 5dfef8e891 Merge main and narrow the change to Map Source focus and QA 2026-09-10 22:07:41 -07:00
Sameh Khamis 3d526f208d Merge main and narrow accessible input names to useful controls 2026-09-10 21:33:45 -07:00
mwilliamsGH e7cb08f5f6 fix(firms): record source success after aggregation (#181)
Record FIRMS source success after appending its rows so aggregation failures do not produce contradictory source status. Cover large feeds, filtering, ordering and source failures with regression tests.
2026-09-10 21:13:46 -07:00
Malek 87a92c8bc4 fix(radio): resolve common country exonyms Intl.DisplayNames omits (#232)
Recognize common country names and exonyms in Radio country requests and station filtering. Keep ambiguous country names rejected.
2026-09-10 21:01:39 -07:00
onionviolet a4b6dbb41f fix(launches): preserve unknown payload details 2026-09-10 23:29:55 -04:00
Sameh Khamis ac3926c7db fix(earthquakes): reject malformed feature properties 2026-09-10 19:56:01 -07:00
Tom-NeverwinterandClaude Opus 5 0584a1d71d fix: sanitize proxy error payloads, loopback dev-cctv, drop doc drift
Four small, independently-verified issues from the audit backlog:

- #262/#263: the celestrak, terrain-heights, adsbdb and launch-library
  proxies put raw `err.message` / raw upstream error bodies into HTTP
  responses, contradicting the sanitized-error property KNOWN-ISSUES.md
  documents. They now log the real error server-side (matching the GBFS
  and CCTV proxy convention) and return a generic message.
- #265: scripts/dev-cctv.sh defaulted to HOST=0.0.0.0 while dev-fresh.sh
  and dev-secure.sh default to loopback. Now loopback, opt in with
  HOST=0.0.0.0.
- #274: naturalEarthRegions.js's internal haversineKm took (lon, lat,
  lon, lat) while every other haversineKm in src/ takes (lat, lon, lat,
  lon). Same name, same signature shape, opposite order — a silent
  wrong-distance landmine. Reordered to match; the one call site was
  updated, so behavior is unchanged.
- #270: removed CCTV_AUTO_CALIBRATE and CCTV_DRAPE_MESH from
  .env.example; no code anywhere reads them.

Not done: deduplicating the ~10 haversine implementations into one
shared utility. That is issue #188's scope and a far larger diff;
removing the argument-order landmine is what makes the current state
safe.

Verified: npm test (2705 pass / 0 fail), npm run build green.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01C3eGYgDYBo2BCUeDGwGvrp
2026-09-10 15:24:57 -05:00
Tom-NeverwinterandClaude Opus 5 56d52e284f Focus the Map Source tray when it is actually visible, not 240ms later (#54)
`qa:map-source-tray` failed on a clean checkout at "Enter opens the tray and
hands focus to a Map Source tile". The gate was right: this is a real
keyboard-accessibility bug, not a flaky assertion.

Opening the tray schedules the focus hand-off to a Map Source tile 240ms
later (scheduleMapSourceFocus). The tray itself fades in behind a 180ms
`visibility` transition on .dock-popover-content, and a chip inside it cannot
take focus until that transition lands. Those two timers race. When the
machine is slow enough that the fade has not finished at the 240ms mark,
`chip.focus()` is called on a `visibility: hidden` element — which is a
SILENT no-op — and nothing retries. The tray sits open with keyboard focus
stranded on the disclosure, unreachable.

Instrumenting HTMLElement.prototype.focus during a failing run showed exactly
that: focus() called once on the photoreal chip, the chip connected and not
disabled, computed visibility `hidden`, activeElement unchanged.

Fix the hand-off rather than the delay:
- focusMapSource now reports whether focus actually landed (activeElement ===
  chip) instead of assuming .focus() worked.
- scheduleMapSourceFocus retries on a 30ms cadence until it lands, bounded to
  ~720ms past the first attempt so a permanently hidden tray cannot spin.

Also stop the QA gate racing the same timers. Its keyboard checks slept a
fixed 300ms and asserted focus had already moved; they now wait on controller
truth (aria-expanded plus where focus landed), the way the Bing-switch check
already did. That replaces four fixed sleeps, not just the long-Enter-hold
one the issue named. The wait only settles state — the check() below each one
is still the assertion, so a swallowed timeout surfaces as that check failing
with real values rather than an opaque puppeteer error.

Verified against a preview build: `qa:map-source-tray` goes from 3 failures
to 20/20 passing, twice in a row. Unit suite unchanged (2674 passing).

The #44 half of the original work is intentionally dropped: upstream's
track-regression.mjs already fixed the ground-3d sampleHeight floor, and more
thoroughly — it pins no absolute call count at all and adds a guard against a
timed-out driver falsely looking flat.

Closes #54.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01Q6VRsPswjNtZfv4jzgkCUf
2026-09-10 14:46:49 -05:00
Kushagra Kumar 9e92ab6f9b fix(a11y): add accessible names to hud sliders and inputs
Add explicit aria-label attributes to unlabelled interactive controls in index.html and dynamic parameter sliders in src/ui.js, fulfilling WCAG 2.1 Success Criterion 4.1.2 (Name, Role, Value).

- Add aria-label to #scope-feather-slider, #bloom-intensity-slider, #sharpen-intensity-slider, #location-search, #scene-import-file, and first-run suppression checkbox.
- Set aria-label to uniform label on dynamic style parameter sliders in ui.js.
- Add unit test suite (src/hudA11y.test.mjs) verifying accessible names across all inputs in index.html and dynamic slider construction.

Signed-off-by: Kushagra Kumar <[email protected]>
2026-09-09 15:43:58 +05:30
onionviolet c390724bc0 fix(earthquakes): validate snapshots before replacing entities 2026-09-08 17:46:01 -04:00
Bilawal Sidhu 759652207f fix: improve mapped installations and map-source guidance (#183)
Improve mapped installation recovery, deselection, retry feedback, and visual-style and map-source guidance.
2026-09-05 03:30:55 -05:00
Bilawal Sidhu 7ffa421932 fix(overpass): reject legacy cached refusals and share stale recovery 2026-09-03 21:39:33 -05:00
daikaginza 973b4e147f fix(overpass): rotate mirrors on any refusal, and never cache one as data
The proxy lists four mirrors and rotated on 5xx alone, so a 4xx ended the
fan-out. Measured against the live services: overpass-api.de and its lz4 alias
answer 406 to this proxy's User-Agent, while overpass.kumi.systems and
overpass.private.coffee answer 200 to the byte-identical request. Every
Overpass-backed feature — road geometry, annotation outlines, place lookup —
was failing on an Apache error page with two healthy mirrors untried.

The refusal was then cached. The cache guard read `status < 500`, so the error
page was written to memory and to disk, and the serve-stale guard used the same
threshold and declined to replace it. Boundary-class queries hold a month-long
TTL: four of twenty-three cached entries on this machine held that 406, dated
days after the mirror had stopped refusing.

Both decisions now go through one predicate. A payload is data only when it is
a 2xx that is neither rate-limited nor a body-level runtime error, so what may
be cached and what may be replaced by a stale entry cannot drift apart again.

A refusal every mirror agrees on is still reported with the first mirror's
status and body, so a malformed query says what upstream said — after every
mirror has had its chance, not instead of it. fetchOverpassPayload takes
injectable endpoints and fetch so the rotation is covered without a live
mirror; restoring either half of the old behaviour fails the new tests.
2026-09-03 16:54:20 +07:00
Manjunath 39d33b3f29 fix: repair fresh integration setup detection 2026-09-01 11:17:42 -05:00
Bilawal Sidhu d8f1742783 fix(dev-fresh): keyless launch no longer crashes on stock macOS bash 3.2 (#144)
Expanding the empty KEY_SETUP_EXTERNAL_KEYS array under set -u is a fatal
'unbound variable' on bash 3.2, which macOS ships as /bin/bash — so a keyless
./scripts/dev-fresh.sh died at the provenance-marker line before doing
anything. The ${arr[*]:-} guard keeps 3.2 alive and leaves populated launches
byte-identical (same idiom the script already uses for DEV_UNSET).

Verified with /bin/bash 3.2.57: the extracted block runs clean under set -u
with no keys (empty CSV) and with keys (ordered comma-joined names); the full
launcher boots keyless to a live server, and exported keys still classify as
externally managed in Provider Settings. A behavioral guard now runs the real
block from the script both ways in the dev-fresh test surface, plus a textual
assertion pinning the 3.2-safe idiom.
2026-08-31 19:00:33 -05:00