Commit Graph
1001 Commits
Author SHA1 Message Date
Jerry LaiandClaude Opus 5.5 73336b297e feat(cctv): add Taiwan Freeway Bureau camera pack
Read ~1,800 national freeway cameras at runtime from the Freeway Bureau's
keyless MOTC 2.0 CCTV.xml table. Each published MJPEG stream maps to the
same camera server's single-JPEG path; only those exact HTTPS pairs on the
four freeway.gov.tw camera servers are registered. On by default,
CCTV_TAIWAN_ENABLED=0 skips it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 17:52:47 +08:00
ulihhhhandClaude Opus 5.5 93ea088f45 docs(gbfs): note that overflow bikes can exceed dock capacity
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 22:33:57 +01:00
ulihhhhandClaude Opus 5.5 5508caa174 docs: credit and document the Spanish city bike systems
- dataCredits `gbfs`: names the seven PBSC operators, with BiciMAD's
  required "Powered by EMT de Madrid" linking to emtmadrid.es.
- dataCredits `jcdecaux-gbfs`: adds Valenbisi and Sevici.
- DATA_SOURCES.md: a BiciMAD row (Madrid's open-data catalogue publishes
  the feed under EMT's terms, attribution required), one row for the other
  six PBSC feeds (no licence published; attribution to the operator), and
  the JCDecaux row widened to Valencia and Seville.
- CURRENT-STATE.md: the Bikeshare row, and the underscore and
  geofenced-capacity rules in "GBFS upstream bounds".

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 22:33:57 +01:00
ulihhhhandClaude Opus 5.5 23df776374 feat(bikeshare): add nine Spanish city bike systems
Adds the station-based public bike systems of seven Spanish cities on
PBSC and two on JCDecaux, 1,843 stations in all (live feeds, 2026-10-17):

- PBSC (`<city>.publicbikesystem.net`, GBFS v2 like Bicing): BiciMAD
  (Madrid), Bizi Zaragoza, BIKI (Valladolid), BiciCoruña, Dbizi
  (Donostia-San Sebastián), Bilbao Bizi and BicinRivas (Rivas-Vaciamadrid).
- JCDecaux (`api.cyclocity.fr/contracts/…`, like Lillestrøm): Valenbisi
  (Valencia) and Sevici (Seville).

Both hosts are already allowed by the proxy. Every system uses a 40 km
load radius; the farthest station is 11.7 km from its centre (BiciMAD).
The radius also keeps out what two feeds list away from their city:
Sevici's workshop at (0,0) and lab in Madrid, and BiciCoruña's planned
stations with no position yet.

spainCitiesSystems.test.mjs checks the registry and proxy for each feed,
that the outermost live stations activate their system and sit inside
its radius, that central Madrid activates BiciMAD and BicinRivas, that
the far-away stations are not loaded through the real ingestion path,
and that JCDecaux names arrive without underscores and PBSC capacities
as docks.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 22:33:57 +01:00
ulihhhhandClaude Opus 5.5 53cda29be4 fix(gbfs): count docks, not PBSC's geofenced area, as station capacity
PBSC adds the bikes a station accepts in the geofenced area around its
docks to `capacity`, and reports that part as `geofenced_capacity`, which
is not a GBFS field. Bilbao Bizi publishes 39 docks as capacity 839 with
geofenced_capacity 800, so its stations would read as nearly empty: red,
drawn at maximum size, and carded "39 avail · 0 docks · 839 cap".
BiciMAD (671 of 678 stations, about twice the docks) and Dbizi (11 of 70)
do the same.

The shared parser now reads `capacity − geofenced_capacity` when the
extension is present and no larger than the total, so the layer, its
colour ratio and get_bike_share all see the docks. No registered system
changes: none of the 52 publishes a geofenced capacity above 0 (live
feeds, 2026-10-17, all 13,397 capacities identical).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 22:33:57 +01:00
ulihhhhandClaude Opus 5.5 ee686a3207 fix(gbfs): read underscores in station names as word breaks
JCDecaux's Spanish contracts prefix every station name with "_", and
Valenbisi joins its words with it ("_PLAZA_MUSICO_LOPEZ_CHAVARRI"), so
the card and HUD would show the raw identifier. The shared parser now
reads a run of underscores, with the spaces around it, as one word break
and trims the ends. It applies to `name`, the `short_name` fallback and
GBFS v3 localized names, so the layer and get_bike_share both read it.

No registered system changes: run over all 52 live station_information
feeds on 2026-10-17, the old and new parsers give identical names for
all 13,397 stations. Other spacing stays as the operator published it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 22:33:57 +01:00
Sameh Khamis df5ad4ca4a Pair TLE lines through the shared decoder and add the changelog fragment 2026-10-17 13:46:00 -07:00
Sameh Khamis 155f5165d5 Merge branch 'main' into fix/tle-catalog-matching 2026-10-17 13:45:09 -07:00
Sameh Khamis aa52ab2eca Merge branch 'main' into codex/shared-geodesy 2026-10-17 13:37:28 -07:00
Sameh Khamis 6a7935c49e Merge branch 'main' into fix/alpha5-norad-id 2026-10-17 13:25:19 -07:00
monwiss 743ed639e5 fix(dev): stop the dev server watching .gev-cache and .gev-logs (#761)
Providers write cache files and logs into .gev-cache and .gev-logs while the app runs. A serve-only standalone plugin adds both to server.watch.ignored, so the dev watcher no longer stats them; source changes still reload.
2026-10-17 12:18:32 -07:00
Sameh Khamis 64d7ed3c61 Merge branch 'main' into codex/shared-geodesy 2026-10-17 11:42:58 -07:00
Sameh Khamis 7ec84ac316 Decode catalog numbers strictly and add the changelog fragment
Route tleCatalogNumber() and noradIdFromSatnum() through one decoder that
accepts only plain digits or a valid Alpha-5 field. parseInt and Number()
read '2554A', '255 4', '-1234', '0x1F0', '1.5' and blank as numbers; they
now return null/NaN. Digit satnums of any length still decode, so OMM
satrecs numbered past 99999 keep working.

Add a layer test that several Alpha-5 satellites survive ingestion dedupe,
the changelog fragment for #767, and note in CURRENT-STATE that this is
Alpha-5 TLE compatibility and malformed fields are rejected.
2026-10-17 11:40:30 -07:00
Sameh Khamis 6ae854c121 Merge branch 'main' into fix/alpha5-norad-id
# Conflicts:
#	src/layers/satellites/ingestion.js
2026-10-17 11:36:21 -07:00
Sameh Khamis 761953b0bf Correct the remaining permanent-cache comments
The adsbdb proxy keeps successful and 404 answers for 24 hours; two policy comments and the provider's doc comment still said forever.
2026-10-17 11:30:46 -07:00
Sameh Khamis 84cd4d7f99 Merge branch 'main' into docs/fix-adsbdb-cache-ttl 2026-10-17 11:30:30 -07:00
Said Turksever d64028d7ff Merge branch 'main' into test/earthquake-records-validation 2026-10-17 17:15:39 +01:00
VG31OP 40442ab854 style: fix whitespace formatting in tle.js and space.test.mjs 2026-10-17 17:01:13 +05:30
Rudy Celekli 3748e9c23a Merge remote-tracking branch 'origin/main' into HEAD 2026-10-16 23:19:12 -04:00
Rudy Celekli d3e11bfbca test(launches): cover null top-level landing coordinates
Signed-off-by: Rudy Celekli <[email protected]>
2026-10-16 23:19:12 -04:00
Sameh Khamis 1c2910481e Merge branch 'main' into fix/map-fallback-retry 2026-10-16 17:11:05 -07:00
Sameh Khamis 0c3723e930 Merge branch 'main' into feature/geo-uri-search 2026-10-16 17:06:38 -07:00
Rudy Mizrahi Celekli 2fd1b4323c fix(tools): identify historical camera fallback imagery (#1118)
The CCTV frame proxy marks a Street View fallback with X-CCTV-Source, but the portable source dropped the header and get_cctv_snapshot always reported a current view credited to the camera's agency. The source now keeps the recognised provenance, and the tool labels Street View frames as historical Google imagery, refuses synthetic placeholders, and reports unknown provenance without claiming a current view.
2026-10-16 17:06:34 -07:00
Sameh Khamis d9aa2bd06d Release attempt timers on destroy and the replaced fallback terrain
destroy() now expires every retry attempt in flight, clearing its deadline
timer and aborting its signal at once rather than when the attempt settles,
and leaves no retry marked as running.

A successful terrain retry overwrote the cached fallback without releasing
it. The replaced fallback is now disposed as soon as the real terrain takes
its place on screen, or, when it stayed installed behind a 3D tileset, once
the next globe activation replaces it.
2026-10-16 16:53:42 -07:00
Sameh Khamis 759c7964c7 Bound fallback retry attempts with a deadline
An Esri or keyless terrain attempt that never settled kept the single-flight
retry open forever, so neither provider was retried again. Each attempt now
counts as failed after 60 seconds and the retry backs off as usual; its
signal is aborted, and a provider that lands after the deadline is released
rather than installed or cached.

CURRENT-STATE now says only the construction fallback to OSM is retried, not
the switch made after repeated Esri tile failures.
2026-10-16 16:47:11 -07:00
Sameh Khamis f0d43a62e8 Keep fallback retries single-flight and recover imagery and terrain independently
An activation that re-showed a fallback while a retry was in flight armed a
second timer, so two retries could run at once and land out of order, leaving
the cache and the screen on different providers. Retries now run one at a
time; a request made meanwhile re-arms once the current one ends, and a
result that is obsolete or no longer wanted is disposed.

Imagery and terrain retries are now handled as each settles, so a stalled
terrain attempt no longer keeps recovered imagery off screen, or the reverse.
2026-10-16 16:40:34 -07:00
Sameh Khamis f0a04fbbaa Move the changelog entry into changelog.d and watch the Google geocode proxy in QA
Main now takes release notes as one fragment per pull request (#787). The browser asks Google through /api/google/geocode, so the no-geocoder-request check now watches that route.
2026-10-16 16:39:28 -07:00
Sameh Khamis ac258e98d9 Merge branch 'main' into feature/geo-uri-search
# Conflicts:
#	CHANGELOG.md
2026-10-16 16:39:21 -07:00
Sameh Khamis 53bb05abed Merge branch 'main' into fix/tomtom-cross-site-gate
# Conflicts:
#	CHANGELOG.md
#	SECURITY.md
#	docs/CURRENT-STATE.md
#	scripts/package-boundaries.json
#	src/tooling/environmentProviders.test.mjs
2026-10-16 16:39:03 -07:00
Sameh Khamis bc499f1401 Merge branch 'main' into fix/map-fallback-retry
# Conflicts:
#	CHANGELOG.md
2026-10-16 16:38:14 -07:00
Said Turksever 12d36868de Merge branch 'main' into fix/tracked-info-vertical-rate 2026-10-17 00:20:08 +01:00
Said Turksever 694c51d0d1 Merge branch 'main' into fix/tracked-info-vertical-rate 2026-10-17 00:06:57 +01:00
Sameh Khamis ef86796e4d Merge branch 'main' into fix/director-scene-results-971 2026-10-16 16:04:26 -07:00
Sameh Khamis 83f7e2f686 Merge branch 'main' into codex/fix-antimeridian-polygon-containment 2026-10-16 15:58:31 -07:00
Sameh Khamis f150c6ea64 Merge branch 'main' into test/rocket-launches-edge-cases 2026-10-16 15:52:39 -07:00
Ian Blenke a571142d0e fix(recent-imagery): scroll the DETAILS card into view when it opens (#970)
renderDetails() revealed the card inside render(), whose preserveScroll() wrapper restored the previous scrollTop in its finally block, undoing the reveal. The reveal now runs in the DETAILS open handler after render() returns, once per opening; closing and refreshes do not scroll.
2026-10-16 15:52:35 -07:00
Sameh Khamis 19e2979eb5 Merge branch 'main' into fix/geo-distance-dateline 2026-10-16 15:40:43 -07:00
Sameh Khamis cab69d282b Merge branch 'main' into fix/cctv-missing-numbers 2026-10-16 15:34:29 -07:00
Rudy Mizrahi Celekli fb10889841 fix(street-level): release superseded and unmounted Google viewer work (#1117)
A superseded open wait cleared the shared cancelShown slot that belonged to the newer wait, leaving its auth listener and timer alive after close; open() now settles the previous wait first. A lookup whose viewer unmounted while the Street View service loaded still sent a billed getPanorama; describe() now rechecks the lookup after acquisition.
2026-10-16 15:34:26 -07:00
Sameh Khamis e5c74c695e Move the #971 tests into the director suite and add the changelog fragment
The standalone director971.test.mjs rebuilt the browser, storage and viewer
doubles that director.test.mjs already provides. Its cases now live in the
director suite on makeDirector/installSceneRuntime, which gains optional
seeded storage entries and a quota-full switch; existing tests are unchanged.
The checkpoint and failed-save-status cases are split so each fails on its own.
2026-10-16 15:31:08 -07:00
Sameh Khamis 75b1c66006 Merge branch 'main' into fix/director-scene-results-971
# Conflicts:
#	src/scenes/director.js
2026-10-16 15:30:05 -07:00
quanticsoul4772 3c3ea269a9 fix(setup): stop Node's DEP0190 warning when npm runs on Windows (#1057)
Windows runs npm.cmd through a shell, and passing an argument array with `shell: true` is deprecated in Node 24 (DEP0190). Every `npm run doctor` and every Pinokio install on Windows printed the warning. npmProcessSpec now takes the npm arguments and, on Windows, joins them into the command string; the arguments are fixed subcommands (`--version`, `ci`). Unix behavior is unchanged.
2026-10-16 15:28:39 -07:00
Sameh Khamis 189978fc97 Merge branch 'main' into codex/fix-antimeridian-polygon-containment 2026-10-16 15:26:29 -07:00
Sameh Khamis 393f42aed5 Drop payload mass checks that existing tests already pin
Blank, negative and non-numeric masses are covered by the existing missing-payload test; keep the amount fallback and the fractional string mass.
2026-10-16 15:25:46 -07:00
Sameh Khamis 300447c9ce Merge branch 'main' into test/rocket-launches-edge-cases 2026-10-16 15:25:36 -07:00
Sameh Khamis 34dabd1e88 Format the mesh-floor sampler 2026-10-16 15:22:39 -07:00
Sameh Khamis 1344b5d77e Merge branch 'main' into fix/geo-distance-dateline 2026-10-16 15:01:55 -07:00
Sameh Khamis 3e6680000a Merge branch 'main' into fix/cctv-missing-numbers 2026-10-16 15:01:54 -07:00
Sameh Khamis c6f0f9db0a Share one antimeridian-safe distance and move the changelog entry
The flights records and the mesh-floor sampler kept identical copies of the equirectangular distance; both now import src/data/approxDistance.js. The changelog entry moves to changelog.d (#787), and CURRENT-STATE notes the antimeridian behaviour.
2026-10-16 15:01:29 -07:00
Sameh Khamis c37e301ab7 Merge branch 'main' into fix/geo-distance-dateline
# Conflicts:
#	CHANGELOG.md
2026-10-16 14:59:29 -07:00