Commit Graph
48 Commits
Author SHA1 Message Date
Sameh Khamis c82fdd7478 Merge pull request #290: update vulnerable dependencies and browser QA
Includes the reviewed dependency updates and Puppeteer compatibility changes, verified with the accepted security fixes.
2026-09-10 23:27:30 -07:00
Sameh Khamis 5a8738c11d Merge main security fixes before dependency verification 2026-09-10 23:20:24 -07:00
Sameh Khamis e9fd272ade Merge pull request #289: consolidate CCTV startup and sanitize proxy failures
Preserve contributor authorship and the reviewed launcher, proxy, and regression fixes.
2026-09-10 23:19:42 -07:00
Sameh Khamis f94bdb1d77 fix: update vulnerable dependencies and adapt browser QA to Puppeteer 25 2026-09-10 23:08:26 -07:00
Sameh Khamis f47cd792d1 fix: share CCTV startup and keep proxy diagnostics bounded 2026-09-10 23:01:51 -07:00
Tom-Neverwinter 8fc86e0780 fix: sanitize proxy failures and default CCTV launcher to loopback 2026-09-10 22:54:50 -07:00
Sameh Khamis a458d27067 Merge pull request #171: preserve Map Source keyboard focus
Preserve the selected map source through delayed keyboard opening and cancel interrupted focus requests.

Retain Tom-Neverwinter's original focus repair and Manjunath's separately authored selection/cancellation refinements, with maintainer integration and verification commits.
2026-09-10 22:16:41 -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 6fb8cc37d5 Merge pull request #216 from kk376/fix/hud-input-a11y-labels
fix(a11y): add accessible names to hud sliders and inputs
2026-09-10 21:37:53 -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
Sameh Khamis 024738a8d2 Merge pull request #197 from onionviolet/codex/upstream-payload-truth
fix(launches): preserve unknown payload details
2026-09-10 20:34:35 -07:00
onionviolet a4b6dbb41f fix(launches): preserve unknown payload details 2026-09-10 23:29:55 -04:00
Sameh Khamis 5067abfe9b Merge pull request #198 from onionviolet/codex/upstream-earthquake-snapshot
fix(earthquakes): validate snapshots before replacing entities
2026-09-10 20:00:24 -07: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 ea344c952f fix(qa): don't pass the macOS-only Metal ANGLE backend on other platforms
Six QA harnesses launched Chrome with `--use-angle=metal` unconditionally
(or defaulted to it). Metal is a macOS-only ANGLE backend: on Windows and
Linux it makes WebGL initialization fail outright, so CesiumWidget never
constructs, the app never boots, and the harness dies at its
`waitForFunction` boot wait — before running a single assertion:

    Error constructing CesiumWidget.
    RuntimeError: The browser supports WebGL, but initialization failed.
    TimeoutError: Waiting failed: 60000ms exceeded

Affected: qa-map-source-tray, qa-cockpit-utility, qa-view-target-prewarm,
qa-firstrun (unconditional), qa-cockpit-plates (GPU branch taken off-Mac
too) and qa-floor-hold (`--angle` defaulted to metal everywhere).

Fixed by adopting the platform check qa-flyroute-cinema.mjs already uses:
real GPU via Metal on darwin, the portable swiftshader rasterizer
elsewhere — which is what the other ~20 QA scripts already pass. No
behavior change on macOS.

Verified on Windows 11: `npm run qa:map-source-tray` went from 0
assertions (boot timeout) to all 20 checks running.

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 6c49c2aa22 fix(qa): de-flake the Esri fallback check's fixed 50ms DOM settle
The last fixed sleep in this harness: after the controller commits
`activeId = 'osm'`, the fallback callback re-syncs the chips and Cesium
drops the "Powered by Esri" credit on a later render frame again. A flat
50ms covered that most runs and not a slow one — observed failing once in
12 runs on Windows with `creditVisible: true` after the fallback.

Same root cause and same remedy as the tray timers above: poll the
observable truth (credit gone AND the pressed chip is osm), bounded at 3s,
instead of guessing a duration.

