Commit Graph
374 Commits
Author SHA1 Message Date
Sameh Khamis 17dc37b529 chore: record mechanical formatting revision for blame 2026-09-15 07:26:32 -07:00
Sameh Khamis 2aca7aecbb style: format remaining owned runtime modules 2026-09-15 07:26:32 -07:00
Sameh Khamis ae99843c14 build: discover owned runtime modules in the formatter gate 2026-09-15 07:26:32 -07:00
Bilawal Sidhu 76c20be277 feat(transit): live public-transit vehicles from open GTFS-Realtime feeds (#587)
Supersedes #218 by @spcpza, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Contributor: @spcpza. His original commit is the base of this branch, and his own re-port onto main (2026-09-15, `5b69011`) was consulted while finishing the height work. That port reads every vehicle's surface from the app's shared ground-floor system (`cachedGroundFloor` / `warmGroundFloor` / `GROUND_FLOOR_LIFT_M`) rather than sampling the scene per layer, keeps a vehicle hidden until its cell answers, warms a bounded batch per poll on a timer instead of per frame, and renders at the ellipsoid above the altitude gate. That is the sounder primitive — one floor system for the app, with the rooftop-versus-street question already settled against a datum-correct DEM prior — and this branch's height work was rebuilt on it, replacing a bespoke cell cache, ground prior and rooftop rule written here. Credit for that direction is his.

Future work (not in this PR), both written up in docs/CURRENT-STATE.md:

- Readable route names. The realtime feeds carry only `route_id`; `route_short_name` / `route_long_name` live in each operator's static GTFS `routes.txt`, and headsigns in `trips.txt`. Doing it properly wants a server-side metadata loader beside the transit proxy with fixed registered static sources, bounded indexes built once and persisted, a slow conditional refresh, and a versioned route dictionary the browser caches. Shipped here: ids are never rewritten, and a cut one carries an ellipsis instead of reading as a typo.
- Below-ground rendering. Subway vehicles are drawn on the surface directly above themselves, because the feeds carry no depth and a train nobody can see is not worth drawing; the card says so plainly. Real treatment wants OSM tunnel geometry per city and a ghosted sprite tethered to the surface. The owner recorded it and left it.

Round four and after (2026-09-15). The owner tested round three under FLIR and NVG, and then asked for the design to be taken further: elegant in performance, beautiful on camera, trails with a cache for public transport, Cesium-native, and a core other moving layers can adopt. Codex Astra reviewed the plan (it confirmed the speed fault: a glide started from the drawn position at receipt time but spanned the gap between report times, so with MBTA reporting every ~10 s against a 15 s poll every second glide ran at 1.5x; it rejected a queued-segment patch), then wrote the design, then implemented it in commit-sized passes with adversarial review between them and real-browser harness runs by the integrator.

What this PR now contains beyond the contributor's original port:

- Delayed playback in a contact-agnostic core (`src/data/contactPlayback.js`): each vehicle keeps a typed, bounded fix history and a display clock that runs at one second per second through it, a feed-derived lag behind real time, holding at its newest fix rather than extrapolating and never sprinting to catch up. Marker, course, motion word, card and trail all read the same displayed sample. The clock has an explicit time-offset and seek API so a rewind is a later feature, not a rewrite; flights and vessels are untouched.
- A selected-vehicle trail (`src/data/contactTrailRenderer.js`, `src/layers/transit/trails.js`): the retained history drawn with batched Cesium primitives, clipped at display time so the head is exactly the sprite, faded by age, in the mode colour (white under sensor presets), on the same surface path as the marker.
- Bounded proxy-side history (`server/providers/transitHistory.js`): fifteen minutes and at most 128 fixes per vehicle with hard byte ceilings, MBTA only for now (opt-in per feed), served by a small endpoint that never fetches upstream, so a selected trail survives a browser reload while the server keeps running.
- Scene work bounded to what is visible and moving, an occluder, cached DETECT candidates, holds on the render loop only while something visible moves.
- Sensor presets: white-hot haloed sprites under NVG/FLIR/noir (black-hot inverts), saturated mode colours under CRT, per-mode bracket tiers in every theme, the selected card keeping its mode colour.
- A discriminating browser harness (`scripts/qa-transit.mjs`) that samples postRender frames, reads the real card anchor, and measures fleet budgets at 800 and 3,000 vehicles.

Not built, recorded as follow-ups: curated route display names (lowest priority per the owner), fleet-wide tails, route snapping, a rewind UI, adoption of the playback core by flights and vessels.

Verified at merge (2026-09-15 morning): unit suite 3,896 passing, build clean, format and boundary gates clean, tracking regression 109/109, browser harness keyless 200 pass / 0 fail (13 sensor checks unexercised because the live view offered fewer than six isolated sprites; every judged sprite passed), keyed on Google 3D tiles 198 pass with the per-frame allocation gate as the only failure. Follow-ups recorded: the keyed build's playback sampler still allocates per frame (CPU and frame time stay within budget; the 3,000-vehicle metro view sits at a 27.6 ms frame interval against a 25 ms budget), the shared detection overlay's per-paint allocation, friendlier route names, fleet-wide tails, a rewind UI, and adopting the playback core for vessels and flights.
Co-authored-by: spcpza <[email protected]>
2026-09-15 05:18:30 -05:00
Bilawal Sidhu 1ad565c8af Keep your target in view: smooth camera controls and organized data layers (#583)
## Explore the map without losing your target
Tilt and north-up used to stop tracking an aircraft or satellite. Both controls now keep the selected target centered while easing into the new angle over 650 ms, preserving camera range. Tilt switches between top-down and oblique views; north-up takes the shortest rotation. Rapid presses reverse a pending tilt, and pressing north-up during a tilt completes both changes.

New navigation, target selection, map gestures, and teardown cancel the transition. Cockpit keeps its existing camera guard.

## A data panel that follows how you explore
The panel now has five clearly labeled sections:

| Section | Layer order |
| --- | --- |
| Movement | Satellites → Live Flights → Military Flights → Live Vessels → Street Traffic → Bike Share |
| Cameras | Cameras → Mapped ALPR Cameras |
| Infrastructure | Mapped Installations → Data Centers → Submarine Cables → Dams |
| Events | Space Missions → Earthquakes → Active Fires |
| Utilities | Directions → Radio |

Readable panel labels replace CCTV, Bikeshare, Datacenters, and provider-heavy names. Source attribution remains in the subtitles, and toggle accessibility labels match the visible names. Presentation order is independent of layer registration; hidden layers stay hidden and unlisted layers remain available under Other layers.

## Validation
- Camera changes: full Node 24 suite, including allocation gates — 3,699 passing and one skipped.
- Final panel changes: 42 focused tests passed; browser inspection confirmed all sections, ordering, and labels.
- Real Cesium Camera/EntityView tests cover moving aircraft, low/high satellites, cancellation, navigation ownership, and rapid button presses.
- Live browser: UITMSAT-2 remained centered and selected through tilt and north-up, including combined commands.
- Final formatting, package-boundary checks, and production build pass.
- GitHub CI verifies the final head on Node 24, Node 26, and Windows onboarding before merge.
2026-09-15 02:24:54 -05:00
Sameh Khamis c9f9896b48 Merge pull request #582 from bilawalsidhu/refactor/geocoding-provider-adapters
refactor: make geocoding providers configurable and share source helpers
2026-09-14 22:22:13 -07:00
Sameh Khamis a79208181f refactor: separate Nominatim transport from search composition 2026-09-14 22:14:51 -07:00
Sameh Khamis 2b09352463 test: use exported response reader in proxy fixtures 2026-09-14 22:12:53 -07:00
Sameh Khamis 66eb6d6a7c refactor: add configurable Nominatim adapter and portable source helpers 2026-09-14 22:08:16 -07:00
Sameh Khamis 2b1092bf89 Merge pull request #580 from bilawalsidhu/refactor/reference-source-exports
refactor: expose reference sources independently of standalone setup
2026-09-14 22:01:14 -07:00
Sameh Khamis e46d50ce52 refactor: expose reference sources independently of standalone setup 2026-09-14 21:52:27 -07:00
Sameh Khamis 8bfce9080d Merge pull request #579 from bilawalsidhu/refactor/import-directions
refactor: enforce import directions and expose source factories
2026-09-14 21:17:22 -07:00
Sameh Khamis ba2af1c29a test: exercise import aliases without Windows symlink privileges 2026-09-14 21:14:00 -07:00
Sameh Khamis cc960b0dbe refactor: enforce import directions and expose source factories 2026-09-14 21:12:01 -07:00
Sameh Khamis 704e0fcc51 Merge pull request #578 from bilawalsidhu/refactor/voice-session-interface
refactor: separate voice sessions from protocol adapters
2026-09-14 20:31:36 -07:00
Sameh Khamis 4507f3a1d0 refactor: separate voice sessions from protocol adapters 2026-09-14 20:27:12 -07:00
Sameh Khamis 584c9608d5 Merge pull request #577 from bilawalsidhu/refactor/voice-action-schemas
refactor: separate voice action schemas from descriptions
2026-09-14 20:09:13 -07:00
Sameh Khamis 55b240e3ab refactor: separate voice action schemas from descriptions 2026-09-14 20:05:32 -07:00
Sameh Khamis 223cae609f Merge pull request #576 from bilawalsidhu/refactor/source-protocols
refactor: expose portable source record protocols
2026-09-14 19:40:50 -07:00
Sameh Khamis ea6c8653b3 refactor: expose portable source record protocols 2026-09-14 19:36:32 -07:00
Bilawal SidhuandMatthew-Selvam 6fa25c349a fix(ui): name the missing provider key on a key-gated layer row (#575)
Supersedes #296 by @Matthew-Selvam, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: Matthew-Selvam <[email protected]>
2026-09-14 21:26:09 -05:00
Bilawal Sidhuandsendmebits 7fa0cfbb26 feat(search): Nominatim as the last-resort geocoder (#573)
Supersedes #350 by @sendmebits, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: sendmebits <[email protected]>
2026-09-14 21:22:08 -05:00
Bilawal SidhuandKuraPiee cca6442997 feat(search): coordinates and bundled presets resolve keyless (#572)
Supersedes #388 by @KuraPiee, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: KuraPiee <[email protected]>
2026-09-14 21:18:07 -05:00
Bilawal SidhuandYashveer Singh d9fac6d88e feat(ui): tilt and north-up compass controls (#571)
Supersedes #442 by @yashveeeeeeer, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: Yashveer Singh <[email protected]>
2026-09-14 21:15:29 -05:00
Bilawal SidhuandCyber Knight fb5ee5aa36 fix(installations): send an identifying User-Agent to Overpass (#570)
Supersedes #420 by @GladiatorrX9, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: Cyber Knight <[email protected]>
2026-09-14 21:11:32 -05:00
Bilawal SidhuandMiguelGFerreira 2b0fcd4595 fix(bikeshare): address the GBFS proxy by path, not query string (#569)
Supersedes #441 by @MiguelGFerreira, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: MiguelGFerreira <[email protected]>
2026-09-14 21:08:12 -05:00
Sameh Khamis 96a6b49477 Merge pull request #557 from bilawalsidhu/feat/alpr-visual-treatment
Port ALPR camera visuals into the shared layer
2026-09-14 18:17:09 -07:00
Sameh Khamis 27dec4e949 Merge branch 'main' into feat/alpr-visual-treatment 2026-09-14 18:13:10 -07:00
Sameh Khamis 9b85a79969 Merge pull request #510 from bilawalsidhu/docs/community-pr-workflow
Formalize community PR review and integration
2026-09-14 18:12:53 -07:00
Sameh Khamis 794bd10553 Merge branch 'main' into docs/community-pr-workflow 2026-09-14 18:10:19 -07:00
Sameh Khamis fdf030cbc9 Merge remote-tracking branch 'origin/main' into feat/alpr-visual-treatment
# Conflicts:
#	scripts/package-boundaries.json
2026-09-14 18:10:05 -07:00
Bilawal Sidhuandspcpza d78696dc17 feat(directions): keyless A→B directions with turn-by-turn steps and FLY (#564)
Supersedes #219 by @spcpza, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: spcpza <[email protected]>
2026-09-14 20:09:41 -05:00
Bilawal Sidhu 9fc8d1966b feat(annotations): draw on the world by hand (#547)
Supersedes #235 by @cora-fresh-labs, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Future work (not in this PR): hand-drawn marks do not persist across a reload today, and neither do spoken annotations; there is no storage layer for marks. The natural home is Scenes: a drawing that belongs to a shot and persists per shot, so a scene animation can carry its own marks. Needs an owner.
Co-authored-by: Clint Borle <[email protected]>
2026-09-14 19:59:26 -05:00
Bilawal Sidhuandrileygramlich 409e27d7f9 feat(cctv): add the Open Calgary camera pack (#514)
Supersedes #438 by @rileygramlich, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: rileygramlich <[email protected]>
2026-09-14 19:45:52 -05:00
Bilawal Sidhuandvegettto a04502559e docs(cctv): correct the panel reset instructions to the current storage key (#509)
Supersedes #408 by @vegettto, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: vegettto <[email protected]>
2026-09-14 19:42:24 -05:00
Bilawal Sidhuandmichaelhan1208 94f5e4dd45 fix(windows): isolate the ACL verifier from the PowerShell 7 module path (#508)
Supersedes #161 by @michaelhan1208, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: michaelhan1208 <[email protected]>
2026-09-14 19:38:28 -05:00
Sameh Khamisandmanjunath22466 87629ac175 Port ALPR camera visuals into the shared layer
Add camera badges, gradient direction wedges and animated tactical selection cards while preserving bounded loading and layer lifecycle. Align the ALPR data-layer header and retain native pick ownership for overlay badges.

Co-authored-by: manjunath22466 <[email protected]>
2026-09-14 17:35:24 -07:00
Bilawal SidhuandPedro Lobato 70dca86bc1 fix(pinokio): disclose incoming changes before Update pulls and installs (#507)
Supersedes #356 by @Lob26, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: Pedro Lobato <[email protected]>
2026-09-14 19:34:23 -05:00
Bilawal SidhuandSurefireStudios b00f835341 ci: pin GitHub Actions to commit SHAs (#505)
Supersedes #309 by @SurefireStudios, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: SurefireStudios <[email protected]>
2026-09-14 19:29:45 -05:00
Bilawal Sidhuanddajiaohuang 1c9a55e2f9 docs: drop two retired CCTV client flags from the env template (#503)
Supersedes #283 by @dajiaohuang, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: dajiaohuang <[email protected]>
2026-09-14 19:26:19 -05:00
Bilawal SidhuandMemel 8702458cf6 perf: subset the icon font and drop the unused second family (#513)
Supersedes #239 by @mml-studio, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: Memel <[email protected]>
2026-09-14 19:21:38 -05:00
Bilawal SidhuandMaher Kurdi da700be77f fix(cctv): bound the Range header and release abandoned camera streams (#512)
Supersedes #253 by @Maher-Reven, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: Maher Kurdi <[email protected]>
2026-09-14 19:17:52 -05:00
Bilawal SidhuandPedro Lobato 428a6d7332 docs(cctv): state what the app does with camera frames (#511)
Supersedes #357 by @Lob26, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: Pedro Lobato <[email protected]>
2026-09-14 19:13:39 -05:00
Bilawal Sidhuanddaikaginza 687edc4da7 test: check the destination preset table as data (#506)
Supersedes #168 by @daikaginza, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: daikaginza <[email protected]>
2026-09-14 19:08:00 -05:00
Bilawal Sidhuandraiyan22 e6deeaeca8 chore: remove the unwired annotation GeoJSON interchange (#502)
Supersedes #293 by @raiyan22, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: raiyan22 <[email protected]>
2026-09-14 19:02:31 -05:00
Sameh Khamis 7b3271b5d3 docs: formalize community PR review and integration 2026-09-14 17:01:53 -07:00
Bilawal SidhuandVassago DevTeam a1d0a42450 fix(test): resolve the macOS temp root through its symlink in the launcher and preview tests (#501)
Supersedes #301 by @VassagoDevteam, ported onto the current component layout with fixes from review.

Verified before merge: format, package boundaries, unit suite, build, and the browser tracking suite; a browser harness for the change where one applies; adversarial review applied.

Co-authored-by: Vassago DevTeam <[email protected]>
2026-09-14 18:55:24 -05:00
Sameh Khamis c56ef52ce3 Merge pull request #500 from bilawalsidhu/refactor/vessel-record-ownership
Separate vessel records and acquisition from rendering
2026-09-14 16:44:24 -07:00
Sameh Khamis bdc026e50a Separate vessel records and acquisition from scene resources 2026-09-14 16:37:41 -07:00
Sameh Khamis 852008df4d Merge pull request #499 from bilawalsidhu/refactor/military-flight-records
Separate military-flight records and rendering
2026-09-14 16:23:02 -07:00