0 failures in 15 consecutive runs after this, against 1-in-12 before.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01C3eGYgDYBo2BCUeDGwGvrp
2026-09-10 15:10:05 -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 3b6b3f1007 Merge README Pinokio setup refresh (#182)
Refresh Pinokio installation guidance, launch recognition, and README copy. Documentation only; existing media and runtime behavior are unchanged.
2026-09-04 21:22:04 -05:00
Bilawal Sidhu b6d0518960 docs: refresh Pinokio setup and README copy 2026-09-04 21:17:51 -05:00
Bilawal Sidhu 25838e056a Merge pull request #173: Overpass mirror and cache recovery
Recover across existing Overpass mirrors, reject cached refusals, and serve consistent last-good data to coalesced callers. Preserve the original contribution from PR #165.
2026-09-03 21:47:45 -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
Bilawal Sidhu 9dfb5369e8 Merge pull request #160 from bilawalsidhu/docs/maintainers-and-hosted
docs: name maintainers, add CODEOWNERS, announce hosted version
2026-09-02 18:28:59 -05:00
Bilawal Sidhu 10df9c01e2 docs: add maintainers and announce hosted version 2026-09-02 18:24:03 -05:00
Bilawal Sidhu 65bc522f49 Merge pull request #153 from bilawalsidhu/release/v0.1.1
release: v0.1.1 — installation and live-data fixes
v0.1.1
2026-09-01 14:41:55 -05:00
Bilawal Sidhu ae66e9d299 chore(release): prepare v0.1.1
Promote the current reliability fixes into a dated patch release and align the package metadata.
2026-09-01 14:38:52 -05:00
Bilawal Sidhu d399dfc92d docs: tighten README opening
Simplify the keyless Quick Start pitch and clarify which data is live, regularly refreshed, simulated, or estimated.
2026-09-01 14:38:52 -05:00
Bilawal Sidhu 53a5f01a79 Merge pull request #152 from bilawalsidhu/fix/pinokio-install-marker
fix: recognize completed Pinokio setup
2026-09-01 11:21:54 -05: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
9db0813daf fix: measure GBFS response cap in bytes, not string length (#45)
* fix: measure GBFS response cap in bytes, not string length

The 5 MB cap compared GBFS_MAX_BODY_BYTES against body.length, which is the
string's UTF-16 code-unit count rather than its byte size. Those match for
ASCII but diverge for multi-byte payloads, so a large non-ASCII response
could slip past the cap. Switched to Buffer.byteLength.

Closes #32

* docs(changelog): move the GBFS byte-cap entry into the current Unreleased section

---------

Co-authored-by: Bilawal Sidhu <[email protected]>
Co-authored-by: Bilawal Sidhu <[email protected]>
2026-08-31 18:55:17 -05:00
6b7bca2913 fix(firms): drop argument spread in fires.push — RangeError silently dropped 2 of 3 VIIRS sources (#93)
* fix(firms): drop spread in fires.push — RangeError silently killed 2 of 3 VIIRS sources

fires.push(...records) passes every record as a function argument. A
world/2 VIIRS pull returns ~131k records for NOAA20 and SNPP, over V8's
~125k argument limit, so both threw RangeError: Maximum call stack size
exceeded. The throw landed after sources.push({ok:true}), so each failed
source was listed twice — once ok:true with its real count, once ok:false
— while its records were dropped entirely. Only NOAA21 (114k, under the
limit) survived, making the layer look healthy at a third of the data.

Global fire count goes 113,996 -> 377,169.

* docs(changelog): record the FIRMS multi-source merge fix

* docs(changelog): move the FIRMS fix into a new Unreleased section above 0.1.0

---------

Co-authored-by: Bilawal Sidhu <[email protected]>
Co-authored-by: Bilawal Sidhu <[email protected]>
2026-08-31 18:50:49 -05:00
Bilawal Sidhu b6da93b8ac release: v0.1.0 — one-click install, keyless boot, in-app Provider Settings (#142)
The first formal release.

- One-click install via Pinokio; keyless boot lands on a live Esri World
  Imagery satellite globe with keyless terrain, with automatic OSM fallback
  and graceful degradation when terrain is unavailable.
- Provider Settings (the POWER UP panel): add, replace, or remove API keys
  inside the app; credential files made owner-only before any secret is
  written; external keys shown read-only; the panel refuses shared or proxied
  servers.
- Keyless capability responses for the optional HUD summary and place search.
- Aircraft-identity voice answers cover operator, type, and route, and say so
  plainly when enrichment is unavailable.
- README rewritten keyless-first; concise 0.1.0 changelog section; CI
  workflow included.

Gates: 2,672 unit tests pass / 0 fail, build clean, tracking regression
108/108, map-source tray QA pass, setup doctor ready.
v0.1.0
2026-08-31 17:49:45 -05:00
Ethan Stoner 6d83bb6008 fix(data): keep node:fs out of the browser-built data modules (#83)
naturalEarthRegions.js and neighborhoodPolygons.js each carried an
isNode branch that dynamically imported node:fs to read their bundled JSON
packs, because a plain dynamic JSON import needs an import attribute in
Node. Vite only warns about externalizing node:fs for the browser, so both
warnings survived every production build and the runtime boundary rested on
an environment guard.

Give both loaders the import attribute instead. Vite bundles the JSON as a
module exactly as before (the emitted regions/marine/san-francisco chunks
are byte-identical), Node loads the same files under node:test, and the
isNode split disappears.

Add a source-boundary test so a node: import cannot silently return to a
browser-built module.

Closes #34
2026-08-31 15:25:02 -05:00
Ethan Stoner ac927de71a chore: normalize line endings to LF via .gitattributes (#81) 2026-08-31 15:24:57 -05:00
Bilawal Sidhu 314a0e1c2e Streamline README: AI-assisted setup instructions, walkthrough video, consolidated demo flow 2026-08-27 19:46:09 -05:00
Bilawal Sidhu 880a672b5e Release God's Eye View as open source 2026-08-24 17:02:16 -05:00
Bilawal Sidhu a5aaea7e16 Trusted testing underway; public release by August 24 2026-08-18 14:43:32 -05:00
Bilawal Sidhu 6b8b8afba6 Set release date and refresh README
- Public release set for August 18, 2026, with a running updates log
- New hero GIF and four interface stills replacing the old previews
- Rewrite copy: lead with lineage, then the news, then the product
- Remove superseded hero images
- Add .gitignore for .DS_Store
2026-07-30 22:15:16 -05:00
Bilawal Sidhu 7afb3beefb Prepare public release placeholder 2026-06-22 23:18:38 -05:00