mostlyright 1.1.3 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -35,6 +35,13 @@ var mostlyright = (() => {
35
35
  }
36
36
  });
37
37
 
38
+ // ../core/src/schemas/generated/forecast.station.v1.ts
39
+ var init_forecast_station_v1 = __esm({
40
+ "../core/src/schemas/generated/forecast.station.v1.ts"() {
41
+ "use strict";
42
+ }
43
+ });
44
+
38
45
  // ../core/src/schemas/generated/settlement.cli.v1.ts
39
46
  var init_settlement_cli_v1 = __esm({
40
47
  "../core/src/schemas/generated/settlement.cli.v1.ts"() {
@@ -62,6 +69,7 @@ var mostlyright = (() => {
62
69
  "use strict";
63
70
  init_observation_v1();
64
71
  init_forecast_iem_mos_v1();
72
+ init_forecast_station_v1();
65
73
  init_settlement_cli_v1();
66
74
  init_observation_ledger_v1();
67
75
  init_observation_qc_v1();
@@ -82,7 +90,10 @@ var mostlyright = (() => {
82
90
  latitude: 52.3667,
83
91
  longitude: 13.5033,
84
92
  name: "Berlin Brandenburg",
85
- tz: "Europe/Berlin"
93
+ tz: "Europe/Berlin",
94
+ venues: [
95
+ "polymarket"
96
+ ]
86
97
  },
87
98
  {
88
99
  code: "EDDF",
@@ -92,7 +103,10 @@ var mostlyright = (() => {
92
103
  latitude: 50.0379,
93
104
  longitude: 8.5622,
94
105
  name: "Frankfurt am Main",
95
- tz: "Europe/Berlin"
106
+ tz: "Europe/Berlin",
107
+ venues: [
108
+ "polymarket"
109
+ ]
96
110
  },
97
111
  {
98
112
  code: "EDDM",
@@ -102,7 +116,10 @@ var mostlyright = (() => {
102
116
  latitude: 48.3538,
103
117
  longitude: 11.7861,
104
118
  name: "Munich Franz Josef Strauss",
105
- tz: "Europe/Berlin"
119
+ tz: "Europe/Berlin",
120
+ venues: [
121
+ "polymarket"
122
+ ]
106
123
  },
107
124
  {
108
125
  code: "EFHK",
@@ -112,7 +129,10 @@ var mostlyright = (() => {
112
129
  latitude: 60.3172,
113
130
  longitude: 24.9633,
114
131
  name: "Helsinki-Vantaa",
115
- tz: "Europe/Helsinki"
132
+ tz: "Europe/Helsinki",
133
+ venues: [
134
+ "polymarket"
135
+ ]
116
136
  },
117
137
  {
118
138
  code: "EGKK",
@@ -122,7 +142,10 @@ var mostlyright = (() => {
122
142
  latitude: 51.1481,
123
143
  longitude: -0.1903,
124
144
  name: "London Gatwick",
125
- tz: "Europe/London"
145
+ tz: "Europe/London",
146
+ venues: [
147
+ "polymarket"
148
+ ]
126
149
  },
127
150
  {
128
151
  code: "EGLL",
@@ -132,7 +155,10 @@ var mostlyright = (() => {
132
155
  latitude: 51.4706,
133
156
  longitude: -0.4619,
134
157
  name: "London Heathrow",
135
- tz: "Europe/London"
158
+ tz: "Europe/London",
159
+ venues: [
160
+ "polymarket"
161
+ ]
136
162
  },
137
163
  {
138
164
  code: "EHAM",
@@ -142,7 +168,10 @@ var mostlyright = (() => {
142
168
  latitude: 52.3086,
143
169
  longitude: 4.7639,
144
170
  name: "Amsterdam Schiphol",
145
- tz: "Europe/Amsterdam"
171
+ tz: "Europe/Amsterdam",
172
+ venues: [
173
+ "polymarket"
174
+ ]
146
175
  },
147
176
  {
148
177
  code: "EKCH",
@@ -152,7 +181,10 @@ var mostlyright = (() => {
152
181
  latitude: 55.6181,
153
182
  longitude: 12.6561,
154
183
  name: "Copenhagen Kastrup",
155
- tz: "Europe/Copenhagen"
184
+ tz: "Europe/Copenhagen",
185
+ venues: [
186
+ "polymarket"
187
+ ]
156
188
  },
157
189
  {
158
190
  code: "EPWA",
@@ -162,7 +194,10 @@ var mostlyright = (() => {
162
194
  latitude: 52.1657,
163
195
  longitude: 20.9671,
164
196
  name: "Warsaw Chopin",
165
- tz: "Europe/Warsaw"
197
+ tz: "Europe/Warsaw",
198
+ venues: [
199
+ "polymarket"
200
+ ]
166
201
  },
167
202
  {
168
203
  code: "ESSA",
@@ -172,7 +207,10 @@ var mostlyright = (() => {
172
207
  latitude: 59.6519,
173
208
  longitude: 17.9186,
174
209
  name: "Stockholm Arlanda",
175
- tz: "Europe/Stockholm"
210
+ tz: "Europe/Stockholm",
211
+ venues: [
212
+ "polymarket"
213
+ ]
176
214
  },
177
215
  {
178
216
  code: "ATL",
@@ -182,7 +220,11 @@ var mostlyright = (() => {
182
220
  latitude: 33.6407,
183
221
  longitude: -84.4277,
184
222
  name: "Hartsfield-Jackson Atlanta International",
185
- tz: "America/New_York"
223
+ tz: "America/New_York",
224
+ venues: [
225
+ "kalshi",
226
+ "polymarket"
227
+ ]
186
228
  },
187
229
  {
188
230
  code: "AUS",
@@ -192,7 +234,24 @@ var mostlyright = (() => {
192
234
  latitude: 30.1975,
193
235
  longitude: -97.6664,
194
236
  name: "Austin-Bergstrom International",
195
- tz: "America/Chicago"
237
+ tz: "America/Chicago",
238
+ venues: [
239
+ "kalshi",
240
+ "polymarket"
241
+ ]
242
+ },
243
+ {
244
+ code: "BNA",
245
+ country: "US",
246
+ ghcnh_id: "USW00013897",
247
+ icao: "KBNA",
248
+ latitude: 36.1245,
249
+ longitude: -86.6782,
250
+ name: "Nashville International",
251
+ tz: "America/Chicago",
252
+ venues: [
253
+ "kalshi"
254
+ ]
196
255
  },
197
256
  {
198
257
  code: "BOS",
@@ -202,7 +261,24 @@ var mostlyright = (() => {
202
261
  latitude: 42.3656,
203
262
  longitude: -71.0096,
204
263
  name: "Boston Logan International",
205
- tz: "America/New_York"
264
+ tz: "America/New_York",
265
+ venues: [
266
+ "kalshi",
267
+ "polymarket"
268
+ ]
269
+ },
270
+ {
271
+ code: "CVG",
272
+ country: "US",
273
+ ghcnh_id: "USW00093814",
274
+ icao: "KCVG",
275
+ latitude: 39.0488,
276
+ longitude: -84.6678,
277
+ name: "Cincinnati/Northern Kentucky International",
278
+ tz: "America/New_York",
279
+ venues: [
280
+ "kalshi"
281
+ ]
206
282
  },
207
283
  {
208
284
  code: "DCA",
@@ -212,7 +288,11 @@ var mostlyright = (() => {
212
288
  latitude: 38.8512,
213
289
  longitude: -77.0402,
214
290
  name: "Washington Reagan National",
215
- tz: "America/New_York"
291
+ tz: "America/New_York",
292
+ venues: [
293
+ "kalshi",
294
+ "polymarket"
295
+ ]
216
296
  },
217
297
  {
218
298
  code: "DEN",
@@ -222,7 +302,11 @@ var mostlyright = (() => {
222
302
  latitude: 39.8561,
223
303
  longitude: -104.6737,
224
304
  name: "Denver International",
225
- tz: "America/Denver"
305
+ tz: "America/Denver",
306
+ venues: [
307
+ "kalshi",
308
+ "polymarket"
309
+ ]
226
310
  },
227
311
  {
228
312
  code: "DFW",
@@ -232,7 +316,25 @@ var mostlyright = (() => {
232
316
  latitude: 32.8998,
233
317
  longitude: -97.0403,
234
318
  name: "Dallas-Fort Worth International",
235
- tz: "America/Chicago"
319
+ tz: "America/Chicago",
320
+ venues: [
321
+ "kalshi",
322
+ "polymarket"
323
+ ]
324
+ },
325
+ {
326
+ code: "DTW",
327
+ country: "US",
328
+ ghcnh_id: "USW00094847",
329
+ icao: "KDTW",
330
+ latitude: 42.2124,
331
+ longitude: -83.3534,
332
+ name: "Detroit Metropolitan Wayne County",
333
+ tz: "America/New_York",
334
+ venues: [
335
+ "kalshi",
336
+ "polymarket"
337
+ ]
236
338
  },
237
339
  {
238
340
  code: "HOU",
@@ -242,7 +344,22 @@ var mostlyright = (() => {
242
344
  latitude: 29.6454,
243
345
  longitude: -95.2789,
244
346
  name: "Houston Hobby",
245
- tz: "America/Chicago"
347
+ tz: "America/Chicago",
348
+ venues: []
349
+ },
350
+ {
351
+ code: "IAH",
352
+ country: "US",
353
+ ghcnh_id: "USW00012960",
354
+ icao: "KIAH",
355
+ latitude: 29.9844,
356
+ longitude: -95.3414,
357
+ name: "Houston George Bush Intercontinental",
358
+ tz: "America/Chicago",
359
+ venues: [
360
+ "kalshi",
361
+ "polymarket"
362
+ ]
246
363
  },
247
364
  {
248
365
  code: "LAS",
@@ -252,7 +369,10 @@ var mostlyright = (() => {
252
369
  latitude: 36.084,
253
370
  longitude: -115.1537,
254
371
  name: "Harry Reid (McCarran) International",
255
- tz: "America/Los_Angeles"
372
+ tz: "America/Los_Angeles",
373
+ venues: [
374
+ "kalshi"
375
+ ]
256
376
  },
257
377
  {
258
378
  code: "LAX",
@@ -262,7 +382,11 @@ var mostlyright = (() => {
262
382
  latitude: 33.9425,
263
383
  longitude: -118.4081,
264
384
  name: "Los Angeles International",
265
- tz: "America/Los_Angeles"
385
+ tz: "America/Los_Angeles",
386
+ venues: [
387
+ "kalshi",
388
+ "polymarket"
389
+ ]
266
390
  },
267
391
  {
268
392
  code: "MDW",
@@ -272,7 +396,10 @@ var mostlyright = (() => {
272
396
  latitude: 41.7868,
273
397
  longitude: -87.7522,
274
398
  name: "Chicago Midway International",
275
- tz: "America/Chicago"
399
+ tz: "America/Chicago",
400
+ venues: [
401
+ "kalshi"
402
+ ]
276
403
  },
277
404
  {
278
405
  code: "MIA",
@@ -282,7 +409,11 @@ var mostlyright = (() => {
282
409
  latitude: 25.7959,
283
410
  longitude: -80.287,
284
411
  name: "Miami International",
285
- tz: "America/New_York"
412
+ tz: "America/New_York",
413
+ venues: [
414
+ "kalshi",
415
+ "polymarket"
416
+ ]
286
417
  },
287
418
  {
288
419
  code: "MSP",
@@ -292,7 +423,11 @@ var mostlyright = (() => {
292
423
  latitude: 44.8848,
293
424
  longitude: -93.2223,
294
425
  name: "Minneapolis-St Paul International",
295
- tz: "America/Chicago"
426
+ tz: "America/Chicago",
427
+ venues: [
428
+ "kalshi",
429
+ "polymarket"
430
+ ]
296
431
  },
297
432
  {
298
433
  code: "MSY",
@@ -302,7 +437,8 @@ var mostlyright = (() => {
302
437
  latitude: 29.9934,
303
438
  longitude: -90.258,
304
439
  name: "New Orleans Louis Armstrong International",
305
- tz: "America/Chicago"
440
+ tz: "America/Chicago",
441
+ venues: []
306
442
  },
307
443
  {
308
444
  code: "NYC",
@@ -312,7 +448,10 @@ var mostlyright = (() => {
312
448
  latitude: 40.7789,
313
449
  longitude: -73.9692,
314
450
  name: "Central Park, New York",
315
- tz: "America/New_York"
451
+ tz: "America/New_York",
452
+ venues: [
453
+ "kalshi"
454
+ ]
316
455
  },
317
456
  {
318
457
  code: "OKC",
@@ -322,7 +461,8 @@ var mostlyright = (() => {
322
461
  latitude: 35.3931,
323
462
  longitude: -97.6007,
324
463
  name: "Oklahoma City Will Rogers World",
325
- tz: "America/Chicago"
464
+ tz: "America/Chicago",
465
+ venues: []
326
466
  },
327
467
  {
328
468
  code: "PHL",
@@ -332,7 +472,11 @@ var mostlyright = (() => {
332
472
  latitude: 39.8721,
333
473
  longitude: -75.2411,
334
474
  name: "Philadelphia International",
335
- tz: "America/New_York"
475
+ tz: "America/New_York",
476
+ venues: [
477
+ "kalshi",
478
+ "polymarket"
479
+ ]
336
480
  },
337
481
  {
338
482
  code: "PHX",
@@ -342,7 +486,11 @@ var mostlyright = (() => {
342
486
  latitude: 33.4373,
343
487
  longitude: -112.0078,
344
488
  name: "Phoenix Sky Harbor International",
345
- tz: "America/Phoenix"
489
+ tz: "America/Phoenix",
490
+ venues: [
491
+ "kalshi",
492
+ "polymarket"
493
+ ]
346
494
  },
347
495
  {
348
496
  code: "SAT",
@@ -352,7 +500,8 @@ var mostlyright = (() => {
352
500
  latitude: 29.5337,
353
501
  longitude: -98.4698,
354
502
  name: "San Antonio International",
355
- tz: "America/Chicago"
503
+ tz: "America/Chicago",
504
+ venues: []
356
505
  },
357
506
  {
358
507
  code: "SEA",
@@ -362,7 +511,11 @@ var mostlyright = (() => {
362
511
  latitude: 47.4502,
363
512
  longitude: -122.3088,
364
513
  name: "Seattle-Tacoma International",
365
- tz: "America/Los_Angeles"
514
+ tz: "America/Los_Angeles",
515
+ venues: [
516
+ "kalshi",
517
+ "polymarket"
518
+ ]
366
519
  },
367
520
  {
368
521
  code: "SFO",
@@ -372,7 +525,24 @@ var mostlyright = (() => {
372
525
  latitude: 37.6213,
373
526
  longitude: -122.379,
374
527
  name: "San Francisco International",
375
- tz: "America/Los_Angeles"
528
+ tz: "America/Los_Angeles",
529
+ venues: [
530
+ "kalshi",
531
+ "polymarket"
532
+ ]
533
+ },
534
+ {
535
+ code: "SLC",
536
+ country: "US",
537
+ ghcnh_id: "USW00024127",
538
+ icao: "KSLC",
539
+ latitude: 40.7884,
540
+ longitude: -111.9778,
541
+ name: "Salt Lake City International",
542
+ tz: "America/Denver",
543
+ venues: [
544
+ "kalshi"
545
+ ]
376
546
  },
377
547
  {
378
548
  code: "LEBL",
@@ -382,7 +552,10 @@ var mostlyright = (() => {
382
552
  latitude: 41.2974,
383
553
  longitude: 2.0833,
384
554
  name: "Barcelona El Prat",
385
- tz: "Europe/Madrid"
555
+ tz: "Europe/Madrid",
556
+ venues: [
557
+ "polymarket"
558
+ ]
386
559
  },
387
560
  {
388
561
  code: "LEMD",
@@ -392,7 +565,10 @@ var mostlyright = (() => {
392
565
  latitude: 40.4719,
393
566
  longitude: -3.5626,
394
567
  name: "Madrid Barajas",
395
- tz: "Europe/Madrid"
568
+ tz: "Europe/Madrid",
569
+ venues: [
570
+ "polymarket"
571
+ ]
396
572
  },
397
573
  {
398
574
  code: "LFPB",
@@ -402,7 +578,10 @@ var mostlyright = (() => {
402
578
  latitude: 48.9694,
403
579
  longitude: 2.4414,
404
580
  name: "Paris Le Bourget",
405
- tz: "Europe/Paris"
581
+ tz: "Europe/Paris",
582
+ venues: [
583
+ "polymarket"
584
+ ]
406
585
  },
407
586
  {
408
587
  code: "LFPG",
@@ -412,7 +591,10 @@ var mostlyright = (() => {
412
591
  latitude: 49.0097,
413
592
  longitude: 2.5479,
414
593
  name: "Paris Charles de Gaulle",
415
- tz: "Europe/Paris"
594
+ tz: "Europe/Paris",
595
+ venues: [
596
+ "polymarket"
597
+ ]
416
598
  },
417
599
  {
418
600
  code: "LFPO",
@@ -422,7 +604,10 @@ var mostlyright = (() => {
422
604
  latitude: 48.7233,
423
605
  longitude: 2.3794,
424
606
  name: "Paris Orly",
425
- tz: "Europe/Paris"
607
+ tz: "Europe/Paris",
608
+ venues: [
609
+ "polymarket"
610
+ ]
426
611
  },
427
612
  {
428
613
  code: "LIMC",
@@ -432,7 +617,10 @@ var mostlyright = (() => {
432
617
  latitude: 45.6306,
433
618
  longitude: 8.7281,
434
619
  name: "Milan Malpensa",
435
- tz: "Europe/Rome"
620
+ tz: "Europe/Rome",
621
+ venues: [
622
+ "polymarket"
623
+ ]
436
624
  },
437
625
  {
438
626
  code: "LIRF",
@@ -442,7 +630,10 @@ var mostlyright = (() => {
442
630
  latitude: 41.8003,
443
631
  longitude: 12.2389,
444
632
  name: "Rome Fiumicino",
445
- tz: "Europe/Rome"
633
+ tz: "Europe/Rome",
634
+ venues: [
635
+ "polymarket"
636
+ ]
446
637
  },
447
638
  {
448
639
  code: "LOWW",
@@ -452,7 +643,10 @@ var mostlyright = (() => {
452
643
  latitude: 48.1103,
453
644
  longitude: 16.5697,
454
645
  name: "Vienna International",
455
- tz: "Europe/Vienna"
646
+ tz: "Europe/Vienna",
647
+ venues: [
648
+ "polymarket"
649
+ ]
456
650
  },
457
651
  {
458
652
  code: "LSZH",
@@ -462,7 +656,10 @@ var mostlyright = (() => {
462
656
  latitude: 47.4647,
463
657
  longitude: 8.5492,
464
658
  name: "Zurich",
465
- tz: "Europe/Zurich"
659
+ tz: "Europe/Zurich",
660
+ venues: [
661
+ "polymarket"
662
+ ]
466
663
  },
467
664
  {
468
665
  code: "NZAA",
@@ -472,7 +669,10 @@ var mostlyright = (() => {
472
669
  latitude: -37.0081,
473
670
  longitude: 174.7917,
474
671
  name: "Auckland",
475
- tz: "Pacific/Auckland"
672
+ tz: "Pacific/Auckland",
673
+ venues: [
674
+ "polymarket"
675
+ ]
476
676
  },
477
677
  {
478
678
  code: "NZWN",
@@ -482,7 +682,10 @@ var mostlyright = (() => {
482
682
  latitude: -41.3272,
483
683
  longitude: 174.8053,
484
684
  name: "Wellington",
485
- tz: "Pacific/Auckland"
685
+ tz: "Pacific/Auckland",
686
+ venues: [
687
+ "polymarket"
688
+ ]
486
689
  },
487
690
  {
488
691
  code: "OERK",
@@ -492,7 +695,10 @@ var mostlyright = (() => {
492
695
  latitude: 24.9576,
493
696
  longitude: 46.6988,
494
697
  name: "Riyadh King Khalid International",
495
- tz: "Asia/Riyadh"
698
+ tz: "Asia/Riyadh",
699
+ venues: [
700
+ "polymarket"
701
+ ]
496
702
  },
497
703
  {
498
704
  code: "OMDB",
@@ -502,7 +708,10 @@ var mostlyright = (() => {
502
708
  latitude: 25.2532,
503
709
  longitude: 55.3657,
504
710
  name: "Dubai International",
505
- tz: "Asia/Dubai"
711
+ tz: "Asia/Dubai",
712
+ venues: [
713
+ "polymarket"
714
+ ]
506
715
  },
507
716
  {
508
717
  code: "OTHH",
@@ -512,7 +721,10 @@ var mostlyright = (() => {
512
721
  latitude: 25.2731,
513
722
  longitude: 51.608,
514
723
  name: "Doha Hamad International",
515
- tz: "Asia/Qatar"
724
+ tz: "Asia/Qatar",
725
+ venues: [
726
+ "polymarket"
727
+ ]
516
728
  },
517
729
  {
518
730
  code: "RCTP",
@@ -522,7 +734,10 @@ var mostlyright = (() => {
522
734
  latitude: 25.0777,
523
735
  longitude: 121.2328,
524
736
  name: "Taipei Taoyuan",
525
- tz: "Asia/Taipei"
737
+ tz: "Asia/Taipei",
738
+ venues: [
739
+ "polymarket"
740
+ ]
526
741
  },
527
742
  {
528
743
  code: "RJAA",
@@ -532,7 +747,10 @@ var mostlyright = (() => {
532
747
  latitude: 35.7647,
533
748
  longitude: 140.3864,
534
749
  name: "Tokyo Narita",
535
- tz: "Asia/Tokyo"
750
+ tz: "Asia/Tokyo",
751
+ venues: [
752
+ "polymarket"
753
+ ]
536
754
  },
537
755
  {
538
756
  code: "RJTT",
@@ -542,7 +760,10 @@ var mostlyright = (() => {
542
760
  latitude: 35.5522,
543
761
  longitude: 139.78,
544
762
  name: "Tokyo Haneda",
545
- tz: "Asia/Tokyo"
763
+ tz: "Asia/Tokyo",
764
+ venues: [
765
+ "polymarket"
766
+ ]
546
767
  },
547
768
  {
548
769
  code: "RKSI",
@@ -552,7 +773,10 @@ var mostlyright = (() => {
552
773
  latitude: 37.4691,
553
774
  longitude: 126.4505,
554
775
  name: "Seoul Incheon",
555
- tz: "Asia/Seoul"
776
+ tz: "Asia/Seoul",
777
+ venues: [
778
+ "polymarket"
779
+ ]
556
780
  },
557
781
  {
558
782
  code: "SAEZ",
@@ -562,7 +786,10 @@ var mostlyright = (() => {
562
786
  latitude: -34.8222,
563
787
  longitude: -58.5358,
564
788
  name: "Buenos Aires Ezeiza",
565
- tz: "America/Argentina/Buenos_Aires"
789
+ tz: "America/Argentina/Buenos_Aires",
790
+ venues: [
791
+ "polymarket"
792
+ ]
566
793
  },
567
794
  {
568
795
  code: "SBGR",
@@ -572,7 +799,10 @@ var mostlyright = (() => {
572
799
  latitude: -23.4356,
573
800
  longitude: -46.4731,
574
801
  name: "S\xE3o Paulo Guarulhos",
575
- tz: "America/Sao_Paulo"
802
+ tz: "America/Sao_Paulo",
803
+ venues: [
804
+ "polymarket"
805
+ ]
576
806
  },
577
807
  {
578
808
  code: "UUEE",
@@ -582,7 +812,10 @@ var mostlyright = (() => {
582
812
  latitude: 55.9728,
583
813
  longitude: 37.4147,
584
814
  name: "Moscow Sheremetyevo",
585
- tz: "Europe/Moscow"
815
+ tz: "Europe/Moscow",
816
+ venues: [
817
+ "polymarket"
818
+ ]
586
819
  },
587
820
  {
588
821
  code: "VABB",
@@ -592,7 +825,10 @@ var mostlyright = (() => {
592
825
  latitude: 19.0887,
593
826
  longitude: 72.8679,
594
827
  name: "Mumbai Chhatrapati Shivaji",
595
- tz: "Asia/Kolkata"
828
+ tz: "Asia/Kolkata",
829
+ venues: [
830
+ "polymarket"
831
+ ]
596
832
  },
597
833
  {
598
834
  code: "VHHH",
@@ -602,7 +838,10 @@ var mostlyright = (() => {
602
838
  latitude: 22.308,
603
839
  longitude: 113.9185,
604
840
  name: "Hong Kong International",
605
- tz: "Asia/Hong_Kong"
841
+ tz: "Asia/Hong_Kong",
842
+ venues: [
843
+ "polymarket"
844
+ ]
606
845
  },
607
846
  {
608
847
  code: "VIDP",
@@ -612,7 +851,10 @@ var mostlyright = (() => {
612
851
  latitude: 28.5562,
613
852
  longitude: 77.1,
614
853
  name: "Delhi Indira Gandhi",
615
- tz: "Asia/Kolkata"
854
+ tz: "Asia/Kolkata",
855
+ venues: [
856
+ "polymarket"
857
+ ]
616
858
  },
617
859
  {
618
860
  code: "VTBS",
@@ -622,7 +864,10 @@ var mostlyright = (() => {
622
864
  latitude: 13.69,
623
865
  longitude: 100.7501,
624
866
  name: "Bangkok Suvarnabhumi",
625
- tz: "Asia/Bangkok"
867
+ tz: "Asia/Bangkok",
868
+ venues: [
869
+ "polymarket"
870
+ ]
626
871
  },
627
872
  {
628
873
  code: "WSSS",
@@ -632,7 +877,10 @@ var mostlyright = (() => {
632
877
  latitude: 1.3644,
633
878
  longitude: 103.9915,
634
879
  name: "Singapore Changi",
635
- tz: "Asia/Singapore"
880
+ tz: "Asia/Singapore",
881
+ venues: [
882
+ "polymarket"
883
+ ]
636
884
  },
637
885
  {
638
886
  code: "YBBN",
@@ -642,7 +890,10 @@ var mostlyright = (() => {
642
890
  latitude: -27.3842,
643
891
  longitude: 153.1175,
644
892
  name: "Brisbane",
645
- tz: "Australia/Brisbane"
893
+ tz: "Australia/Brisbane",
894
+ venues: [
895
+ "polymarket"
896
+ ]
646
897
  },
647
898
  {
648
899
  code: "YMML",
@@ -652,7 +903,10 @@ var mostlyright = (() => {
652
903
  latitude: -37.6733,
653
904
  longitude: 144.8433,
654
905
  name: "Melbourne Tullamarine",
655
- tz: "Australia/Melbourne"
906
+ tz: "Australia/Melbourne",
907
+ venues: [
908
+ "polymarket"
909
+ ]
656
910
  },
657
911
  {
658
912
  code: "YSSY",
@@ -662,7 +916,10 @@ var mostlyright = (() => {
662
916
  latitude: -33.9461,
663
917
  longitude: 151.1772,
664
918
  name: "Sydney Kingsford Smith",
665
- tz: "Australia/Sydney"
919
+ tz: "Australia/Sydney",
920
+ venues: [
921
+ "polymarket"
922
+ ]
666
923
  },
667
924
  {
668
925
  code: "ZBAA",
@@ -672,7 +929,10 @@ var mostlyright = (() => {
672
929
  latitude: 40.0801,
673
930
  longitude: 116.5846,
674
931
  name: "Beijing Capital",
675
- tz: "Asia/Shanghai"
932
+ tz: "Asia/Shanghai",
933
+ venues: [
934
+ "polymarket"
935
+ ]
676
936
  },
677
937
  {
678
938
  code: "ZSPD",
@@ -682,16 +942,22 @@ var mostlyright = (() => {
682
942
  latitude: 31.1443,
683
943
  longitude: 121.8083,
684
944
  name: "Shanghai Pudong",
685
- tz: "Asia/Shanghai"
945
+ tz: "Asia/Shanghai",
946
+ venues: [
947
+ "polymarket"
948
+ ]
686
949
  }
687
950
  ];
688
951
  STATION_BY_CODE = /* @__PURE__ */ new Map([
689
952
  ["ATL", STATIONS[10]],
690
953
  ["AUS", STATIONS[11]],
691
- ["BOS", STATIONS[12]],
692
- ["DCA", STATIONS[13]],
693
- ["DEN", STATIONS[14]],
694
- ["DFW", STATIONS[15]],
954
+ ["BNA", STATIONS[12]],
955
+ ["BOS", STATIONS[13]],
956
+ ["CVG", STATIONS[14]],
957
+ ["DCA", STATIONS[15]],
958
+ ["DEN", STATIONS[16]],
959
+ ["DFW", STATIONS[17]],
960
+ ["DTW", STATIONS[18]],
695
961
  ["EDDB", STATIONS[0]],
696
962
  ["EDDF", STATIONS[1]],
697
963
  ["EDDM", STATIONS[2]],
@@ -702,51 +968,53 @@ var mostlyright = (() => {
702
968
  ["EKCH", STATIONS[7]],
703
969
  ["EPWA", STATIONS[8]],
704
970
  ["ESSA", STATIONS[9]],
705
- ["HOU", STATIONS[16]],
706
- ["LAS", STATIONS[17]],
707
- ["LAX", STATIONS[18]],
708
- ["LEBL", STATIONS[30]],
709
- ["LEMD", STATIONS[31]],
710
- ["LFPB", STATIONS[32]],
711
- ["LFPG", STATIONS[33]],
712
- ["LFPO", STATIONS[34]],
713
- ["LIMC", STATIONS[35]],
714
- ["LIRF", STATIONS[36]],
715
- ["LOWW", STATIONS[37]],
716
- ["LSZH", STATIONS[38]],
717
- ["MDW", STATIONS[19]],
718
- ["MIA", STATIONS[20]],
719
- ["MSP", STATIONS[21]],
720
- ["MSY", STATIONS[22]],
721
- ["NYC", STATIONS[23]],
722
- ["NZAA", STATIONS[39]],
723
- ["NZWN", STATIONS[40]],
724
- ["OERK", STATIONS[41]],
725
- ["OKC", STATIONS[24]],
726
- ["OMDB", STATIONS[42]],
727
- ["OTHH", STATIONS[43]],
728
- ["PHL", STATIONS[25]],
729
- ["PHX", STATIONS[26]],
730
- ["RCTP", STATIONS[44]],
731
- ["RJAA", STATIONS[45]],
732
- ["RJTT", STATIONS[46]],
733
- ["RKSI", STATIONS[47]],
734
- ["SAEZ", STATIONS[48]],
735
- ["SAT", STATIONS[27]],
736
- ["SBGR", STATIONS[49]],
737
- ["SEA", STATIONS[28]],
738
- ["SFO", STATIONS[29]],
739
- ["UUEE", STATIONS[50]],
740
- ["VABB", STATIONS[51]],
741
- ["VHHH", STATIONS[52]],
742
- ["VIDP", STATIONS[53]],
743
- ["VTBS", STATIONS[54]],
744
- ["WSSS", STATIONS[55]],
745
- ["YBBN", STATIONS[56]],
746
- ["YMML", STATIONS[57]],
747
- ["YSSY", STATIONS[58]],
748
- ["ZBAA", STATIONS[59]],
749
- ["ZSPD", STATIONS[60]]
971
+ ["HOU", STATIONS[19]],
972
+ ["IAH", STATIONS[20]],
973
+ ["LAS", STATIONS[21]],
974
+ ["LAX", STATIONS[22]],
975
+ ["LEBL", STATIONS[35]],
976
+ ["LEMD", STATIONS[36]],
977
+ ["LFPB", STATIONS[37]],
978
+ ["LFPG", STATIONS[38]],
979
+ ["LFPO", STATIONS[39]],
980
+ ["LIMC", STATIONS[40]],
981
+ ["LIRF", STATIONS[41]],
982
+ ["LOWW", STATIONS[42]],
983
+ ["LSZH", STATIONS[43]],
984
+ ["MDW", STATIONS[23]],
985
+ ["MIA", STATIONS[24]],
986
+ ["MSP", STATIONS[25]],
987
+ ["MSY", STATIONS[26]],
988
+ ["NYC", STATIONS[27]],
989
+ ["NZAA", STATIONS[44]],
990
+ ["NZWN", STATIONS[45]],
991
+ ["OERK", STATIONS[46]],
992
+ ["OKC", STATIONS[28]],
993
+ ["OMDB", STATIONS[47]],
994
+ ["OTHH", STATIONS[48]],
995
+ ["PHL", STATIONS[29]],
996
+ ["PHX", STATIONS[30]],
997
+ ["RCTP", STATIONS[49]],
998
+ ["RJAA", STATIONS[50]],
999
+ ["RJTT", STATIONS[51]],
1000
+ ["RKSI", STATIONS[52]],
1001
+ ["SAEZ", STATIONS[53]],
1002
+ ["SAT", STATIONS[31]],
1003
+ ["SBGR", STATIONS[54]],
1004
+ ["SEA", STATIONS[32]],
1005
+ ["SFO", STATIONS[33]],
1006
+ ["SLC", STATIONS[34]],
1007
+ ["UUEE", STATIONS[55]],
1008
+ ["VABB", STATIONS[56]],
1009
+ ["VHHH", STATIONS[57]],
1010
+ ["VIDP", STATIONS[58]],
1011
+ ["VTBS", STATIONS[59]],
1012
+ ["WSSS", STATIONS[60]],
1013
+ ["YBBN", STATIONS[61]],
1014
+ ["YMML", STATIONS[62]],
1015
+ ["YSSY", STATIONS[63]],
1016
+ ["ZBAA", STATIONS[64]],
1017
+ ["ZSPD", STATIONS[65]]
750
1018
  ]);
751
1019
  STATION_BY_ICAO = /* @__PURE__ */ new Map([
752
1020
  ["EDDB", STATIONS[0]],
@@ -761,55 +1029,60 @@ var mostlyright = (() => {
761
1029
  ["ESSA", STATIONS[9]],
762
1030
  ["KATL", STATIONS[10]],
763
1031
  ["KAUS", STATIONS[11]],
764
- ["KBOS", STATIONS[12]],
765
- ["KDCA", STATIONS[13]],
766
- ["KDEN", STATIONS[14]],
767
- ["KDFW", STATIONS[15]],
768
- ["KHOU", STATIONS[16]],
769
- ["KLAS", STATIONS[17]],
770
- ["KLAX", STATIONS[18]],
771
- ["KMDW", STATIONS[19]],
772
- ["KMIA", STATIONS[20]],
773
- ["KMSP", STATIONS[21]],
774
- ["KMSY", STATIONS[22]],
775
- ["KNYC", STATIONS[23]],
776
- ["KOKC", STATIONS[24]],
777
- ["KPHL", STATIONS[25]],
778
- ["KPHX", STATIONS[26]],
779
- ["KSAT", STATIONS[27]],
780
- ["KSEA", STATIONS[28]],
781
- ["KSFO", STATIONS[29]],
782
- ["LEBL", STATIONS[30]],
783
- ["LEMD", STATIONS[31]],
784
- ["LFPB", STATIONS[32]],
785
- ["LFPG", STATIONS[33]],
786
- ["LFPO", STATIONS[34]],
787
- ["LIMC", STATIONS[35]],
788
- ["LIRF", STATIONS[36]],
789
- ["LOWW", STATIONS[37]],
790
- ["LSZH", STATIONS[38]],
791
- ["NZAA", STATIONS[39]],
792
- ["NZWN", STATIONS[40]],
793
- ["OERK", STATIONS[41]],
794
- ["OMDB", STATIONS[42]],
795
- ["OTHH", STATIONS[43]],
796
- ["RCTP", STATIONS[44]],
797
- ["RJAA", STATIONS[45]],
798
- ["RJTT", STATIONS[46]],
799
- ["RKSI", STATIONS[47]],
800
- ["SAEZ", STATIONS[48]],
801
- ["SBGR", STATIONS[49]],
802
- ["UUEE", STATIONS[50]],
803
- ["VABB", STATIONS[51]],
804
- ["VHHH", STATIONS[52]],
805
- ["VIDP", STATIONS[53]],
806
- ["VTBS", STATIONS[54]],
807
- ["WSSS", STATIONS[55]],
808
- ["YBBN", STATIONS[56]],
809
- ["YMML", STATIONS[57]],
810
- ["YSSY", STATIONS[58]],
811
- ["ZBAA", STATIONS[59]],
812
- ["ZSPD", STATIONS[60]]
1032
+ ["KBNA", STATIONS[12]],
1033
+ ["KBOS", STATIONS[13]],
1034
+ ["KCVG", STATIONS[14]],
1035
+ ["KDCA", STATIONS[15]],
1036
+ ["KDEN", STATIONS[16]],
1037
+ ["KDFW", STATIONS[17]],
1038
+ ["KDTW", STATIONS[18]],
1039
+ ["KHOU", STATIONS[19]],
1040
+ ["KIAH", STATIONS[20]],
1041
+ ["KLAS", STATIONS[21]],
1042
+ ["KLAX", STATIONS[22]],
1043
+ ["KMDW", STATIONS[23]],
1044
+ ["KMIA", STATIONS[24]],
1045
+ ["KMSP", STATIONS[25]],
1046
+ ["KMSY", STATIONS[26]],
1047
+ ["KNYC", STATIONS[27]],
1048
+ ["KOKC", STATIONS[28]],
1049
+ ["KPHL", STATIONS[29]],
1050
+ ["KPHX", STATIONS[30]],
1051
+ ["KSAT", STATIONS[31]],
1052
+ ["KSEA", STATIONS[32]],
1053
+ ["KSFO", STATIONS[33]],
1054
+ ["KSLC", STATIONS[34]],
1055
+ ["LEBL", STATIONS[35]],
1056
+ ["LEMD", STATIONS[36]],
1057
+ ["LFPB", STATIONS[37]],
1058
+ ["LFPG", STATIONS[38]],
1059
+ ["LFPO", STATIONS[39]],
1060
+ ["LIMC", STATIONS[40]],
1061
+ ["LIRF", STATIONS[41]],
1062
+ ["LOWW", STATIONS[42]],
1063
+ ["LSZH", STATIONS[43]],
1064
+ ["NZAA", STATIONS[44]],
1065
+ ["NZWN", STATIONS[45]],
1066
+ ["OERK", STATIONS[46]],
1067
+ ["OMDB", STATIONS[47]],
1068
+ ["OTHH", STATIONS[48]],
1069
+ ["RCTP", STATIONS[49]],
1070
+ ["RJAA", STATIONS[50]],
1071
+ ["RJTT", STATIONS[51]],
1072
+ ["RKSI", STATIONS[52]],
1073
+ ["SAEZ", STATIONS[53]],
1074
+ ["SBGR", STATIONS[54]],
1075
+ ["UUEE", STATIONS[55]],
1076
+ ["VABB", STATIONS[56]],
1077
+ ["VHHH", STATIONS[57]],
1078
+ ["VIDP", STATIONS[58]],
1079
+ ["VTBS", STATIONS[59]],
1080
+ ["WSSS", STATIONS[60]],
1081
+ ["YBBN", STATIONS[61]],
1082
+ ["YMML", STATIONS[62]],
1083
+ ["YSSY", STATIONS[63]],
1084
+ ["ZBAA", STATIONS[64]],
1085
+ ["ZSPD", STATIONS[65]]
813
1086
  ]);
814
1087
  }
815
1088
  });
@@ -962,13 +1235,13 @@ var mostlyright = (() => {
962
1235
  }
963
1236
  return { _repr_only: true, value: String(value) };
964
1237
  }
965
- var TradewindsError, SourceUnavailableError, SchemaValidationError, SourceMismatchError, LeakageError, TemporalDriftError, PayloadTooLargeError, DeferredMarketError, PolymarketEventError, TherminalError, NotFoundError, RateLimitError, ValidationError, AuthenticationError, ForbiddenError, ServerError, LiveStreamError, NoLiveDataError;
1238
+ var MostlyRightError, SourceUnavailableError, DATA_AVAILABILITY_REASONS, DataAvailabilityError, NwpNotAvailableError, SchemaValidationError, SourceMismatchError, LeakageError, IssuedAtMissingError, OpenMeteoSeamlessLeakageError, TemporalDriftError, PayloadTooLargeError, DeferredMarketError, PolymarketEventError, TherminalError, NotFoundError, RateLimitError, ValidationError, AuthenticationError, ForbiddenError, ServerError, LiveStreamError, NoLiveDataError;
966
1239
  var init_exceptions = __esm({
967
1240
  "../core/src/exceptions/index.ts"() {
968
1241
  "use strict";
969
- TradewindsError = class extends Error {
1242
+ MostlyRightError = class extends Error {
970
1243
  /** Subclass override — the stable string enum surfaced via `errorCode`. */
971
- static defaultErrorCode = "TRADEWINDS_ERROR";
1244
+ static defaultErrorCode = "MOSTLYRIGHT_ERROR";
972
1245
  errorCode;
973
1246
  source;
974
1247
  requestId;
@@ -1000,7 +1273,7 @@ var mostlyright = (() => {
1000
1273
  return safe;
1001
1274
  }
1002
1275
  };
1003
- SourceUnavailableError = class extends TradewindsError {
1276
+ SourceUnavailableError = class extends MostlyRightError {
1004
1277
  static defaultErrorCode = "SOURCE_UNAVAILABLE";
1005
1278
  httpStatus;
1006
1279
  retryable;
@@ -1026,7 +1299,66 @@ var mostlyright = (() => {
1026
1299
  };
1027
1300
  }
1028
1301
  };
1029
- SchemaValidationError = class extends TradewindsError {
1302
+ DATA_AVAILABILITY_REASONS = [
1303
+ "model_unavailable",
1304
+ "out_of_window",
1305
+ "cache_miss",
1306
+ "source_404",
1307
+ "source_5xx",
1308
+ "rate_limited"
1309
+ ];
1310
+ DataAvailabilityError = class extends MostlyRightError {
1311
+ static defaultErrorCode = "DATA_AVAILABILITY";
1312
+ reason;
1313
+ hint;
1314
+ constructor(options) {
1315
+ if (!DATA_AVAILABILITY_REASONS.includes(options.reason)) {
1316
+ throw new RangeError(
1317
+ `DataAvailabilityError: unknown reason "${String(options.reason)}". Valid reasons: ${DATA_AVAILABILITY_REASONS.join(", ")}`
1318
+ );
1319
+ }
1320
+ if (typeof options.hint !== "string" || options.hint.length === 0) {
1321
+ throw new TypeError("DataAvailabilityError: hint is required and must be a non-empty string");
1322
+ }
1323
+ const message = `[${options.reason}] ${options.hint}`;
1324
+ super(message, options);
1325
+ this.reason = options.reason;
1326
+ this.hint = options.hint;
1327
+ }
1328
+ payload() {
1329
+ return {
1330
+ ...super.payload(),
1331
+ reason: this.reason,
1332
+ hint: this.hint
1333
+ };
1334
+ }
1335
+ };
1336
+ NwpNotAvailableError = class extends DataAvailabilityError {
1337
+ static defaultErrorCode = "NWP_NOT_AVAILABLE";
1338
+ station;
1339
+ model;
1340
+ constructor(options) {
1341
+ const parentOpts = {
1342
+ reason: "model_unavailable",
1343
+ hint: options.hint,
1344
+ source: options.source ?? `nwp.${options.model}`
1345
+ };
1346
+ if (options.requestId !== void 0 && options.requestId !== null) {
1347
+ parentOpts.requestId = options.requestId;
1348
+ }
1349
+ super(parentOpts);
1350
+ this.station = options.station;
1351
+ this.model = options.model;
1352
+ }
1353
+ payload() {
1354
+ return {
1355
+ ...super.payload(),
1356
+ station: this.station,
1357
+ model: this.model
1358
+ };
1359
+ }
1360
+ };
1361
+ SchemaValidationError = class extends MostlyRightError {
1030
1362
  static defaultErrorCode = "SCHEMA_VALIDATION_FAILED";
1031
1363
  schemaId;
1032
1364
  violations;
@@ -1049,7 +1381,7 @@ var mostlyright = (() => {
1049
1381
  };
1050
1382
  }
1051
1383
  };
1052
- SourceMismatchError = class extends TradewindsError {
1384
+ SourceMismatchError = class extends MostlyRightError {
1053
1385
  static defaultErrorCode = "SOURCE_MISMATCH";
1054
1386
  /** Canonical role-name vocabulary (design.md §R). */
1055
1387
  static VALID_ROLES = /* @__PURE__ */ new Set([
@@ -1078,7 +1410,7 @@ var mostlyright = (() => {
1078
1410
  };
1079
1411
  }
1080
1412
  };
1081
- LeakageError = class extends TradewindsError {
1413
+ LeakageError = class extends MostlyRightError {
1082
1414
  static defaultErrorCode = "LEAKAGE_DETECTED";
1083
1415
  asOf;
1084
1416
  violatingCount;
@@ -1098,7 +1430,50 @@ var mostlyright = (() => {
1098
1430
  };
1099
1431
  }
1100
1432
  };
1101
- TemporalDriftError = class extends TradewindsError {
1433
+ IssuedAtMissingError = class extends SchemaValidationError {
1434
+ static defaultErrorCode = "ISSUED_AT_MISSING";
1435
+ violatingCountRows;
1436
+ constructor(message, options = {}) {
1437
+ super(message, {
1438
+ ...options,
1439
+ schemaId: "schema.forecast.station.v1",
1440
+ violations: [{ column: "issued_at", rule: "non_null" }]
1441
+ });
1442
+ this.violatingCountRows = options.violatingCount ?? 0;
1443
+ }
1444
+ payload() {
1445
+ return {
1446
+ ...super.payload(),
1447
+ name: "IssuedAtMissingError",
1448
+ violating_count: this.violatingCountRows,
1449
+ origin_issue: "Tarabcak/mostlyright#70"
1450
+ };
1451
+ }
1452
+ };
1453
+ OpenMeteoSeamlessLeakageError = class extends LeakageError {
1454
+ static defaultErrorCode = "OPEN_METEO_SEAMLESS_LEAKAGE";
1455
+ model;
1456
+ endpointUrl;
1457
+ constructor(message, options) {
1458
+ super(message, {
1459
+ ...options,
1460
+ asOf: options.asOf ?? "(seamless-endpoint-refused-before-fetch)",
1461
+ violatingCount: 0
1462
+ });
1463
+ this.model = options.model;
1464
+ this.endpointUrl = options.endpointUrl;
1465
+ }
1466
+ payload() {
1467
+ return {
1468
+ ...super.payload(),
1469
+ name: "OpenMeteoSeamlessLeakageError",
1470
+ model: this.model,
1471
+ endpoint_url: this.endpointUrl,
1472
+ origin_issue: "Tarabcak/mostlyright#70"
1473
+ };
1474
+ }
1475
+ };
1476
+ TemporalDriftError = class extends MostlyRightError {
1102
1477
  static defaultErrorCode = "TEMPORAL_DRIFT";
1103
1478
  schemaId;
1104
1479
  assertedRange;
@@ -1121,7 +1496,7 @@ var mostlyright = (() => {
1121
1496
  };
1122
1497
  }
1123
1498
  };
1124
- PayloadTooLargeError = class extends TradewindsError {
1499
+ PayloadTooLargeError = class extends MostlyRightError {
1125
1500
  static defaultErrorCode = "PAYLOAD_TOO_LARGE";
1126
1501
  declaredSize;
1127
1502
  limit;
@@ -1141,13 +1516,13 @@ var mostlyright = (() => {
1141
1516
  };
1142
1517
  }
1143
1518
  };
1144
- DeferredMarketError = class extends TradewindsError {
1519
+ DeferredMarketError = class extends MostlyRightError {
1145
1520
  static defaultErrorCode = "DEFERRED_MARKET";
1146
1521
  };
1147
- PolymarketEventError = class extends TradewindsError {
1522
+ PolymarketEventError = class extends MostlyRightError {
1148
1523
  static defaultErrorCode = "POLYMARKET_EVENT_INVALID";
1149
1524
  };
1150
- TherminalError = class extends TradewindsError {
1525
+ TherminalError = class extends MostlyRightError {
1151
1526
  static defaultErrorCode = "HTTP_ERROR";
1152
1527
  statusCode;
1153
1528
  constructor(message, options = {}) {
@@ -1206,13 +1581,13 @@ var mostlyright = (() => {
1206
1581
  super(message, { ...options, statusCode: options.statusCode ?? 500 });
1207
1582
  }
1208
1583
  };
1209
- LiveStreamError = class extends TradewindsError {
1584
+ LiveStreamError = class extends MostlyRightError {
1210
1585
  static defaultErrorCode = "LIVE_STREAM_ERROR";
1211
1586
  };
1212
1587
  NoLiveDataError = class extends LiveStreamError {
1213
1588
  static defaultErrorCode = "NO_LIVE_DATA";
1214
1589
  station;
1215
- constructor(message = "", options) {
1590
+ constructor(message, options) {
1216
1591
  super(message, { ...options, source: options.source });
1217
1592
  this.station = options.station;
1218
1593
  }
@@ -1470,6 +1845,76 @@ var mostlyright = (() => {
1470
1845
  }
1471
1846
  });
1472
1847
 
1848
+ // ../core/src/stations/index.ts
1849
+ var StationCatalog, CATALOG;
1850
+ var init_stations2 = __esm({
1851
+ "../core/src/stations/index.ts"() {
1852
+ "use strict";
1853
+ init_stations();
1854
+ StationCatalog = class {
1855
+ stations;
1856
+ byCode;
1857
+ byIcao;
1858
+ constructor(stations = STATIONS) {
1859
+ this.stations = stations;
1860
+ if (stations === STATIONS) {
1861
+ this.byCode = STATION_BY_CODE;
1862
+ this.byIcao = STATION_BY_ICAO;
1863
+ } else {
1864
+ const byCode = /* @__PURE__ */ new Map();
1865
+ const byIcao = /* @__PURE__ */ new Map();
1866
+ for (const s of stations) {
1867
+ if (s.code !== null) byCode.set(s.code, s);
1868
+ byIcao.set(s.icao, s);
1869
+ }
1870
+ this.byCode = byCode;
1871
+ this.byIcao = byIcao;
1872
+ }
1873
+ }
1874
+ /**
1875
+ * Return the station for `code` (registry code or ICAO).
1876
+ * @throws if no station matches.
1877
+ */
1878
+ get(code) {
1879
+ const station = this.byCode.get(code) ?? this.byIcao.get(code);
1880
+ if (station === void 0) {
1881
+ throw new Error(
1882
+ `Unknown station ${JSON.stringify(code)}. Expected a registry code (e.g. "NYC", "EGLL") or a 4-letter ICAO (e.g. "KNYC").`
1883
+ );
1884
+ }
1885
+ return station;
1886
+ }
1887
+ /** Stations tagged with `venue` (e.g. "kalshi"), sorted by ICAO. */
1888
+ filterByVenue(venue) {
1889
+ return this.stations.filter((s) => s.venues.includes(venue)).sort((a, b) => a.icao.localeCompare(b.icao));
1890
+ }
1891
+ /** Stations whose ISO 3166-1 alpha-2 `country` matches, sorted by ICAO. */
1892
+ filterByCountry(country) {
1893
+ return this.stations.filter((s) => s.country === country).sort((a, b) => a.icao.localeCompare(b.icao));
1894
+ }
1895
+ /** Union of all venue tags present in the catalog. */
1896
+ venues() {
1897
+ const out = /* @__PURE__ */ new Set();
1898
+ for (const s of this.stations) {
1899
+ for (const v of s.venues) out.add(v);
1900
+ }
1901
+ return out;
1902
+ }
1903
+ /** True iff `code` resolves to a station (by registry code or ICAO). */
1904
+ has(code) {
1905
+ return this.byCode.has(code) || this.byIcao.has(code);
1906
+ }
1907
+ get size() {
1908
+ return this.stations.length;
1909
+ }
1910
+ [Symbol.iterator]() {
1911
+ return this.stations[Symbol.iterator]();
1912
+ }
1913
+ };
1914
+ CATALOG = new StationCatalog();
1915
+ }
1916
+ });
1917
+
1473
1918
  // ../core/src/internal/http.ts
1474
1919
  function sleep(ms, signal) {
1475
1920
  return new Promise((resolve, reject) => {
@@ -1627,15 +2072,22 @@ var mostlyright = (() => {
1627
2072
  var src_exports = {};
1628
2073
  __export(src_exports, {
1629
2074
  AuthenticationError: () => AuthenticationError,
2075
+ CATALOG: () => CATALOG,
1630
2076
  CLIMATE_REPORT_TYPE_PRIORITY: () => CLIMATE_REPORT_TYPE_PRIORITY,
2077
+ DATA_AVAILABILITY_REASONS: () => DATA_AVAILABILITY_REASONS,
2078
+ DataAvailabilityError: () => DataAvailabilityError,
1631
2079
  DeferredMarketError: () => DeferredMarketError,
1632
2080
  ForbiddenError: () => ForbiddenError,
2081
+ IssuedAtMissingError: () => IssuedAtMissingError,
1633
2082
  LIVE_V1_POLICY: () => LIVE_V1_POLICY,
1634
2083
  LeakageError: () => LeakageError,
1635
2084
  LiveStreamError: () => LiveStreamError,
2085
+ MostlyRightError: () => MostlyRightError,
1636
2086
  NoLiveDataError: () => NoLiveDataError,
1637
2087
  NotFoundError: () => NotFoundError,
2088
+ NwpNotAvailableError: () => NwpNotAvailableError,
1638
2089
  OBSERVATION_SOURCE_PRIORITY: () => OBSERVATION_SOURCE_PRIORITY,
2090
+ OpenMeteoSeamlessLeakageError: () => OpenMeteoSeamlessLeakageError,
1639
2091
  PayloadTooLargeError: () => PayloadTooLargeError,
1640
2092
  PolymarketEventError: () => PolymarketEventError,
1641
2093
  QC_ALPHA_RULES: () => QC_ALPHA_RULES,
@@ -1648,9 +2100,9 @@ var mostlyright = (() => {
1648
2100
  ServerError: () => ServerError,
1649
2101
  SourceMismatchError: () => SourceMismatchError,
1650
2102
  SourceUnavailableError: () => SourceUnavailableError,
2103
+ StationCatalog: () => StationCatalog,
1651
2104
  TemporalDriftError: () => TemporalDriftError,
1652
2105
  TherminalError: () => TherminalError,
1653
- TradewindsError: () => TradewindsError,
1654
2106
  ValidationError: () => ValidationError,
1655
2107
  _CLI_PUBLICATION_DELAY_HOURS: () => _CLI_PUBLICATION_DELAY_HOURS,
1656
2108
  _JAN_REF: () => _JAN_REF,
@@ -1679,6 +2131,7 @@ var mostlyright = (() => {
1679
2131
  init_generated2();
1680
2132
  init_exceptions();
1681
2133
  init_snapshot();
2134
+ init_stations2();
1682
2135
  init_http();
1683
2136
  version = "0.0.0";
1684
2137
  }
@@ -2322,8 +2775,8 @@ var mostlyright = (() => {
2322
2775
  const key = header[c];
2323
2776
  row[key] = (cells[c] ?? "").trim();
2324
2777
  }
2325
- const obs = iemToObservation(row, opts);
2326
- if (obs !== null) out.push(obs);
2778
+ const obs2 = iemToObservation(row, opts);
2779
+ if (obs2 !== null) out.push(obs2);
2327
2780
  }
2328
2781
  return out;
2329
2782
  }
@@ -2348,6 +2801,7 @@ var mostlyright = (() => {
2348
2801
  MODE2_SOURCES: () => MODE2_SOURCES,
2349
2802
  NoLiveDataError: () => NoLiveDataError,
2350
2803
  POLITE_FLOORS_S: () => POLITE_FLOORS_S,
2804
+ Preprocessing: () => Preprocessing,
2351
2805
  SELECTOR_NAMES: () => SELECTOR_NAMES,
2352
2806
  SOURCE_ALIASES: () => SOURCE_ALIASES,
2353
2807
  SOURCE_IDENTITY_TAGS: () => SOURCE_IDENTITY_TAGS,
@@ -2356,6 +2810,7 @@ var mostlyright = (() => {
2356
2810
  assertSourceIdentity: () => assertSourceIdentity,
2357
2811
  buildOverrideWarning: () => buildOverrideWarning,
2358
2812
  core: () => src_exports,
2813
+ dailyExtremes: () => dailyExtremes,
2359
2814
  discover: () => discover,
2360
2815
  helloCore: () => helloCore,
2361
2816
  helloMarkets: () => helloMarkets,
@@ -2364,6 +2819,8 @@ var mostlyright = (() => {
2364
2819
  isMode2Source: () => isMode2Source,
2365
2820
  latest: () => latest,
2366
2821
  markets: () => src_exports3,
2822
+ obs: () => obs,
2823
+ preprocessing: () => preprocessing_exports,
2367
2824
  research: () => research,
2368
2825
  researchBySource: () => researchBySource,
2369
2826
  resolveCity: () => resolveCity,
@@ -2395,12 +2852,18 @@ var mostlyright = (() => {
2395
2852
  LiveStreamError: () => LiveStreamError,
2396
2853
  NCEI_POLITE_DELAY_MS: () => NCEI_POLITE_DELAY_MS,
2397
2854
  NoLiveDataError: () => NoLiveDataError,
2855
+ OPEN_METEO_LIVE_URL: () => OPEN_METEO_LIVE_URL,
2856
+ OPEN_METEO_MODELS: () => OPEN_METEO_MODELS,
2857
+ OPEN_METEO_PREVIOUS_RUNS_URL: () => OPEN_METEO_PREVIOUS_RUNS_URL,
2858
+ OPEN_METEO_SEAMLESS_URL: () => OPEN_METEO_SEAMLESS_URL,
2859
+ OPEN_METEO_SINGLE_RUNS_URL: () => OPEN_METEO_SINGLE_RUNS_URL,
2398
2860
  POLITE_FLOORS_S: () => POLITE_FLOORS_S,
2399
2861
  SOURCE_IDENTITY_TAGS: () => SOURCE_IDENTITY_TAGS,
2400
2862
  SSID_COLUMNS: () => SSID_COLUMNS,
2401
2863
  SUPPORTED_SOURCES: () => SUPPORTED_SOURCES,
2402
2864
  awcToObservation: () => awcToObservation,
2403
2865
  buildIemUrl: () => buildIemUrl,
2866
+ dailyExtremes: () => dailyExtremes,
2404
2867
  downloadCli: () => downloadCli,
2405
2868
  downloadCliRange: () => downloadCliRange,
2406
2869
  downloadGhcnh: () => downloadGhcnh,
@@ -2419,12 +2882,15 @@ var mostlyright = (() => {
2419
2882
  latest: () => latest,
2420
2883
  mapCloudCover: () => mapCloudCover,
2421
2884
  mergeClimate: () => mergeClimate,
2885
+ obs: () => obs,
2886
+ openMeteoForecasts: () => openMeteoForecasts,
2422
2887
  parseAwcVisibility: () => parseAwcVisibility,
2423
2888
  parseCliRecord: () => parseCliRecord,
2424
2889
  parseCliResponse: () => parseCliResponse,
2425
2890
  parseGhcnhPsv: () => parseGhcnhPsv,
2426
2891
  parseGhcnhRow: () => parseGhcnhRow,
2427
2892
  parseIemCsv: () => parseIemCsv,
2893
+ resolveAutoStrategy: () => resolveAutoStrategy,
2428
2894
  sourceTag: () => sourceTag,
2429
2895
  stream: () => stream,
2430
2896
  validatePollSeconds: () => validatePollSeconds,
@@ -2626,10 +3092,10 @@ var mostlyright = (() => {
2626
3092
  if (!product) return "preliminary";
2627
3093
  const issued = parseProductTimestamp(product);
2628
3094
  if (issued === null) return "preliminary";
2629
- const obs = parseObservationDate(observationDate);
2630
- if (obs === null) return "preliminary";
3095
+ const obs2 = parseObservationDate(observationDate);
3096
+ if (obs2 === null) return "preliminary";
2631
3097
  const issuedDayUtc = Date.UTC(issued.getUTCFullYear(), issued.getUTCMonth(), issued.getUTCDate());
2632
- const obsDayUtc = obs.getTime();
3098
+ const obsDayUtc = obs2.getTime();
2633
3099
  const deltaDays = Math.round((issuedDayUtc - obsDayUtc) / 864e5);
2634
3100
  if (deltaDays <= 0) return "preliminary";
2635
3101
  if (deltaDays === 1) {
@@ -3005,8 +3471,8 @@ var mostlyright = (() => {
3005
3471
  const key = header[c];
3006
3472
  row[key] = c < cells.length ? cells[c] : "";
3007
3473
  }
3008
- const obs = parseGhcnhRow(row);
3009
- if (obs !== null) out.push(obs);
3474
+ const obs2 = parseGhcnhRow(row);
3475
+ if (obs2 !== null) out.push(obs2);
3010
3476
  }
3011
3477
  return out;
3012
3478
  }
@@ -3075,8 +3541,8 @@ var mostlyright = (() => {
3075
3541
  if (s.length === 3) return `K${s}`;
3076
3542
  return s;
3077
3543
  }
3078
- function asLiveObservation(obs, tag) {
3079
- return { ...obs, source: tag };
3544
+ function asLiveObservation(obs2, tag) {
3545
+ return { ...obs2, source: tag };
3080
3546
  }
3081
3547
  async function fetchAwcLatest(station) {
3082
3548
  const icao = normalizeStation(station);
@@ -3084,9 +3550,9 @@ var mostlyright = (() => {
3084
3550
  const tag = sourceTag("awc");
3085
3551
  const rows = [];
3086
3552
  for (const m of raw) {
3087
- const obs = awcToObservation(m);
3088
- if (obs !== null) {
3089
- rows.push(asLiveObservation(obs, tag));
3553
+ const obs2 = awcToObservation(m);
3554
+ if (obs2 !== null) {
3555
+ rows.push(asLiveObservation(obs2, tag));
3090
3556
  }
3091
3557
  }
3092
3558
  return rows;
@@ -3142,8 +3608,8 @@ var mostlyright = (() => {
3142
3608
  const response = await fetchWithRetry2(url);
3143
3609
  const csv = await response.text();
3144
3610
  const override = reportType === 3 ? "METAR" : "SPECI";
3145
- const obs = parseIemCsv2(csv, { observationTypeOverride: override });
3146
- for (const row of obs) {
3611
+ const obs2 = parseIemCsv2(csv, { observationTypeOverride: override });
3612
+ for (const row of obs2) {
3147
3613
  rows.push(asLiveObservation(row, tag));
3148
3614
  }
3149
3615
  }
@@ -3359,72 +3825,2082 @@ var mostlyright = (() => {
3359
3825
  }
3360
3826
 
3361
3827
  // ../weather/src/forecasts/nwp-stub.ts
3362
- async function forecastNwp(_station, _model, _opts = {}) {
3363
- throw new Error(
3364
- "forecastNwp: TS NWP deferred to v1.1 per CONTEXT decision 7. Browser GRIB2 decode is not production-ready in May 2026; the v1.0 TS forecast surface ships iemMosForecasts() only. Use the Python SDK's mostlyright.forecast_nwp() for NWP in v1.0."
3828
+ init_src();
3829
+ var IEM_MOS_COVERED_STATIONS = /* @__PURE__ */ new Set([
3830
+ "KNYC",
3831
+ "KLAX",
3832
+ "KORD",
3833
+ "KMIA",
3834
+ "KDEN",
3835
+ "KSEA",
3836
+ "KATL"
3837
+ ]);
3838
+ function buildHint(station, model) {
3839
+ const hasMosCoverage = IEM_MOS_COVERED_STATIONS.has(station.toUpperCase());
3840
+ const mosLine = hasMosCoverage ? `Workaround for ${station}: iemMosForecasts("${station}", ...) is available (IEM MOS catalog covers this station).` : `Workaround: this station has no IEM MOS coverage; use the Python SDK's mostlyright.forecast_nwp() in v1.x.`;
3841
+ return `forecastNwp(${station}, "${model}") is a v1.x stub. Browser GRIB2 decode is not production-ready in May 2026 (no eccodes / cfgrib equivalent for the browser; WASM compile time + bundle size make it impractical for v1.x). ${mosLine} See https://mostlyright.md/docs/sdk/typescript/nwp-forecasts/ for the architectural reason + v2.0+ tracking.`;
3842
+ }
3843
+ async function forecastNwp(station, model, _opts = {}) {
3844
+ throw new NwpNotAvailableError({
3845
+ station,
3846
+ model,
3847
+ hint: buildHint(station, model)
3848
+ });
3849
+ }
3850
+
3851
+ // ../weather/src/forecasts/open-meteo.ts
3852
+ init_src();
3853
+
3854
+ // ../weather/src/forecasts/open-meteo-models.ts
3855
+ var OPEN_METEO_MODELS = /* @__PURE__ */ new Set([
3856
+ // NCEP (8)
3857
+ "gfs_seamless",
3858
+ "gfs_global",
3859
+ "gfs_graphcast025",
3860
+ "aigfs025",
3861
+ "hgefs025",
3862
+ "ncep_hrrr_conus",
3863
+ "ncep_nbm_conus",
3864
+ "ncep_nam_conus",
3865
+ // ECMWF (3)
3866
+ "ecmwf_ifs025",
3867
+ "ecmwf_ifs_hres",
3868
+ "ecmwf_aifs025_single",
3869
+ // DWD (5)
3870
+ "dwd_icon_seamless",
3871
+ "dwd_icon_global",
3872
+ "dwd_icon_eu",
3873
+ "dwd_icon_d2",
3874
+ "dwd_icon_d2_15min",
3875
+ // Météo-France (6)
3876
+ "meteofrance_seamless",
3877
+ "meteofrance_arpege_world025",
3878
+ "meteofrance_arpege_europe",
3879
+ "meteofrance_arome_france0025",
3880
+ "meteofrance_arome_france_hd",
3881
+ "meteofrance_arome_france_hd_15min",
3882
+ // Asia + Oceania (8)
3883
+ "jma_seamless",
3884
+ "jma_gsm",
3885
+ "jma_msm",
3886
+ "kma_seamless",
3887
+ "kma_gdps",
3888
+ "kma_ldps",
3889
+ "cma_grapes_global",
3890
+ "bom_access_global",
3891
+ // Europe (3)
3892
+ "ukmo_global_deterministic_10km",
3893
+ "ukmo_uk_deterministic_2km",
3894
+ "metno_nordic_pp",
3895
+ // GEM Canada (3)
3896
+ "cmc_gem_gdps",
3897
+ "cmc_gem_rdps",
3898
+ "cmc_gem_hrdps"
3899
+ ]);
3900
+ var SIX_HOURLY = [0, 6, 12, 18];
3901
+ var THREE_HOURLY = [0, 3, 6, 9, 12, 15, 18, 21];
3902
+ var HOURLY = Array.from({ length: 24 }, (_, i) => i);
3903
+ var TWELVE_HOURLY = [0, 12];
3904
+ var CYCLE_HOURS = /* @__PURE__ */ new Map([
3905
+ // NCEP
3906
+ ["gfs_seamless", SIX_HOURLY],
3907
+ ["gfs_global", SIX_HOURLY],
3908
+ ["gfs_graphcast025", SIX_HOURLY],
3909
+ ["aigfs025", SIX_HOURLY],
3910
+ ["hgefs025", SIX_HOURLY],
3911
+ ["ncep_hrrr_conus", HOURLY],
3912
+ ["ncep_nbm_conus", HOURLY],
3913
+ ["ncep_nam_conus", SIX_HOURLY],
3914
+ // ECMWF
3915
+ ["ecmwf_ifs025", SIX_HOURLY],
3916
+ ["ecmwf_ifs_hres", SIX_HOURLY],
3917
+ ["ecmwf_aifs025_single", SIX_HOURLY],
3918
+ // DWD
3919
+ ["dwd_icon_seamless", SIX_HOURLY],
3920
+ ["dwd_icon_global", SIX_HOURLY],
3921
+ ["dwd_icon_eu", SIX_HOURLY],
3922
+ ["dwd_icon_d2", THREE_HOURLY],
3923
+ ["dwd_icon_d2_15min", THREE_HOURLY],
3924
+ // Météo-France
3925
+ ["meteofrance_seamless", SIX_HOURLY],
3926
+ ["meteofrance_arpege_world025", SIX_HOURLY],
3927
+ ["meteofrance_arpege_europe", SIX_HOURLY],
3928
+ ["meteofrance_arome_france0025", THREE_HOURLY],
3929
+ ["meteofrance_arome_france_hd", THREE_HOURLY],
3930
+ ["meteofrance_arome_france_hd_15min", THREE_HOURLY],
3931
+ // Asia + Oceania
3932
+ ["jma_seamless", SIX_HOURLY],
3933
+ ["jma_gsm", SIX_HOURLY],
3934
+ ["jma_msm", THREE_HOURLY],
3935
+ ["kma_seamless", SIX_HOURLY],
3936
+ ["kma_gdps", SIX_HOURLY],
3937
+ ["kma_ldps", THREE_HOURLY],
3938
+ ["cma_grapes_global", SIX_HOURLY],
3939
+ ["bom_access_global", SIX_HOURLY],
3940
+ // Europe
3941
+ ["ukmo_global_deterministic_10km", SIX_HOURLY],
3942
+ ["ukmo_uk_deterministic_2km", THREE_HOURLY],
3943
+ ["metno_nordic_pp", HOURLY],
3944
+ // GEM Canada
3945
+ ["cmc_gem_gdps", TWELVE_HOURLY],
3946
+ ["cmc_gem_rdps", SIX_HOURLY],
3947
+ ["cmc_gem_hrdps", SIX_HOURLY]
3948
+ ]);
3949
+ var PUBLISH_LAG_HOURS = /* @__PURE__ */ new Map([
3950
+ // NCEP — global 6h, regional/mesoscale 2h
3951
+ ["gfs_seamless", 6],
3952
+ ["gfs_global", 6],
3953
+ ["gfs_graphcast025", 6],
3954
+ ["aigfs025", 6],
3955
+ ["hgefs025", 6],
3956
+ ["ncep_hrrr_conus", 2],
3957
+ ["ncep_nbm_conus", 2],
3958
+ ["ncep_nam_conus", 2],
3959
+ // ECMWF — global 6h
3960
+ ["ecmwf_ifs025", 6],
3961
+ ["ecmwf_ifs_hres", 6],
3962
+ ["ecmwf_aifs025_single", 6],
3963
+ // DWD
3964
+ ["dwd_icon_seamless", 4],
3965
+ ["dwd_icon_global", 4],
3966
+ ["dwd_icon_eu", 4],
3967
+ ["dwd_icon_d2", 2],
3968
+ ["dwd_icon_d2_15min", 2],
3969
+ // Météo-France
3970
+ ["meteofrance_seamless", 4],
3971
+ ["meteofrance_arpege_world025", 6],
3972
+ ["meteofrance_arpege_europe", 4],
3973
+ ["meteofrance_arome_france0025", 2],
3974
+ ["meteofrance_arome_france_hd", 2],
3975
+ ["meteofrance_arome_france_hd_15min", 2],
3976
+ // Asia + Oceania
3977
+ ["jma_seamless", 6],
3978
+ ["jma_gsm", 6],
3979
+ ["jma_msm", 2],
3980
+ ["kma_seamless", 6],
3981
+ ["kma_gdps", 6],
3982
+ ["kma_ldps", 2],
3983
+ ["cma_grapes_global", 6],
3984
+ ["bom_access_global", 6],
3985
+ // Europe
3986
+ ["ukmo_global_deterministic_10km", 6],
3987
+ ["ukmo_uk_deterministic_2km", 2],
3988
+ ["metno_nordic_pp", 2],
3989
+ // GEM Canada
3990
+ ["cmc_gem_gdps", 6],
3991
+ ["cmc_gem_rdps", 4],
3992
+ ["cmc_gem_hrdps", 2]
3993
+ ]);
3994
+ function floorToCycleMs(valueUtcMs, cycleHours) {
3995
+ if (cycleHours.length === 0) {
3996
+ throw new Error("cycleHours must be non-empty");
3997
+ }
3998
+ const d = new Date(valueUtcMs);
3999
+ const hour = d.getUTCHours();
4000
+ const sorted = [...cycleHours].sort((a, b) => a - b);
4001
+ const candidates = sorted.filter((h) => h <= hour);
4002
+ if (candidates.length > 0) {
4003
+ const targetHour = candidates[candidates.length - 1];
4004
+ return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), targetHour, 0, 0, 0);
4005
+ }
4006
+ const lastCycle = sorted[sorted.length - 1];
4007
+ const prior = new Date(valueUtcMs - 864e5);
4008
+ return Date.UTC(
4009
+ prior.getUTCFullYear(),
4010
+ prior.getUTCMonth(),
4011
+ prior.getUTCDate(),
4012
+ lastCycle,
4013
+ 0,
4014
+ 0,
4015
+ 0
3365
4016
  );
3366
4017
  }
4018
+ function issuedAtFromPreviousDayMs(validAtUtcMs, N, cycleHours) {
4019
+ if (N < 1 || N > 7) {
4020
+ throw new Error(`N must be in 1..7 (Open-Meteo previous_dayN limit); got ${N}`);
4021
+ }
4022
+ return floorToCycleMs(validAtUtcMs - N * 864e5, cycleHours);
4023
+ }
4024
+ function issuedAtFromLiveCycleMathMs(nowUtcMs, publishLagHours, cycleHours) {
4025
+ return floorToCycleMs(nowUtcMs - publishLagHours * 36e5, cycleHours);
4026
+ }
3367
4027
 
3368
- // ../weather/src/index.ts
3369
- var version2 = "0.0.0";
3370
- function helloWeather() {
3371
- return "hello @mostlyrightmd/weather";
4028
+ // ../weather/src/forecasts/open-meteo.ts
4029
+ var OPEN_METEO_PREVIOUS_RUNS_URL = "https://previous-runs-api.open-meteo.com/v1/forecast";
4030
+ var OPEN_METEO_SINGLE_RUNS_URL = "https://single-runs-api.open-meteo.com/v1/forecast";
4031
+ var OPEN_METEO_LIVE_URL = "https://api.open-meteo.com/v1/forecast";
4032
+ var OPEN_METEO_SEAMLESS_URL = "https://historical-forecast-api.open-meteo.com/v1/forecast";
4033
+ var VALID_MODES = /* @__PURE__ */ new Set(["training", "live", "seamless"]);
4034
+ var HOURLY_VARIABLES = [
4035
+ "temperature_2m",
4036
+ "dew_point_2m",
4037
+ "apparent_temperature",
4038
+ "wind_speed_10m",
4039
+ "wind_direction_10m",
4040
+ "wind_gusts_10m",
4041
+ "precipitation",
4042
+ "precipitation_probability",
4043
+ "cloud_cover",
4044
+ "surface_pressure",
4045
+ "pressure_msl",
4046
+ "shortwave_radiation",
4047
+ "direct_radiation",
4048
+ "cape",
4049
+ "freezing_level_height",
4050
+ "snow_depth",
4051
+ "visibility",
4052
+ "weather_code"
4053
+ ];
4054
+ var STATION_COORDS = /* @__PURE__ */ new Map([
4055
+ ["KNYC", { lat: 40.78, lon: -73.97 }],
4056
+ ["KORD", { lat: 41.98, lon: -87.9 }],
4057
+ ["KDEN", { lat: 39.86, lon: -104.67 }],
4058
+ ["KMIA", { lat: 25.79, lon: -80.29 }],
4059
+ ["KSEA", { lat: 47.45, lon: -122.31 }]
4060
+ ]);
4061
+ function resolveCoords(station) {
4062
+ const coords = STATION_COORDS.get(station);
4063
+ if (coords) return coords;
4064
+ throw new Error(
4065
+ `openMeteoForecasts: station=${JSON.stringify(station)} not in built-in coords table; add to STATION_COORDS`
4066
+ );
4067
+ }
4068
+ function buildHourlyParam(endpoint) {
4069
+ if (endpoint === OPEN_METEO_PREVIOUS_RUNS_URL) {
4070
+ return HOURLY_VARIABLES.map((v) => `${v}_previous_day1`).join(",");
4071
+ }
4072
+ return HOURLY_VARIABLES.join(",");
4073
+ }
4074
+ function dispatchEndpoint(mode, opts) {
4075
+ if (mode === "training") {
4076
+ return opts.issuedAt ? OPEN_METEO_SINGLE_RUNS_URL : OPEN_METEO_PREVIOUS_RUNS_URL;
4077
+ }
4078
+ if (mode === "live") {
4079
+ return OPEN_METEO_LIVE_URL;
4080
+ }
4081
+ if (mode === "seamless") {
4082
+ if (!opts.allowLeakage) {
4083
+ throw new OpenMeteoSeamlessLeakageError(
4084
+ "Open-Meteo seamless endpoint is banned for training data (see Tarabcak/mostlyright#70). Pass allowLeakage: true to opt in; LeakageDetector will still reject these rows when asOf is asserted.",
4085
+ {
4086
+ model: opts.model,
4087
+ endpointUrl: OPEN_METEO_SEAMLESS_URL
4088
+ }
4089
+ );
4090
+ }
4091
+ return OPEN_METEO_SEAMLESS_URL;
4092
+ }
4093
+ throw new Error(`openMeteoForecasts: unknown mode ${JSON.stringify(mode)}`);
4094
+ }
4095
+ function isoIfNotNull(ms) {
4096
+ return ms === null ? null : new Date(ms).toISOString();
4097
+ }
4098
+ function maybeNumber2(value) {
4099
+ if (value === null || value === void 0) return null;
4100
+ const n = typeof value === "number" ? value : Number(value);
4101
+ return Number.isFinite(n) ? n : null;
4102
+ }
4103
+ function pickHourlyValue(hourly, key, isPreviousRuns, idx) {
4104
+ const arr = isPreviousRuns ? hourly[`${key}_previous_day1`] ?? hourly[key] : hourly[key];
4105
+ if (!Array.isArray(arr) || idx >= arr.length) return null;
4106
+ return arr[idx];
4107
+ }
4108
+ async function openMeteoForecasts(station, fromDate, toDate, opts = {}) {
4109
+ const model = opts.model ?? "gfs_global";
4110
+ if (!OPEN_METEO_MODELS.has(model)) {
4111
+ throw new Error(
4112
+ `openMeteoForecasts: model must be one of OPEN_METEO_MODELS (36 keys); got ${JSON.stringify(model)}`
4113
+ );
4114
+ }
4115
+ const mode = opts.mode ?? "training";
4116
+ if (!VALID_MODES.has(mode)) {
4117
+ throw new Error(
4118
+ `openMeteoForecasts: mode must be one of training,live,seamless; got ${JSON.stringify(mode)}`
4119
+ );
4120
+ }
4121
+ const endpoint = dispatchEndpoint(mode, {
4122
+ allowLeakage: opts.allowLeakage ?? false,
4123
+ model,
4124
+ issuedAt: opts.issuedAt
4125
+ });
4126
+ const { lat, lon } = resolveCoords(station);
4127
+ const params = new URLSearchParams();
4128
+ params.set("latitude", String(lat));
4129
+ params.set("longitude", String(lon));
4130
+ params.set("start_date", fromDate);
4131
+ params.set("end_date", toDate);
4132
+ params.set("hourly", buildHourlyParam(endpoint));
4133
+ params.set("models", model);
4134
+ params.set("timezone", "UTC");
4135
+ if (endpoint === OPEN_METEO_SINGLE_RUNS_URL && opts.issuedAt) {
4136
+ params.set("run", opts.issuedAt);
4137
+ }
4138
+ const fetchFn = opts.fetchFn ?? fetch;
4139
+ const url = `${endpoint}?${params.toString()}`;
4140
+ const resp = await fetchFn(url);
4141
+ if (resp.status === 404) return [];
4142
+ if (!resp.ok) {
4143
+ throw new Error(`openMeteoForecasts: HTTP ${resp.status} on ${url}`);
4144
+ }
4145
+ const payload = await resp.json();
4146
+ const hourly = payload.hourly ?? {};
4147
+ const times = hourly.time ?? [];
4148
+ if (times.length === 0) return [];
4149
+ let source;
4150
+ if (endpoint === OPEN_METEO_PREVIOUS_RUNS_URL) {
4151
+ source = "open_meteo.previous_runs";
4152
+ } else if (endpoint === OPEN_METEO_SINGLE_RUNS_URL) {
4153
+ source = "open_meteo.single_run";
4154
+ } else if (endpoint === OPEN_METEO_LIVE_URL) {
4155
+ source = "open_meteo.live";
4156
+ } else {
4157
+ source = "open_meteo.seamless";
4158
+ }
4159
+ const cycleHours = CYCLE_HOURS.get(model) ?? [0, 6, 12, 18];
4160
+ const publishLag = PUBLISH_LAG_HOURS.get(model) ?? 6;
4161
+ const retrievedAt = (/* @__PURE__ */ new Date()).toISOString();
4162
+ const nowMs = Date.now();
4163
+ const rows = [];
4164
+ for (let i = 0; i < times.length; i++) {
4165
+ const tIso = times[i] ?? "";
4166
+ if (!tIso) continue;
4167
+ const validAtMs = Date.parse(tIso.endsWith("Z") || tIso.includes("+") ? tIso : `${tIso}Z`);
4168
+ let issuedAtMs;
4169
+ if (source === "open_meteo.previous_runs") {
4170
+ issuedAtMs = issuedAtFromPreviousDayMs(validAtMs, 1, cycleHours);
4171
+ } else if (source === "open_meteo.single_run") {
4172
+ issuedAtMs = opts.issuedAt ? Date.parse(
4173
+ opts.issuedAt.endsWith("Z") || opts.issuedAt.includes("+") ? opts.issuedAt : `${opts.issuedAt}Z`
4174
+ ) : null;
4175
+ } else if (source === "open_meteo.live") {
4176
+ issuedAtMs = issuedAtFromLiveCycleMathMs(nowMs, publishLag, cycleHours);
4177
+ } else {
4178
+ issuedAtMs = null;
4179
+ }
4180
+ const validAtIso = new Date(validAtMs).toISOString();
4181
+ const forecastHour = issuedAtMs === null ? null : Math.round((validAtMs - issuedAtMs) / 36e5);
4182
+ const isPrev = source === "open_meteo.previous_runs";
4183
+ const h = hourly;
4184
+ const popPct = maybeNumber2(pickHourlyValue(h, "precipitation_probability", isPrev, i));
4185
+ rows.push({
4186
+ station,
4187
+ model,
4188
+ issuedAt: isoIfNotNull(issuedAtMs),
4189
+ validAt: validAtIso,
4190
+ forecastHour,
4191
+ tempC: maybeNumber2(pickHourlyValue(h, "temperature_2m", isPrev, i)),
4192
+ dewPointC: maybeNumber2(pickHourlyValue(h, "dew_point_2m", isPrev, i)),
4193
+ apparentTempC: maybeNumber2(pickHourlyValue(h, "apparent_temperature", isPrev, i)),
4194
+ windSpeedMs: maybeNumber2(pickHourlyValue(h, "wind_speed_10m", isPrev, i)),
4195
+ windDirDeg: maybeNumber2(pickHourlyValue(h, "wind_direction_10m", isPrev, i)),
4196
+ windGustsMs: maybeNumber2(pickHourlyValue(h, "wind_gusts_10m", isPrev, i)),
4197
+ precipProbability: popPct === null ? null : popPct / 100,
4198
+ precipitationMm: maybeNumber2(pickHourlyValue(h, "precipitation", isPrev, i)),
4199
+ cloudCoverPct: maybeNumber2(pickHourlyValue(h, "cloud_cover", isPrev, i)),
4200
+ surfacePressureHpa: maybeNumber2(pickHourlyValue(h, "surface_pressure", isPrev, i)),
4201
+ pressureMslHpa: maybeNumber2(pickHourlyValue(h, "pressure_msl", isPrev, i)),
4202
+ shortwaveRadiationWm2: maybeNumber2(pickHourlyValue(h, "shortwave_radiation", isPrev, i)),
4203
+ directRadiationWm2: maybeNumber2(pickHourlyValue(h, "direct_radiation", isPrev, i)),
4204
+ capeJkg: maybeNumber2(pickHourlyValue(h, "cape", isPrev, i)),
4205
+ freezingLevelM: maybeNumber2(pickHourlyValue(h, "freezing_level_height", isPrev, i)),
4206
+ snowDepthM: maybeNumber2(pickHourlyValue(h, "snow_depth", isPrev, i)),
4207
+ visibilityM: maybeNumber2(pickHourlyValue(h, "visibility", isPrev, i)),
4208
+ weatherCode: maybeNumber2(pickHourlyValue(h, "weather_code", isPrev, i)),
4209
+ source,
4210
+ retrievedAt
4211
+ });
4212
+ }
4213
+ return rows;
3372
4214
  }
3373
4215
 
3374
- // ../markets/src/index.ts
3375
- var src_exports3 = {};
3376
- __export(src_exports3, {
3377
- ContractIdError: () => ContractIdError,
3378
- KALSHI_SETTLEMENT_STATIONS: () => KALSHI_SETTLEMENT_STATIONS,
3379
- KNOWN_WRONG_STATIONS: () => KNOWN_WRONG_STATIONS,
3380
- POLYMARKET_CITY_STATIONS: () => POLYMARKET_CITY_STATIONS,
3381
- helloMarkets: () => helloMarkets,
3382
- kalshiNhighResolve: () => kalshiNhighResolve,
3383
- kalshiNlowResolve: () => kalshiNlowResolve,
3384
- kalshiSettlementFor: () => kalshiSettlementFor,
3385
- version: () => version3
3386
- });
4216
+ // ../weather/src/dailyExtremes.ts
4217
+ init_src();
3387
4218
 
3388
- // ../markets/src/data/generated/kalshi-stations.ts
3389
- var KALSHI_SETTLEMENT_STATIONS = {
3390
- ATL: {
3391
- citation: "https://kalshi.com/markets/khighatl (Atlanta Hartsfield-Jackson)",
3392
- station: "KATL"
4219
+ // ../core/dist/discovery/index.mjs
4220
+ var STATIONS2 = [
4221
+ {
4222
+ code: "EDDB",
4223
+ country: "DE",
4224
+ ghcnh_id: null,
4225
+ icao: "EDDB",
4226
+ latitude: 52.3667,
4227
+ longitude: 13.5033,
4228
+ name: "Berlin Brandenburg",
4229
+ tz: "Europe/Berlin",
4230
+ venues: [
4231
+ "polymarket"
4232
+ ]
3393
4233
  },
3394
- AUS: {
3395
- citation: "https://kalshi.com/markets/khighaus (Austin-Bergstrom; the only Austin station Kalshi cites)",
3396
- station: "KAUS"
4234
+ {
4235
+ code: "EDDF",
4236
+ country: "DE",
4237
+ ghcnh_id: null,
4238
+ icao: "EDDF",
4239
+ latitude: 50.0379,
4240
+ longitude: 8.5622,
4241
+ name: "Frankfurt am Main",
4242
+ tz: "Europe/Berlin",
4243
+ venues: [
4244
+ "polymarket"
4245
+ ]
3397
4246
  },
3398
- BNA: {
3399
- citation: "https://kalshi.com/markets/khighbna (Nashville International)",
3400
- station: "KBNA"
4247
+ {
4248
+ code: "EDDM",
4249
+ country: "DE",
4250
+ ghcnh_id: null,
4251
+ icao: "EDDM",
4252
+ latitude: 48.3538,
4253
+ longitude: 11.7861,
4254
+ name: "Munich Franz Josef Strauss",
4255
+ tz: "Europe/Berlin",
4256
+ venues: [
4257
+ "polymarket"
4258
+ ]
3401
4259
  },
3402
- BOS: {
3403
- citation: "https://kalshi.com/markets/khighbos (Boston Logan)",
3404
- station: "KBOS"
4260
+ {
4261
+ code: "EFHK",
4262
+ country: "FI",
4263
+ ghcnh_id: null,
4264
+ icao: "EFHK",
4265
+ latitude: 60.3172,
4266
+ longitude: 24.9633,
4267
+ name: "Helsinki-Vantaa",
4268
+ tz: "Europe/Helsinki",
4269
+ venues: [
4270
+ "polymarket"
4271
+ ]
3405
4272
  },
3406
- CHI: {
3407
- citation: "https://kalshi.com/markets/khighchi (Midway, NOT ORD)",
3408
- station: "KMDW"
4273
+ {
4274
+ code: "EGKK",
4275
+ country: "GB",
4276
+ ghcnh_id: null,
4277
+ icao: "EGKK",
4278
+ latitude: 51.1481,
4279
+ longitude: -0.1903,
4280
+ name: "London Gatwick",
4281
+ tz: "Europe/London",
4282
+ venues: [
4283
+ "polymarket"
4284
+ ]
3409
4285
  },
3410
- CVG: {
3411
- citation: "https://kalshi.com/markets/khighcvg (Cincinnati/Northern Kentucky International)",
3412
- station: "KCVG"
4286
+ {
4287
+ code: "EGLL",
4288
+ country: "GB",
4289
+ ghcnh_id: null,
4290
+ icao: "EGLL",
4291
+ latitude: 51.4706,
4292
+ longitude: -0.4619,
4293
+ name: "London Heathrow",
4294
+ tz: "Europe/London",
4295
+ venues: [
4296
+ "polymarket"
4297
+ ]
3413
4298
  },
3414
- DAL: {
3415
- citation: "https://kalshi.com/markets/khighdal (DFW, NOT Love Field)",
3416
- station: "KDFW"
4299
+ {
4300
+ code: "EHAM",
4301
+ country: "NL",
4302
+ ghcnh_id: null,
4303
+ icao: "EHAM",
4304
+ latitude: 52.3086,
4305
+ longitude: 4.7639,
4306
+ name: "Amsterdam Schiphol",
4307
+ tz: "Europe/Amsterdam",
4308
+ venues: [
4309
+ "polymarket"
4310
+ ]
3417
4311
  },
3418
- DCA: {
3419
- citation: "https://kalshi.com/markets/khighdca (Reagan National, NOT Dulles or BWI)",
3420
- station: "KDCA"
4312
+ {
4313
+ code: "EKCH",
4314
+ country: "DK",
4315
+ ghcnh_id: null,
4316
+ icao: "EKCH",
4317
+ latitude: 55.6181,
4318
+ longitude: 12.6561,
4319
+ name: "Copenhagen Kastrup",
4320
+ tz: "Europe/Copenhagen",
4321
+ venues: [
4322
+ "polymarket"
4323
+ ]
3421
4324
  },
3422
- DEN: {
3423
- citation: "https://kalshi.com/markets/khighden (Denver International)",
3424
- station: "KDEN"
4325
+ {
4326
+ code: "EPWA",
4327
+ country: "PL",
4328
+ ghcnh_id: null,
4329
+ icao: "EPWA",
4330
+ latitude: 52.1657,
4331
+ longitude: 20.9671,
4332
+ name: "Warsaw Chopin",
4333
+ tz: "Europe/Warsaw",
4334
+ venues: [
4335
+ "polymarket"
4336
+ ]
3425
4337
  },
3426
- DTW: {
3427
- citation: "https://kalshi.com/markets/khighdtw (Detroit Metropolitan)",
4338
+ {
4339
+ code: "ESSA",
4340
+ country: "SE",
4341
+ ghcnh_id: null,
4342
+ icao: "ESSA",
4343
+ latitude: 59.6519,
4344
+ longitude: 17.9186,
4345
+ name: "Stockholm Arlanda",
4346
+ tz: "Europe/Stockholm",
4347
+ venues: [
4348
+ "polymarket"
4349
+ ]
4350
+ },
4351
+ {
4352
+ code: "ATL",
4353
+ country: "US",
4354
+ ghcnh_id: "USW00013874",
4355
+ icao: "KATL",
4356
+ latitude: 33.6407,
4357
+ longitude: -84.4277,
4358
+ name: "Hartsfield-Jackson Atlanta International",
4359
+ tz: "America/New_York",
4360
+ venues: [
4361
+ "kalshi",
4362
+ "polymarket"
4363
+ ]
4364
+ },
4365
+ {
4366
+ code: "AUS",
4367
+ country: "US",
4368
+ ghcnh_id: "USW00013904",
4369
+ icao: "KAUS",
4370
+ latitude: 30.1975,
4371
+ longitude: -97.6664,
4372
+ name: "Austin-Bergstrom International",
4373
+ tz: "America/Chicago",
4374
+ venues: [
4375
+ "kalshi",
4376
+ "polymarket"
4377
+ ]
4378
+ },
4379
+ {
4380
+ code: "BNA",
4381
+ country: "US",
4382
+ ghcnh_id: "USW00013897",
4383
+ icao: "KBNA",
4384
+ latitude: 36.1245,
4385
+ longitude: -86.6782,
4386
+ name: "Nashville International",
4387
+ tz: "America/Chicago",
4388
+ venues: [
4389
+ "kalshi"
4390
+ ]
4391
+ },
4392
+ {
4393
+ code: "BOS",
4394
+ country: "US",
4395
+ ghcnh_id: "USW00014739",
4396
+ icao: "KBOS",
4397
+ latitude: 42.3656,
4398
+ longitude: -71.0096,
4399
+ name: "Boston Logan International",
4400
+ tz: "America/New_York",
4401
+ venues: [
4402
+ "kalshi",
4403
+ "polymarket"
4404
+ ]
4405
+ },
4406
+ {
4407
+ code: "CVG",
4408
+ country: "US",
4409
+ ghcnh_id: "USW00093814",
4410
+ icao: "KCVG",
4411
+ latitude: 39.0488,
4412
+ longitude: -84.6678,
4413
+ name: "Cincinnati/Northern Kentucky International",
4414
+ tz: "America/New_York",
4415
+ venues: [
4416
+ "kalshi"
4417
+ ]
4418
+ },
4419
+ {
4420
+ code: "DCA",
4421
+ country: "US",
4422
+ ghcnh_id: "USW00013743",
4423
+ icao: "KDCA",
4424
+ latitude: 38.8512,
4425
+ longitude: -77.0402,
4426
+ name: "Washington Reagan National",
4427
+ tz: "America/New_York",
4428
+ venues: [
4429
+ "kalshi",
4430
+ "polymarket"
4431
+ ]
4432
+ },
4433
+ {
4434
+ code: "DEN",
4435
+ country: "US",
4436
+ ghcnh_id: "USW00003017",
4437
+ icao: "KDEN",
4438
+ latitude: 39.8561,
4439
+ longitude: -104.6737,
4440
+ name: "Denver International",
4441
+ tz: "America/Denver",
4442
+ venues: [
4443
+ "kalshi",
4444
+ "polymarket"
4445
+ ]
4446
+ },
4447
+ {
4448
+ code: "DFW",
4449
+ country: "US",
4450
+ ghcnh_id: "USW00003927",
4451
+ icao: "KDFW",
4452
+ latitude: 32.8998,
4453
+ longitude: -97.0403,
4454
+ name: "Dallas-Fort Worth International",
4455
+ tz: "America/Chicago",
4456
+ venues: [
4457
+ "kalshi",
4458
+ "polymarket"
4459
+ ]
4460
+ },
4461
+ {
4462
+ code: "DTW",
4463
+ country: "US",
4464
+ ghcnh_id: "USW00094847",
4465
+ icao: "KDTW",
4466
+ latitude: 42.2124,
4467
+ longitude: -83.3534,
4468
+ name: "Detroit Metropolitan Wayne County",
4469
+ tz: "America/New_York",
4470
+ venues: [
4471
+ "kalshi",
4472
+ "polymarket"
4473
+ ]
4474
+ },
4475
+ {
4476
+ code: "HOU",
4477
+ country: "US",
4478
+ ghcnh_id: "USW00012918",
4479
+ icao: "KHOU",
4480
+ latitude: 29.6454,
4481
+ longitude: -95.2789,
4482
+ name: "Houston Hobby",
4483
+ tz: "America/Chicago",
4484
+ venues: []
4485
+ },
4486
+ {
4487
+ code: "IAH",
4488
+ country: "US",
4489
+ ghcnh_id: "USW00012960",
4490
+ icao: "KIAH",
4491
+ latitude: 29.9844,
4492
+ longitude: -95.3414,
4493
+ name: "Houston George Bush Intercontinental",
4494
+ tz: "America/Chicago",
4495
+ venues: [
4496
+ "kalshi",
4497
+ "polymarket"
4498
+ ]
4499
+ },
4500
+ {
4501
+ code: "LAS",
4502
+ country: "US",
4503
+ ghcnh_id: "USW00023169",
4504
+ icao: "KLAS",
4505
+ latitude: 36.084,
4506
+ longitude: -115.1537,
4507
+ name: "Harry Reid (McCarran) International",
4508
+ tz: "America/Los_Angeles",
4509
+ venues: [
4510
+ "kalshi"
4511
+ ]
4512
+ },
4513
+ {
4514
+ code: "LAX",
4515
+ country: "US",
4516
+ ghcnh_id: "USW00023174",
4517
+ icao: "KLAX",
4518
+ latitude: 33.9425,
4519
+ longitude: -118.4081,
4520
+ name: "Los Angeles International",
4521
+ tz: "America/Los_Angeles",
4522
+ venues: [
4523
+ "kalshi",
4524
+ "polymarket"
4525
+ ]
4526
+ },
4527
+ {
4528
+ code: "MDW",
4529
+ country: "US",
4530
+ ghcnh_id: "USW00014819",
4531
+ icao: "KMDW",
4532
+ latitude: 41.7868,
4533
+ longitude: -87.7522,
4534
+ name: "Chicago Midway International",
4535
+ tz: "America/Chicago",
4536
+ venues: [
4537
+ "kalshi"
4538
+ ]
4539
+ },
4540
+ {
4541
+ code: "MIA",
4542
+ country: "US",
4543
+ ghcnh_id: "USW00012839",
4544
+ icao: "KMIA",
4545
+ latitude: 25.7959,
4546
+ longitude: -80.287,
4547
+ name: "Miami International",
4548
+ tz: "America/New_York",
4549
+ venues: [
4550
+ "kalshi",
4551
+ "polymarket"
4552
+ ]
4553
+ },
4554
+ {
4555
+ code: "MSP",
4556
+ country: "US",
4557
+ ghcnh_id: "USW00014922",
4558
+ icao: "KMSP",
4559
+ latitude: 44.8848,
4560
+ longitude: -93.2223,
4561
+ name: "Minneapolis-St Paul International",
4562
+ tz: "America/Chicago",
4563
+ venues: [
4564
+ "kalshi",
4565
+ "polymarket"
4566
+ ]
4567
+ },
4568
+ {
4569
+ code: "MSY",
4570
+ country: "US",
4571
+ ghcnh_id: "USW00012916",
4572
+ icao: "KMSY",
4573
+ latitude: 29.9934,
4574
+ longitude: -90.258,
4575
+ name: "New Orleans Louis Armstrong International",
4576
+ tz: "America/Chicago",
4577
+ venues: []
4578
+ },
4579
+ {
4580
+ code: "NYC",
4581
+ country: "US",
4582
+ ghcnh_id: "USW00094728",
4583
+ icao: "KNYC",
4584
+ latitude: 40.7789,
4585
+ longitude: -73.9692,
4586
+ name: "Central Park, New York",
4587
+ tz: "America/New_York",
4588
+ venues: [
4589
+ "kalshi"
4590
+ ]
4591
+ },
4592
+ {
4593
+ code: "OKC",
4594
+ country: "US",
4595
+ ghcnh_id: "USW00013967",
4596
+ icao: "KOKC",
4597
+ latitude: 35.3931,
4598
+ longitude: -97.6007,
4599
+ name: "Oklahoma City Will Rogers World",
4600
+ tz: "America/Chicago",
4601
+ venues: []
4602
+ },
4603
+ {
4604
+ code: "PHL",
4605
+ country: "US",
4606
+ ghcnh_id: "USW00013739",
4607
+ icao: "KPHL",
4608
+ latitude: 39.8721,
4609
+ longitude: -75.2411,
4610
+ name: "Philadelphia International",
4611
+ tz: "America/New_York",
4612
+ venues: [
4613
+ "kalshi",
4614
+ "polymarket"
4615
+ ]
4616
+ },
4617
+ {
4618
+ code: "PHX",
4619
+ country: "US",
4620
+ ghcnh_id: "USW00023183",
4621
+ icao: "KPHX",
4622
+ latitude: 33.4373,
4623
+ longitude: -112.0078,
4624
+ name: "Phoenix Sky Harbor International",
4625
+ tz: "America/Phoenix",
4626
+ venues: [
4627
+ "kalshi",
4628
+ "polymarket"
4629
+ ]
4630
+ },
4631
+ {
4632
+ code: "SAT",
4633
+ country: "US",
4634
+ ghcnh_id: "USW00012921",
4635
+ icao: "KSAT",
4636
+ latitude: 29.5337,
4637
+ longitude: -98.4698,
4638
+ name: "San Antonio International",
4639
+ tz: "America/Chicago",
4640
+ venues: []
4641
+ },
4642
+ {
4643
+ code: "SEA",
4644
+ country: "US",
4645
+ ghcnh_id: "USW00024233",
4646
+ icao: "KSEA",
4647
+ latitude: 47.4502,
4648
+ longitude: -122.3088,
4649
+ name: "Seattle-Tacoma International",
4650
+ tz: "America/Los_Angeles",
4651
+ venues: [
4652
+ "kalshi",
4653
+ "polymarket"
4654
+ ]
4655
+ },
4656
+ {
4657
+ code: "SFO",
4658
+ country: "US",
4659
+ ghcnh_id: "USW00023234",
4660
+ icao: "KSFO",
4661
+ latitude: 37.6213,
4662
+ longitude: -122.379,
4663
+ name: "San Francisco International",
4664
+ tz: "America/Los_Angeles",
4665
+ venues: [
4666
+ "kalshi",
4667
+ "polymarket"
4668
+ ]
4669
+ },
4670
+ {
4671
+ code: "SLC",
4672
+ country: "US",
4673
+ ghcnh_id: "USW00024127",
4674
+ icao: "KSLC",
4675
+ latitude: 40.7884,
4676
+ longitude: -111.9778,
4677
+ name: "Salt Lake City International",
4678
+ tz: "America/Denver",
4679
+ venues: [
4680
+ "kalshi"
4681
+ ]
4682
+ },
4683
+ {
4684
+ code: "LEBL",
4685
+ country: "ES",
4686
+ ghcnh_id: null,
4687
+ icao: "LEBL",
4688
+ latitude: 41.2974,
4689
+ longitude: 2.0833,
4690
+ name: "Barcelona El Prat",
4691
+ tz: "Europe/Madrid",
4692
+ venues: [
4693
+ "polymarket"
4694
+ ]
4695
+ },
4696
+ {
4697
+ code: "LEMD",
4698
+ country: "ES",
4699
+ ghcnh_id: null,
4700
+ icao: "LEMD",
4701
+ latitude: 40.4719,
4702
+ longitude: -3.5626,
4703
+ name: "Madrid Barajas",
4704
+ tz: "Europe/Madrid",
4705
+ venues: [
4706
+ "polymarket"
4707
+ ]
4708
+ },
4709
+ {
4710
+ code: "LFPB",
4711
+ country: "FR",
4712
+ ghcnh_id: null,
4713
+ icao: "LFPB",
4714
+ latitude: 48.9694,
4715
+ longitude: 2.4414,
4716
+ name: "Paris Le Bourget",
4717
+ tz: "Europe/Paris",
4718
+ venues: [
4719
+ "polymarket"
4720
+ ]
4721
+ },
4722
+ {
4723
+ code: "LFPG",
4724
+ country: "FR",
4725
+ ghcnh_id: null,
4726
+ icao: "LFPG",
4727
+ latitude: 49.0097,
4728
+ longitude: 2.5479,
4729
+ name: "Paris Charles de Gaulle",
4730
+ tz: "Europe/Paris",
4731
+ venues: [
4732
+ "polymarket"
4733
+ ]
4734
+ },
4735
+ {
4736
+ code: "LFPO",
4737
+ country: "FR",
4738
+ ghcnh_id: null,
4739
+ icao: "LFPO",
4740
+ latitude: 48.7233,
4741
+ longitude: 2.3794,
4742
+ name: "Paris Orly",
4743
+ tz: "Europe/Paris",
4744
+ venues: [
4745
+ "polymarket"
4746
+ ]
4747
+ },
4748
+ {
4749
+ code: "LIMC",
4750
+ country: "IT",
4751
+ ghcnh_id: null,
4752
+ icao: "LIMC",
4753
+ latitude: 45.6306,
4754
+ longitude: 8.7281,
4755
+ name: "Milan Malpensa",
4756
+ tz: "Europe/Rome",
4757
+ venues: [
4758
+ "polymarket"
4759
+ ]
4760
+ },
4761
+ {
4762
+ code: "LIRF",
4763
+ country: "IT",
4764
+ ghcnh_id: null,
4765
+ icao: "LIRF",
4766
+ latitude: 41.8003,
4767
+ longitude: 12.2389,
4768
+ name: "Rome Fiumicino",
4769
+ tz: "Europe/Rome",
4770
+ venues: [
4771
+ "polymarket"
4772
+ ]
4773
+ },
4774
+ {
4775
+ code: "LOWW",
4776
+ country: "AT",
4777
+ ghcnh_id: null,
4778
+ icao: "LOWW",
4779
+ latitude: 48.1103,
4780
+ longitude: 16.5697,
4781
+ name: "Vienna International",
4782
+ tz: "Europe/Vienna",
4783
+ venues: [
4784
+ "polymarket"
4785
+ ]
4786
+ },
4787
+ {
4788
+ code: "LSZH",
4789
+ country: "CH",
4790
+ ghcnh_id: null,
4791
+ icao: "LSZH",
4792
+ latitude: 47.4647,
4793
+ longitude: 8.5492,
4794
+ name: "Zurich",
4795
+ tz: "Europe/Zurich",
4796
+ venues: [
4797
+ "polymarket"
4798
+ ]
4799
+ },
4800
+ {
4801
+ code: "NZAA",
4802
+ country: "NZ",
4803
+ ghcnh_id: null,
4804
+ icao: "NZAA",
4805
+ latitude: -37.0081,
4806
+ longitude: 174.7917,
4807
+ name: "Auckland",
4808
+ tz: "Pacific/Auckland",
4809
+ venues: [
4810
+ "polymarket"
4811
+ ]
4812
+ },
4813
+ {
4814
+ code: "NZWN",
4815
+ country: "NZ",
4816
+ ghcnh_id: null,
4817
+ icao: "NZWN",
4818
+ latitude: -41.3272,
4819
+ longitude: 174.8053,
4820
+ name: "Wellington",
4821
+ tz: "Pacific/Auckland",
4822
+ venues: [
4823
+ "polymarket"
4824
+ ]
4825
+ },
4826
+ {
4827
+ code: "OERK",
4828
+ country: "SA",
4829
+ ghcnh_id: null,
4830
+ icao: "OERK",
4831
+ latitude: 24.9576,
4832
+ longitude: 46.6988,
4833
+ name: "Riyadh King Khalid International",
4834
+ tz: "Asia/Riyadh",
4835
+ venues: [
4836
+ "polymarket"
4837
+ ]
4838
+ },
4839
+ {
4840
+ code: "OMDB",
4841
+ country: "AE",
4842
+ ghcnh_id: null,
4843
+ icao: "OMDB",
4844
+ latitude: 25.2532,
4845
+ longitude: 55.3657,
4846
+ name: "Dubai International",
4847
+ tz: "Asia/Dubai",
4848
+ venues: [
4849
+ "polymarket"
4850
+ ]
4851
+ },
4852
+ {
4853
+ code: "OTHH",
4854
+ country: "QA",
4855
+ ghcnh_id: null,
4856
+ icao: "OTHH",
4857
+ latitude: 25.2731,
4858
+ longitude: 51.608,
4859
+ name: "Doha Hamad International",
4860
+ tz: "Asia/Qatar",
4861
+ venues: [
4862
+ "polymarket"
4863
+ ]
4864
+ },
4865
+ {
4866
+ code: "RCTP",
4867
+ country: "TW",
4868
+ ghcnh_id: null,
4869
+ icao: "RCTP",
4870
+ latitude: 25.0777,
4871
+ longitude: 121.2328,
4872
+ name: "Taipei Taoyuan",
4873
+ tz: "Asia/Taipei",
4874
+ venues: [
4875
+ "polymarket"
4876
+ ]
4877
+ },
4878
+ {
4879
+ code: "RJAA",
4880
+ country: "JP",
4881
+ ghcnh_id: null,
4882
+ icao: "RJAA",
4883
+ latitude: 35.7647,
4884
+ longitude: 140.3864,
4885
+ name: "Tokyo Narita",
4886
+ tz: "Asia/Tokyo",
4887
+ venues: [
4888
+ "polymarket"
4889
+ ]
4890
+ },
4891
+ {
4892
+ code: "RJTT",
4893
+ country: "JP",
4894
+ ghcnh_id: null,
4895
+ icao: "RJTT",
4896
+ latitude: 35.5522,
4897
+ longitude: 139.78,
4898
+ name: "Tokyo Haneda",
4899
+ tz: "Asia/Tokyo",
4900
+ venues: [
4901
+ "polymarket"
4902
+ ]
4903
+ },
4904
+ {
4905
+ code: "RKSI",
4906
+ country: "KR",
4907
+ ghcnh_id: null,
4908
+ icao: "RKSI",
4909
+ latitude: 37.4691,
4910
+ longitude: 126.4505,
4911
+ name: "Seoul Incheon",
4912
+ tz: "Asia/Seoul",
4913
+ venues: [
4914
+ "polymarket"
4915
+ ]
4916
+ },
4917
+ {
4918
+ code: "SAEZ",
4919
+ country: "AR",
4920
+ ghcnh_id: null,
4921
+ icao: "SAEZ",
4922
+ latitude: -34.8222,
4923
+ longitude: -58.5358,
4924
+ name: "Buenos Aires Ezeiza",
4925
+ tz: "America/Argentina/Buenos_Aires",
4926
+ venues: [
4927
+ "polymarket"
4928
+ ]
4929
+ },
4930
+ {
4931
+ code: "SBGR",
4932
+ country: "BR",
4933
+ ghcnh_id: null,
4934
+ icao: "SBGR",
4935
+ latitude: -23.4356,
4936
+ longitude: -46.4731,
4937
+ name: "S\xE3o Paulo Guarulhos",
4938
+ tz: "America/Sao_Paulo",
4939
+ venues: [
4940
+ "polymarket"
4941
+ ]
4942
+ },
4943
+ {
4944
+ code: "UUEE",
4945
+ country: "RU",
4946
+ ghcnh_id: null,
4947
+ icao: "UUEE",
4948
+ latitude: 55.9728,
4949
+ longitude: 37.4147,
4950
+ name: "Moscow Sheremetyevo",
4951
+ tz: "Europe/Moscow",
4952
+ venues: [
4953
+ "polymarket"
4954
+ ]
4955
+ },
4956
+ {
4957
+ code: "VABB",
4958
+ country: "IN",
4959
+ ghcnh_id: null,
4960
+ icao: "VABB",
4961
+ latitude: 19.0887,
4962
+ longitude: 72.8679,
4963
+ name: "Mumbai Chhatrapati Shivaji",
4964
+ tz: "Asia/Kolkata",
4965
+ venues: [
4966
+ "polymarket"
4967
+ ]
4968
+ },
4969
+ {
4970
+ code: "VHHH",
4971
+ country: "HK",
4972
+ ghcnh_id: null,
4973
+ icao: "VHHH",
4974
+ latitude: 22.308,
4975
+ longitude: 113.9185,
4976
+ name: "Hong Kong International",
4977
+ tz: "Asia/Hong_Kong",
4978
+ venues: [
4979
+ "polymarket"
4980
+ ]
4981
+ },
4982
+ {
4983
+ code: "VIDP",
4984
+ country: "IN",
4985
+ ghcnh_id: null,
4986
+ icao: "VIDP",
4987
+ latitude: 28.5562,
4988
+ longitude: 77.1,
4989
+ name: "Delhi Indira Gandhi",
4990
+ tz: "Asia/Kolkata",
4991
+ venues: [
4992
+ "polymarket"
4993
+ ]
4994
+ },
4995
+ {
4996
+ code: "VTBS",
4997
+ country: "TH",
4998
+ ghcnh_id: null,
4999
+ icao: "VTBS",
5000
+ latitude: 13.69,
5001
+ longitude: 100.7501,
5002
+ name: "Bangkok Suvarnabhumi",
5003
+ tz: "Asia/Bangkok",
5004
+ venues: [
5005
+ "polymarket"
5006
+ ]
5007
+ },
5008
+ {
5009
+ code: "WSSS",
5010
+ country: "SG",
5011
+ ghcnh_id: null,
5012
+ icao: "WSSS",
5013
+ latitude: 1.3644,
5014
+ longitude: 103.9915,
5015
+ name: "Singapore Changi",
5016
+ tz: "Asia/Singapore",
5017
+ venues: [
5018
+ "polymarket"
5019
+ ]
5020
+ },
5021
+ {
5022
+ code: "YBBN",
5023
+ country: "AU",
5024
+ ghcnh_id: null,
5025
+ icao: "YBBN",
5026
+ latitude: -27.3842,
5027
+ longitude: 153.1175,
5028
+ name: "Brisbane",
5029
+ tz: "Australia/Brisbane",
5030
+ venues: [
5031
+ "polymarket"
5032
+ ]
5033
+ },
5034
+ {
5035
+ code: "YMML",
5036
+ country: "AU",
5037
+ ghcnh_id: null,
5038
+ icao: "YMML",
5039
+ latitude: -37.6733,
5040
+ longitude: 144.8433,
5041
+ name: "Melbourne Tullamarine",
5042
+ tz: "Australia/Melbourne",
5043
+ venues: [
5044
+ "polymarket"
5045
+ ]
5046
+ },
5047
+ {
5048
+ code: "YSSY",
5049
+ country: "AU",
5050
+ ghcnh_id: null,
5051
+ icao: "YSSY",
5052
+ latitude: -33.9461,
5053
+ longitude: 151.1772,
5054
+ name: "Sydney Kingsford Smith",
5055
+ tz: "Australia/Sydney",
5056
+ venues: [
5057
+ "polymarket"
5058
+ ]
5059
+ },
5060
+ {
5061
+ code: "ZBAA",
5062
+ country: "CN",
5063
+ ghcnh_id: null,
5064
+ icao: "ZBAA",
5065
+ latitude: 40.0801,
5066
+ longitude: 116.5846,
5067
+ name: "Beijing Capital",
5068
+ tz: "Asia/Shanghai",
5069
+ venues: [
5070
+ "polymarket"
5071
+ ]
5072
+ },
5073
+ {
5074
+ code: "ZSPD",
5075
+ country: "CN",
5076
+ ghcnh_id: null,
5077
+ icao: "ZSPD",
5078
+ latitude: 31.1443,
5079
+ longitude: 121.8083,
5080
+ name: "Shanghai Pudong",
5081
+ tz: "Asia/Shanghai",
5082
+ venues: [
5083
+ "polymarket"
5084
+ ]
5085
+ }
5086
+ ];
5087
+ var STATION_BY_CODE2 = /* @__PURE__ */ new Map([
5088
+ ["ATL", STATIONS2[10]],
5089
+ ["AUS", STATIONS2[11]],
5090
+ ["BNA", STATIONS2[12]],
5091
+ ["BOS", STATIONS2[13]],
5092
+ ["CVG", STATIONS2[14]],
5093
+ ["DCA", STATIONS2[15]],
5094
+ ["DEN", STATIONS2[16]],
5095
+ ["DFW", STATIONS2[17]],
5096
+ ["DTW", STATIONS2[18]],
5097
+ ["EDDB", STATIONS2[0]],
5098
+ ["EDDF", STATIONS2[1]],
5099
+ ["EDDM", STATIONS2[2]],
5100
+ ["EFHK", STATIONS2[3]],
5101
+ ["EGKK", STATIONS2[4]],
5102
+ ["EGLL", STATIONS2[5]],
5103
+ ["EHAM", STATIONS2[6]],
5104
+ ["EKCH", STATIONS2[7]],
5105
+ ["EPWA", STATIONS2[8]],
5106
+ ["ESSA", STATIONS2[9]],
5107
+ ["HOU", STATIONS2[19]],
5108
+ ["IAH", STATIONS2[20]],
5109
+ ["LAS", STATIONS2[21]],
5110
+ ["LAX", STATIONS2[22]],
5111
+ ["LEBL", STATIONS2[35]],
5112
+ ["LEMD", STATIONS2[36]],
5113
+ ["LFPB", STATIONS2[37]],
5114
+ ["LFPG", STATIONS2[38]],
5115
+ ["LFPO", STATIONS2[39]],
5116
+ ["LIMC", STATIONS2[40]],
5117
+ ["LIRF", STATIONS2[41]],
5118
+ ["LOWW", STATIONS2[42]],
5119
+ ["LSZH", STATIONS2[43]],
5120
+ ["MDW", STATIONS2[23]],
5121
+ ["MIA", STATIONS2[24]],
5122
+ ["MSP", STATIONS2[25]],
5123
+ ["MSY", STATIONS2[26]],
5124
+ ["NYC", STATIONS2[27]],
5125
+ ["NZAA", STATIONS2[44]],
5126
+ ["NZWN", STATIONS2[45]],
5127
+ ["OERK", STATIONS2[46]],
5128
+ ["OKC", STATIONS2[28]],
5129
+ ["OMDB", STATIONS2[47]],
5130
+ ["OTHH", STATIONS2[48]],
5131
+ ["PHL", STATIONS2[29]],
5132
+ ["PHX", STATIONS2[30]],
5133
+ ["RCTP", STATIONS2[49]],
5134
+ ["RJAA", STATIONS2[50]],
5135
+ ["RJTT", STATIONS2[51]],
5136
+ ["RKSI", STATIONS2[52]],
5137
+ ["SAEZ", STATIONS2[53]],
5138
+ ["SAT", STATIONS2[31]],
5139
+ ["SBGR", STATIONS2[54]],
5140
+ ["SEA", STATIONS2[32]],
5141
+ ["SFO", STATIONS2[33]],
5142
+ ["SLC", STATIONS2[34]],
5143
+ ["UUEE", STATIONS2[55]],
5144
+ ["VABB", STATIONS2[56]],
5145
+ ["VHHH", STATIONS2[57]],
5146
+ ["VIDP", STATIONS2[58]],
5147
+ ["VTBS", STATIONS2[59]],
5148
+ ["WSSS", STATIONS2[60]],
5149
+ ["YBBN", STATIONS2[61]],
5150
+ ["YMML", STATIONS2[62]],
5151
+ ["YSSY", STATIONS2[63]],
5152
+ ["ZBAA", STATIONS2[64]],
5153
+ ["ZSPD", STATIONS2[65]]
5154
+ ]);
5155
+ var STATION_BY_ICAO2 = /* @__PURE__ */ new Map([
5156
+ ["EDDB", STATIONS2[0]],
5157
+ ["EDDF", STATIONS2[1]],
5158
+ ["EDDM", STATIONS2[2]],
5159
+ ["EFHK", STATIONS2[3]],
5160
+ ["EGKK", STATIONS2[4]],
5161
+ ["EGLL", STATIONS2[5]],
5162
+ ["EHAM", STATIONS2[6]],
5163
+ ["EKCH", STATIONS2[7]],
5164
+ ["EPWA", STATIONS2[8]],
5165
+ ["ESSA", STATIONS2[9]],
5166
+ ["KATL", STATIONS2[10]],
5167
+ ["KAUS", STATIONS2[11]],
5168
+ ["KBNA", STATIONS2[12]],
5169
+ ["KBOS", STATIONS2[13]],
5170
+ ["KCVG", STATIONS2[14]],
5171
+ ["KDCA", STATIONS2[15]],
5172
+ ["KDEN", STATIONS2[16]],
5173
+ ["KDFW", STATIONS2[17]],
5174
+ ["KDTW", STATIONS2[18]],
5175
+ ["KHOU", STATIONS2[19]],
5176
+ ["KIAH", STATIONS2[20]],
5177
+ ["KLAS", STATIONS2[21]],
5178
+ ["KLAX", STATIONS2[22]],
5179
+ ["KMDW", STATIONS2[23]],
5180
+ ["KMIA", STATIONS2[24]],
5181
+ ["KMSP", STATIONS2[25]],
5182
+ ["KMSY", STATIONS2[26]],
5183
+ ["KNYC", STATIONS2[27]],
5184
+ ["KOKC", STATIONS2[28]],
5185
+ ["KPHL", STATIONS2[29]],
5186
+ ["KPHX", STATIONS2[30]],
5187
+ ["KSAT", STATIONS2[31]],
5188
+ ["KSEA", STATIONS2[32]],
5189
+ ["KSFO", STATIONS2[33]],
5190
+ ["KSLC", STATIONS2[34]],
5191
+ ["LEBL", STATIONS2[35]],
5192
+ ["LEMD", STATIONS2[36]],
5193
+ ["LFPB", STATIONS2[37]],
5194
+ ["LFPG", STATIONS2[38]],
5195
+ ["LFPO", STATIONS2[39]],
5196
+ ["LIMC", STATIONS2[40]],
5197
+ ["LIRF", STATIONS2[41]],
5198
+ ["LOWW", STATIONS2[42]],
5199
+ ["LSZH", STATIONS2[43]],
5200
+ ["NZAA", STATIONS2[44]],
5201
+ ["NZWN", STATIONS2[45]],
5202
+ ["OERK", STATIONS2[46]],
5203
+ ["OMDB", STATIONS2[47]],
5204
+ ["OTHH", STATIONS2[48]],
5205
+ ["RCTP", STATIONS2[49]],
5206
+ ["RJAA", STATIONS2[50]],
5207
+ ["RJTT", STATIONS2[51]],
5208
+ ["RKSI", STATIONS2[52]],
5209
+ ["SAEZ", STATIONS2[53]],
5210
+ ["SBGR", STATIONS2[54]],
5211
+ ["UUEE", STATIONS2[55]],
5212
+ ["VABB", STATIONS2[56]],
5213
+ ["VHHH", STATIONS2[57]],
5214
+ ["VIDP", STATIONS2[58]],
5215
+ ["VTBS", STATIONS2[59]],
5216
+ ["WSSS", STATIONS2[60]],
5217
+ ["YBBN", STATIONS2[61]],
5218
+ ["YMML", STATIONS2[62]],
5219
+ ["YSSY", STATIONS2[63]],
5220
+ ["ZBAA", STATIONS2[64]],
5221
+ ["ZSPD", STATIONS2[65]]
5222
+ ]);
5223
+ var LOW_COVERAGE_THRESHOLD = 12;
5224
+ var PARTS_CACHE = /* @__PURE__ */ new Map();
5225
+ function getDateFormatter(tz) {
5226
+ let f = PARTS_CACHE.get(tz);
5227
+ if (f === void 0) {
5228
+ f = new Intl.DateTimeFormat("en-US", {
5229
+ timeZone: tz,
5230
+ year: "numeric",
5231
+ month: "2-digit",
5232
+ day: "2-digit"
5233
+ });
5234
+ PARTS_CACHE.set(tz, f);
5235
+ }
5236
+ return f;
5237
+ }
5238
+ function localDateFor(instant, tz) {
5239
+ const parts = getDateFormatter(tz).formatToParts(instant);
5240
+ let y = "";
5241
+ let m = "";
5242
+ let d = "";
5243
+ for (const p of parts) {
5244
+ if (p.type === "year") y = p.value;
5245
+ else if (p.type === "month") m = p.value;
5246
+ else if (p.type === "day") d = p.value;
5247
+ }
5248
+ return `${y}-${m}-${d}`;
5249
+ }
5250
+ function parseInstant(observed) {
5251
+ if (observed === void 0 || observed === null || observed.length === 0) {
5252
+ return null;
5253
+ }
5254
+ const ms = Date.parse(observed);
5255
+ if (Number.isNaN(ms)) return null;
5256
+ return new Date(ms);
5257
+ }
5258
+ function roundHalfUp(value, places) {
5259
+ if (!Number.isFinite(value)) return value;
5260
+ const scale = 10 ** places;
5261
+ const sign = value < 0 ? -1 : 1;
5262
+ const abs = Math.abs(value);
5263
+ const rounded = Math.floor(abs * scale + 0.5 + abs * 1e-12) / scale;
5264
+ return sign * rounded;
5265
+ }
5266
+ function cToF(c) {
5267
+ return c * 1.8 + 32;
5268
+ }
5269
+ function internationalDailyExtremes(rows, opts) {
5270
+ const tz = opts.stationTz;
5271
+ if (typeof tz !== "string" || tz.length === 0) {
5272
+ throw new RangeError("internationalDailyExtremes: stationTz is required (non-empty string)");
5273
+ }
5274
+ const precision = opts.precision ?? 0;
5275
+ const minObs = opts.minObs ?? LOW_COVERAGE_THRESHOLD;
5276
+ try {
5277
+ getDateFormatter(tz);
5278
+ } catch (e) {
5279
+ throw new RangeError(
5280
+ `internationalDailyExtremes: invalid stationTz ${JSON.stringify(tz)}: ${e.message}`
5281
+ );
5282
+ }
5283
+ const byLocalDate = /* @__PURE__ */ new Map();
5284
+ for (const row of rows) {
5285
+ const instant = parseInstant(row.observed_at);
5286
+ if (instant === null) continue;
5287
+ const localDate = localDateFor(instant, tz);
5288
+ let bucket = byLocalDate.get(localDate);
5289
+ if (bucket === void 0) {
5290
+ bucket = { temps: [], precipMm: 0 };
5291
+ byLocalDate.set(localDate, bucket);
5292
+ }
5293
+ const t = row.temp_c;
5294
+ if (typeof t === "number" && Number.isFinite(t)) {
5295
+ bucket.temps.push({ value: t, source: row.source ?? null });
5296
+ }
5297
+ const p = row.precip_mm_1h;
5298
+ if (typeof p === "number" && Number.isFinite(p)) {
5299
+ bucket.precipMm += p;
5300
+ }
5301
+ }
5302
+ const out = [];
5303
+ const sortedDates = [...byLocalDate.keys()].sort();
5304
+ for (const localDate of sortedDates) {
5305
+ const bucket = byLocalDate.get(localDate);
5306
+ if (bucket === void 0) continue;
5307
+ const nObs = bucket.temps.length;
5308
+ let tempMinC = null;
5309
+ let tempMaxC = null;
5310
+ let tempMeanC = null;
5311
+ let sourceTmin = null;
5312
+ let sourceTmax = null;
5313
+ if (nObs > 0 && nObs >= minObs) {
5314
+ let minIdx = 0;
5315
+ let maxIdx = 0;
5316
+ let sum = 0;
5317
+ for (let i = 0; i < bucket.temps.length; i += 1) {
5318
+ const v = bucket.temps[i];
5319
+ sum += v.value;
5320
+ const minRow2 = bucket.temps[minIdx];
5321
+ const maxRow2 = bucket.temps[maxIdx];
5322
+ if (v.value < minRow2.value) minIdx = i;
5323
+ if (v.value > maxRow2.value) maxIdx = i;
5324
+ }
5325
+ const mean = sum / nObs;
5326
+ const minRow = bucket.temps[minIdx];
5327
+ const maxRow = bucket.temps[maxIdx];
5328
+ tempMinC = roundHalfUp(minRow.value, precision);
5329
+ tempMaxC = roundHalfUp(maxRow.value, precision);
5330
+ tempMeanC = roundHalfUp(mean, precision);
5331
+ sourceTmin = minRow.source;
5332
+ sourceTmax = maxRow.source;
5333
+ }
5334
+ out.push(
5335
+ Object.freeze({
5336
+ localDate,
5337
+ nObs,
5338
+ tempMinC,
5339
+ tempMaxC,
5340
+ tempMeanC,
5341
+ tempMinF: tempMinC === null ? null : roundHalfUp(cToF(tempMinC), precision),
5342
+ tempMaxF: tempMaxC === null ? null : roundHalfUp(cToF(tempMaxC), precision),
5343
+ precipMm: roundHalfUp(bucket.precipMm, 4),
5344
+ sourceTmin,
5345
+ sourceTmax
5346
+ })
5347
+ );
5348
+ }
5349
+ return out;
5350
+ }
5351
+ var BUILT_IN_SCHEMAS = Object.freeze([
5352
+ {
5353
+ id: "schema.observation.v1",
5354
+ title: "schema.observation.v1",
5355
+ columnCount: 20,
5356
+ columns: [
5357
+ { name: "dew_point_c", description: "units: celsius \u2014 bounded", nullable: true },
5358
+ { name: "event_time", description: "observation valid time", nullable: false },
5359
+ {
5360
+ name: "metar_raw",
5361
+ description: "raw METAR text if source has it; null for AWC JSON (structured-only)",
5362
+ nullable: true
5363
+ },
5364
+ {
5365
+ name: "observation_type",
5366
+ description: "METAR | SPECI; defaults METAR when source can't distinguish (e.g. AWC JSON)",
5367
+ nullable: false
5368
+ },
5369
+ {
5370
+ name: "precip_mm_1h",
5371
+ description: "units: mm \u2014 hourly precip (METAR p01i, converted from inches)",
5372
+ nullable: true
5373
+ },
5374
+ {
5375
+ name: "sky_base_1_m",
5376
+ description: "units: meters \u2014 first cloud layer base height (converted from feet)",
5377
+ nullable: true
5378
+ },
5379
+ { name: "sky_base_2_m", description: "units: meters", nullable: true },
5380
+ { name: "sky_base_3_m", description: "units: meters", nullable: true },
5381
+ { name: "sky_base_4_m", description: "units: meters", nullable: true },
5382
+ { name: "sky_cover_1", description: "first cloud layer cover code", nullable: true },
5383
+ { name: "sky_cover_2", description: "second layer; null if not present", nullable: true },
5384
+ { name: "sky_cover_3", description: "third layer; null if not present", nullable: true },
5385
+ { name: "sky_cover_4", description: "fourth layer; null if not present", nullable: true },
5386
+ {
5387
+ name: "slp_hpa",
5388
+ description: "units: hPa \u2014 sea-level pressure (canonical aviation unit, not converted across modes)",
5389
+ nullable: true
5390
+ },
5391
+ { name: "station", description: "ICAO/ASOS station ID (e.g. KORD)", nullable: false },
5392
+ {
5393
+ name: "temp_c",
5394
+ description: "units: celsius \u2014 bounded TEMP_MIN_C..TEMP_MAX_C",
5395
+ nullable: true
5396
+ },
5397
+ {
5398
+ name: "visibility_m",
5399
+ description: "units: meters \u2014 converted from statute miles",
5400
+ nullable: true
5401
+ },
5402
+ {
5403
+ name: "wind_dir_deg",
5404
+ description: "units: degrees \u2014 0-360, bounded",
5405
+ nullable: true
5406
+ },
5407
+ { name: "wind_gust_ms", description: "units: m/s \u2014 converted from kt", nullable: true },
5408
+ { name: "wind_speed_ms", description: "units: m/s \u2014 converted from kt", nullable: true }
5409
+ ]
5410
+ },
5411
+ {
5412
+ id: "schema.forecast.iem_mos.v1",
5413
+ title: "schema.forecast.iem_mos.v1",
5414
+ columnCount: 11,
5415
+ columns: [
5416
+ { name: "dew_point_c", description: "units: celsius", nullable: true },
5417
+ {
5418
+ name: "forecast_hour",
5419
+ description: "units: hours \u2014 (valid_at - issued_at).total_seconds() / 3600",
5420
+ nullable: false
5421
+ },
5422
+ {
5423
+ name: "issued_at",
5424
+ description: "model run time (from source `runtime` field)",
5425
+ nullable: false
5426
+ },
5427
+ { name: "model", description: "e.g. NBE, GFS, LAV, MET", nullable: false },
5428
+ {
5429
+ name: "precip_probability",
5430
+ description: "units: probability \u2014 bounded [0, 1]",
5431
+ nullable: true
5432
+ },
5433
+ {
5434
+ name: "sky_cover_pct",
5435
+ description: "units: percent \u2014 bounded [0, 100]",
5436
+ nullable: true
5437
+ },
5438
+ { name: "station", description: "", nullable: false },
5439
+ { name: "temp_c", description: "units: celsius", nullable: true },
5440
+ {
5441
+ name: "valid_at",
5442
+ description: "forecast target time (from source `ftime`)",
5443
+ nullable: false
5444
+ },
5445
+ { name: "wind_dir_deg", description: "units: degrees", nullable: true },
5446
+ { name: "wind_speed_ms", description: "units: m/s", nullable: true }
5447
+ ]
5448
+ },
5449
+ {
5450
+ id: "schema.settlement.cli.v1",
5451
+ title: "schema.settlement.cli.v1",
5452
+ columnCount: 12,
5453
+ columns: [
5454
+ {
5455
+ name: "cli_data_quality",
5456
+ description: "NWS CLI data-quality marker (Pitfall 6/16). Allows downstream code to filter or weight settlement rows by issuer quality without re-parsing the product header.",
5457
+ nullable: false
5458
+ },
5459
+ {
5460
+ name: "event_time",
5461
+ description: "00:00 local time on observation_date converted to UTC; for sort/join only",
5462
+ nullable: false
5463
+ },
5464
+ {
5465
+ name: "observation_date",
5466
+ description: "local climate day per NWS convention (no timezone applied to the date itself)",
5467
+ nullable: false
5468
+ },
5469
+ { name: "precipitation_in", description: "units: inches", nullable: true },
5470
+ {
5471
+ name: "product_release_time",
5472
+ description: "parsed from CLI product header (_climate.py::_parse_product_timestamp)",
5473
+ nullable: false
5474
+ },
5475
+ {
5476
+ name: "report_type",
5477
+ description: "preliminary | final | correction; dedup priority preliminary < final < correction",
5478
+ nullable: false
5479
+ },
5480
+ {
5481
+ name: "settlement_finality",
5482
+ description: "provisional | final | superseded. Kalshi NHIGH/NLOW settlement contractually requires 'final'; 'provisional' values are kept for early-look research only.",
5483
+ nullable: false
5484
+ },
5485
+ { name: "snowfall_in", description: "units: inches", nullable: true },
5486
+ { name: "station", description: "ICAO/ASOS station ID", nullable: false },
5487
+ {
5488
+ name: "station_tz",
5489
+ description: "IANA timezone for the station (e.g. America/Chicago for KORD). Required for local-climate-day semantics; see \xA7U.",
5490
+ nullable: false
5491
+ },
5492
+ {
5493
+ name: "temp_max_F",
5494
+ description: "units: fahrenheit \u2014 daily high (uppercase F for consistency with obs imperial mode)",
5495
+ nullable: true
5496
+ },
5497
+ { name: "temp_min_F", description: "units: fahrenheit \u2014 daily low", nullable: true }
5498
+ ]
5499
+ },
5500
+ {
5501
+ id: "schema.observation_ledger.v1",
5502
+ title: "schema.observation_ledger.v1",
5503
+ columnCount: 15,
5504
+ columns: [
5505
+ { name: "as_of_time", description: "", nullable: true },
5506
+ { name: "dewpoint_c", description: "units: celsius", nullable: true },
5507
+ { name: "ingestion_id", description: "", nullable: true },
5508
+ { name: "observation_kind", description: "", nullable: true },
5509
+ {
5510
+ name: "observation_quality",
5511
+ description: "Lineage row-quality flag per LINEAGE-01; distinct from qc_status enum slot AND distinct from the obs_qc_status bitmask column per QC-05.",
5512
+ nullable: true
5513
+ },
5514
+ { name: "observation_type", description: "", nullable: false },
5515
+ { name: "observed_at", description: "", nullable: false },
5516
+ { name: "parser_name", description: "", nullable: true },
5517
+ { name: "parser_version", description: "", nullable: true },
5518
+ { name: "provenance", description: "", nullable: true },
5519
+ { name: "qc_status", description: "", nullable: true },
5520
+ {
5521
+ name: "source",
5522
+ description: "ncei reserved per D-2.1-09; never written in v0.1.0.",
5523
+ nullable: false
5524
+ },
5525
+ { name: "source_received_at", description: "", nullable: true },
5526
+ { name: "station_code", description: "", nullable: false },
5527
+ { name: "temp_c", description: "units: celsius", nullable: true }
5528
+ ]
5529
+ },
5530
+ {
5531
+ id: "schema.observation_qc.v1",
5532
+ title: "schema.observation_qc.v1",
5533
+ columnCount: 13,
5534
+ columns: [
5535
+ { name: "as_of_time", description: "", nullable: true },
5536
+ {
5537
+ name: "detector_metadata",
5538
+ description: "JSON-serialized detector payload; shape per qc_system.",
5539
+ nullable: true
5540
+ },
5541
+ {
5542
+ name: "field",
5543
+ description: "Observation column the rule evaluated (e.g. temp_c).",
5544
+ nullable: false
5545
+ },
5546
+ { name: "flag", description: "", nullable: false },
5547
+ { name: "ingestion_id", description: "", nullable: true },
5548
+ { name: "observation_kind", description: "", nullable: true },
5549
+ { name: "observed_at", description: "", nullable: false },
5550
+ { name: "parser_name", description: "", nullable: true },
5551
+ { name: "qc_system", description: "", nullable: false },
5552
+ { name: "qc_version", description: "", nullable: false },
5553
+ { name: "rule_id", description: "", nullable: false },
5554
+ { name: "source", description: "", nullable: false },
5555
+ { name: "station_code", description: "", nullable: false }
5556
+ ]
5557
+ }
5558
+ ]);
5559
+ function deepFreezeSchema(info) {
5560
+ const frozenCols = Object.freeze(info.columns.map((c) => Object.freeze({ ...c })));
5561
+ return Object.freeze({ ...info, columns: frozenCols });
5562
+ }
5563
+ var REGISTRY = new Map(
5564
+ BUILT_IN_SCHEMAS.map((info) => [info.id, deepFreezeSchema(info)])
5565
+ );
5566
+ var FEATURE_NAMES = Object.freeze([
5567
+ "calendarFeatures",
5568
+ "clipOutliers",
5569
+ "diff",
5570
+ "diff2",
5571
+ "heatIndex",
5572
+ "lag",
5573
+ "rolling",
5574
+ "spread",
5575
+ "windChill"
5576
+ ]);
5577
+
5578
+ // ../weather/src/dailyExtremes.ts
5579
+ init_iem_asos();
5580
+ init_awc();
5581
+ init_iem();
5582
+ var LOW_COVERAGE_THRESHOLD2 = 12;
5583
+ function addUtcDays(iso, days) {
5584
+ const [yStr, mStr, dStr] = iso.split("-");
5585
+ const dt = new Date(Date.UTC(Number(yStr), Number(mStr) - 1, Number(dStr)));
5586
+ dt.setUTCDate(dt.getUTCDate() + days);
5587
+ const yyyy = dt.getUTCFullYear();
5588
+ const mm = String(dt.getUTCMonth() + 1).padStart(2, "0");
5589
+ const dd = String(dt.getUTCDate()).padStart(2, "0");
5590
+ return `${yyyy}-${mm}-${dd}`;
5591
+ }
5592
+ function lookupStation(icao) {
5593
+ const upper = icao.toUpperCase();
5594
+ for (const s of STATIONS) {
5595
+ if (s.icao === upper) {
5596
+ return { tz: s.tz, isUs: s.country === "US" };
5597
+ }
5598
+ }
5599
+ throw new Error(`dailyExtremes: station "${icao}" not in registry \u2014 check STATIONS catalog`);
5600
+ }
5601
+ function cToF2(c) {
5602
+ if (c === null) return null;
5603
+ return c * (9 / 5) + 32;
5604
+ }
5605
+ function roundHalfUp2(value, decimals) {
5606
+ const m = 10 ** decimals;
5607
+ return Math.round(value * m) / m;
5608
+ }
5609
+ async function fetchIemAsosObservations(station, fromDate, toDate) {
5610
+ const fromYear = Number.parseInt(fromDate.slice(0, 4), 10);
5611
+ const toYear = Number.parseInt(toDate.slice(0, 4), 10);
5612
+ const out = [];
5613
+ for (let year = fromYear; year <= toYear; year++) {
5614
+ const chunks = await downloadIemAsos(station, `${year}-01-01`, `${year}-12-31`, {
5615
+ reportType: 3,
5616
+ politenessMs: 1e3
5617
+ });
5618
+ for (const chunk of chunks) {
5619
+ const parsed = parseIemCsv(chunk.csv, { observationTypeOverride: "METAR" });
5620
+ for (const row of parsed) {
5621
+ const obsDate = row.observed_at.slice(0, 10);
5622
+ if (obsDate >= fromDate && obsDate <= toDate) {
5623
+ const precipInches = row.precip_1hr_inches ?? null;
5624
+ out.push({
5625
+ observed_at: row.observed_at,
5626
+ temp_c: row.temp_c ?? null,
5627
+ precip_mm_1h: precipInches !== null ? precipInches * 25.4 : null,
5628
+ source: row.source
5629
+ });
5630
+ }
5631
+ }
5632
+ }
5633
+ }
5634
+ return out;
5635
+ }
5636
+ async function fetchAwcObservations(station, fromDate, toDate) {
5637
+ const raw = await fetchAwcMetars([station]);
5638
+ const out = [];
5639
+ for (const r of raw) {
5640
+ const obs2 = awcToObservation(r);
5641
+ if (obs2 === null) continue;
5642
+ const obsDate = obs2.observed_at.slice(0, 10);
5643
+ if (obsDate >= fromDate && obsDate <= toDate) {
5644
+ const precipInches = obs2.precip_1hr_inches ?? null;
5645
+ out.push({
5646
+ observed_at: obs2.observed_at,
5647
+ temp_c: obs2.temp_c ?? null,
5648
+ precip_mm_1h: precipInches !== null ? precipInches * 25.4 : null,
5649
+ source: obs2.source
5650
+ });
5651
+ }
5652
+ }
5653
+ return out;
5654
+ }
5655
+ async function fetchForMode(station, fromDate, toDate, mode) {
5656
+ switch (mode) {
5657
+ case "iem_only":
5658
+ return fetchIemAsosObservations(station, fromDate, toDate);
5659
+ case "awc_only":
5660
+ return fetchAwcObservations(station, fromDate, toDate);
5661
+ case "live_v1": {
5662
+ const [iem, awc] = await Promise.all([
5663
+ fetchIemAsosObservations(station, fromDate, toDate),
5664
+ fetchAwcObservations(station, fromDate, toDate).catch(() => [])
5665
+ ]);
5666
+ return [...iem, ...awc];
5667
+ }
5668
+ default: {
5669
+ const _exhaustive = mode;
5670
+ throw new TypeError(`dailyExtremes: unknown merge mode "${String(_exhaustive)}"`);
5671
+ }
5672
+ }
5673
+ }
5674
+ function projectRow(station, d, isUs) {
5675
+ const lowCoverage = d.nObs < LOW_COVERAGE_THRESHOLD2;
5676
+ const decimals = isUs ? 0 : 1;
5677
+ const precipIn = d.precipMm !== null && d.precipMm !== void 0 ? roundHalfUp2(d.precipMm / 25.4, 2) : null;
5678
+ if (lowCoverage) {
5679
+ return {
5680
+ date: d.localDate,
5681
+ station,
5682
+ tmin_f: null,
5683
+ tmax_f: null,
5684
+ tmean_f: null,
5685
+ precip_in: precipIn,
5686
+ low_coverage: true,
5687
+ n_obs: d.nObs
5688
+ };
5689
+ }
5690
+ return {
5691
+ date: d.localDate,
5692
+ station,
5693
+ tmin_f: d.tempMinF !== null ? roundHalfUp2(d.tempMinF, decimals) : null,
5694
+ tmax_f: d.tempMaxF !== null ? roundHalfUp2(d.tempMaxF, decimals) : null,
5695
+ tmean_f: d.tempMeanC !== null ? roundHalfUp2(cToF2(d.tempMeanC), decimals) : null,
5696
+ precip_in: precipIn,
5697
+ low_coverage: false,
5698
+ n_obs: d.nObs
5699
+ };
5700
+ }
5701
+ async function dailyExtremes(station, fromDate, toDate, opts = {}) {
5702
+ const { tz, isUs } = lookupStation(station);
5703
+ const merge = opts.merge ?? "live_v1";
5704
+ const fetchFrom = addUtcDays(fromDate, -1);
5705
+ const fetchTo = addUtcDays(toDate, 1);
5706
+ const rows = await fetchForMode(station, fetchFrom, fetchTo, merge);
5707
+ const extremes = internationalDailyExtremes(rows, {
5708
+ stationTz: tz,
5709
+ precision: isUs ? 1 : 0
5710
+ });
5711
+ return extremes.filter((d) => d.localDate >= fromDate && d.localDate <= toDate).map((d) => projectRow(station.toUpperCase(), d, isUs));
5712
+ }
5713
+
5714
+ // ../weather/src/obs.ts
5715
+ init_src();
5716
+ init_iem_asos();
5717
+ init_awc();
5718
+ init_iem();
5719
+ function daysBetween(fromDate, toDate) {
5720
+ const from = Date.UTC(
5721
+ Number.parseInt(fromDate.slice(0, 4), 10),
5722
+ Number.parseInt(fromDate.slice(5, 7), 10) - 1,
5723
+ Number.parseInt(fromDate.slice(8, 10), 10)
5724
+ );
5725
+ const to = Date.UTC(
5726
+ Number.parseInt(toDate.slice(0, 4), 10),
5727
+ Number.parseInt(toDate.slice(5, 7), 10) - 1,
5728
+ Number.parseInt(toDate.slice(8, 10), 10)
5729
+ );
5730
+ return Math.round((to - from) / (24 * 60 * 60 * 1e3)) + 1;
5731
+ }
5732
+ function resolveAutoStrategy(fromDate, toDate) {
5733
+ return daysBetween(fromDate, toDate) <= 7 ? "exact_window" : "warm_cache";
5734
+ }
5735
+ function inchesToMm(inches) {
5736
+ if (inches === null || inches === void 0) return null;
5737
+ return inches * 25.4;
5738
+ }
5739
+ function mbToInhg(mb) {
5740
+ if (mb === null || mb === void 0) return null;
5741
+ return mb * 0.029529983071445;
5742
+ }
5743
+ function fromObservation(o) {
5744
+ const tempC = o.temp_c ?? null;
5745
+ const dewC = o.dewpoint_c ?? null;
5746
+ return {
5747
+ station: o.station_code,
5748
+ observed_at: o.observed_at,
5749
+ source: o.source,
5750
+ temp_c: tempC,
5751
+ temp_f: tempC !== null ? tempC * (9 / 5) + 32 : null,
5752
+ dewpoint_c: dewC,
5753
+ dewpoint_f: dewC !== null ? dewC * (9 / 5) + 32 : null,
5754
+ wind_speed_kts: o.wind_speed_kt ?? null,
5755
+ wind_direction_deg: o.wind_dir_degrees ?? null,
5756
+ pressure_inhg: mbToInhg(o.sea_level_pressure_mb),
5757
+ precip_mm_1h: inchesToMm(o.precip_1hr_inches),
5758
+ raw_metar: o.raw_metar ?? null
5759
+ };
5760
+ }
5761
+ async function fetchIemForWindow(station, fromDate, toDate, resolvedStrategy) {
5762
+ const out = [];
5763
+ if (resolvedStrategy === "exact_window") {
5764
+ const chunks = await downloadIemAsos(station, fromDate, toDate, {
5765
+ reportType: 3,
5766
+ politenessMs: 1e3
5767
+ });
5768
+ for (const chunk of chunks) {
5769
+ const rows = parseIemCsv(chunk.csv, { observationTypeOverride: "METAR" });
5770
+ for (const r of rows) {
5771
+ const d = r.observed_at.slice(0, 10);
5772
+ if (d >= fromDate && d <= toDate) out.push(fromObservation(r));
5773
+ }
5774
+ }
5775
+ return out;
5776
+ }
5777
+ const fromYear = Number.parseInt(fromDate.slice(0, 4), 10);
5778
+ const toYear = Number.parseInt(toDate.slice(0, 4), 10);
5779
+ for (let year = fromYear; year <= toYear; year++) {
5780
+ const chunks = await downloadIemAsos(station, `${year}-01-01`, `${year}-12-31`, {
5781
+ reportType: 3,
5782
+ politenessMs: 1e3
5783
+ });
5784
+ for (const chunk of chunks) {
5785
+ const rows = parseIemCsv(chunk.csv, { observationTypeOverride: "METAR" });
5786
+ for (const r of rows) {
5787
+ const d = r.observed_at.slice(0, 10);
5788
+ if (d >= fromDate && d <= toDate) out.push(fromObservation(r));
5789
+ }
5790
+ }
5791
+ }
5792
+ return out;
5793
+ }
5794
+ async function fetchAwcForWindow(station, fromDate, toDate) {
5795
+ const raw = await fetchAwcMetars([station]);
5796
+ const out = [];
5797
+ for (const r of raw) {
5798
+ const obs2 = awcToObservation(r);
5799
+ if (obs2 === null) continue;
5800
+ const d = obs2.observed_at.slice(0, 10);
5801
+ if (d >= fromDate && d <= toDate) out.push(fromObservation(obs2));
5802
+ }
5803
+ return out;
5804
+ }
5805
+ async function fetchByStrategy(station, fromDate, toDate, resolvedStrategy, source) {
5806
+ const wantsIem = source === null || source === void 0 || source === "iem";
5807
+ const wantsAwc = source === null || source === void 0 || source === "awc";
5808
+ const tasks = [];
5809
+ if (wantsIem) tasks.push(fetchIemForWindow(station, fromDate, toDate, resolvedStrategy));
5810
+ if (wantsAwc) tasks.push(fetchAwcForWindow(station, fromDate, toDate).catch(() => []));
5811
+ const results = await Promise.all(tasks);
5812
+ return results.flat();
5813
+ }
5814
+ async function obs(station, fromDate, toDate, opts = {}) {
5815
+ const strategy = opts.strategy ?? "auto";
5816
+ const source = opts.source ?? null;
5817
+ if (source === "ghcnh") {
5818
+ throw new DataAvailabilityError({
5819
+ reason: "model_unavailable",
5820
+ source: "obs.ghcnh",
5821
+ hint: "source='ghcnh' is a valid Python `obs()` filter but the GHCNh fetcher path is not yet wired in the TypeScript SDK. Use source='iem' or source='awc' (or omit `source` for merged) until the TS GHCNh fetcher ships."
5822
+ });
5823
+ }
5824
+ if (strategy === "hosted") {
5825
+ throw new DataAvailabilityError({
5826
+ reason: "model_unavailable",
5827
+ source: "obs-hosted-stub",
5828
+ hint: "hosted ingest API ships in v0.2.x \u2014 use strategy='exact_window' or 'warm_cache' for v1.x. See https://mostlyright.md/docs/sdk/typescript/ingest-strategies"
5829
+ });
5830
+ }
5831
+ let resolved;
5832
+ if (strategy === "auto") {
5833
+ resolved = resolveAutoStrategy(fromDate, toDate);
5834
+ } else if (strategy === "exact_window" || strategy === "warm_cache") {
5835
+ resolved = strategy;
5836
+ } else {
5837
+ throw new TypeError(
5838
+ `obs: unknown strategy "${String(strategy)}" \u2014 expected one of: auto, exact_window, warm_cache, hosted`
5839
+ );
5840
+ }
5841
+ return fetchByStrategy(station, fromDate, toDate, resolved, source);
5842
+ }
5843
+
5844
+ // ../weather/src/index.ts
5845
+ var version2 = "0.0.0";
5846
+ function helloWeather() {
5847
+ return "hello @mostlyrightmd/weather";
5848
+ }
5849
+
5850
+ // ../markets/src/index.ts
5851
+ var src_exports3 = {};
5852
+ __export(src_exports3, {
5853
+ ContractIdError: () => ContractIdError,
5854
+ KALSHI_SETTLEMENT_STATIONS: () => KALSHI_SETTLEMENT_STATIONS,
5855
+ KNOWN_WRONG_STATIONS: () => KNOWN_WRONG_STATIONS,
5856
+ POLYMARKET_CITY_STATIONS: () => POLYMARKET_CITY_STATIONS,
5857
+ helloMarkets: () => helloMarkets,
5858
+ kalshiNhighResolve: () => kalshiNhighResolve,
5859
+ kalshiNlowResolve: () => kalshiNlowResolve,
5860
+ kalshiSettlementFor: () => kalshiSettlementFor,
5861
+ version: () => version3
5862
+ });
5863
+
5864
+ // ../markets/src/data/generated/kalshi-stations.ts
5865
+ var KALSHI_SETTLEMENT_STATIONS = {
5866
+ ATL: {
5867
+ citation: "https://kalshi.com/markets/khighatl (Atlanta Hartsfield-Jackson)",
5868
+ station: "KATL"
5869
+ },
5870
+ AUS: {
5871
+ citation: "https://kalshi.com/markets/khighaus (Austin-Bergstrom; the only Austin station Kalshi cites)",
5872
+ station: "KAUS"
5873
+ },
5874
+ BNA: {
5875
+ citation: "https://kalshi.com/markets/khighbna (Nashville International)",
5876
+ station: "KBNA"
5877
+ },
5878
+ BOS: {
5879
+ citation: "https://kalshi.com/markets/khighbos (Boston Logan)",
5880
+ station: "KBOS"
5881
+ },
5882
+ CHI: {
5883
+ citation: "https://kalshi.com/markets/khighchi (Midway, NOT ORD)",
5884
+ station: "KMDW"
5885
+ },
5886
+ CVG: {
5887
+ citation: "https://kalshi.com/markets/khighcvg (Cincinnati/Northern Kentucky International)",
5888
+ station: "KCVG"
5889
+ },
5890
+ DAL: {
5891
+ citation: "https://kalshi.com/markets/khighdal (DFW, NOT Love Field)",
5892
+ station: "KDFW"
5893
+ },
5894
+ DCA: {
5895
+ citation: "https://kalshi.com/markets/khighdca (Reagan National, NOT Dulles or BWI)",
5896
+ station: "KDCA"
5897
+ },
5898
+ DEN: {
5899
+ citation: "https://kalshi.com/markets/khighden (Denver International)",
5900
+ station: "KDEN"
5901
+ },
5902
+ DTW: {
5903
+ citation: "https://kalshi.com/markets/khighdtw (Detroit Metropolitan)",
3428
5904
  station: "KDTW"
3429
5905
  },
3430
5906
  HOU: {
@@ -3466,6 +5942,10 @@ var mostlyright = (() => {
3466
5942
  SLC: {
3467
5943
  citation: "https://kalshi.com/markets/khighslc (Salt Lake City International)",
3468
5944
  station: "KSLC"
5945
+ },
5946
+ TLV: {
5947
+ citation: "https://kalshi.com/markets/kxhightlv (Harry Reid/McCarran; settles vs NWS CLILAS)",
5948
+ station: "KLAS"
3469
5949
  }
3470
5950
  };
3471
5951
  var KNOWN_WRONG_STATIONS = /* @__PURE__ */ new Set([
@@ -4057,10 +6537,11 @@ var mostlyright = (() => {
4057
6537
  }
4058
6538
  }));
4059
6539
 
4060
- // ../core/dist/internal/chunk-PKJXHY27.mjs
6540
+ // ../core/dist/internal/chunk-QDQSYUFW.mjs
4061
6541
  function lockKeyFor(key) {
4062
6542
  return `mostlyright:cache:lock:${key}`;
4063
6543
  }
6544
+ var CACHE_SCHEMA_VERSION = "v2-phase18-integer-f";
4064
6545
  var MemoryStore = class {
4065
6546
  #entries = /* @__PURE__ */ new Map();
4066
6547
  #chain = /* @__PURE__ */ new Map();
@@ -4207,7 +6688,71 @@ var mostlyright = (() => {
4207
6688
  return next;
4208
6689
  }
4209
6690
  };
4210
- var STATIONS2 = [
6691
+ var VERSION_FIELD = "_cache_schema_version";
6692
+ function isVersionedEntry(v) {
6693
+ if (v === null || typeof v !== "object") return false;
6694
+ if (!(VERSION_FIELD in v)) return false;
6695
+ return typeof v[VERSION_FIELD] === "string";
6696
+ }
6697
+ function hasListKeys(s) {
6698
+ return typeof s.listKeys === "function";
6699
+ }
6700
+ var VersionedCacheStore = class {
6701
+ #inner;
6702
+ #version;
6703
+ constructor(inner, version5) {
6704
+ if (typeof version5 !== "string" || version5.length === 0) {
6705
+ throw new TypeError("versionedCacheStore: version must be a non-empty string");
6706
+ }
6707
+ this.#inner = inner;
6708
+ this.#version = version5;
6709
+ }
6710
+ /**
6711
+ * Test/diagnostics seam: return the underlying store so tests can assert
6712
+ * which concrete backend `defaultCacheStore()` selected. NOT a production
6713
+ * API — production code MUST use the wrapped store so version
6714
+ * invalidation fires on stale reads.
6715
+ *
6716
+ * @internal
6717
+ */
6718
+ __peekInner() {
6719
+ return this.#inner;
6720
+ }
6721
+ async get(key) {
6722
+ const raw = await this.#inner.get(key);
6723
+ if (raw === null) return null;
6724
+ if (!isVersionedEntry(raw)) {
6725
+ return null;
6726
+ }
6727
+ if (raw._cache_schema_version !== this.#version) {
6728
+ return null;
6729
+ }
6730
+ return raw.value;
6731
+ }
6732
+ async set(key, value, opts) {
6733
+ const wrapped = {
6734
+ value,
6735
+ [VERSION_FIELD]: this.#version
6736
+ };
6737
+ await this.#inner.set(key, wrapped, opts);
6738
+ }
6739
+ async delete(key) {
6740
+ await this.#inner.delete(key);
6741
+ }
6742
+ async withLock(key, fn) {
6743
+ return this.#inner.withLock(key, fn);
6744
+ }
6745
+ async listKeys(prefix) {
6746
+ if (hasListKeys(this.#inner)) {
6747
+ return this.#inner.listKeys(prefix);
6748
+ }
6749
+ return Object.freeze([]);
6750
+ }
6751
+ };
6752
+ function versionedCacheStore(inner, version5) {
6753
+ return new VersionedCacheStore(inner, version5);
6754
+ }
6755
+ var STATIONS3 = [
4211
6756
  {
4212
6757
  code: "EDDB",
4213
6758
  country: "DE",
@@ -4216,7 +6761,10 @@ var mostlyright = (() => {
4216
6761
  latitude: 52.3667,
4217
6762
  longitude: 13.5033,
4218
6763
  name: "Berlin Brandenburg",
4219
- tz: "Europe/Berlin"
6764
+ tz: "Europe/Berlin",
6765
+ venues: [
6766
+ "polymarket"
6767
+ ]
4220
6768
  },
4221
6769
  {
4222
6770
  code: "EDDF",
@@ -4226,7 +6774,10 @@ var mostlyright = (() => {
4226
6774
  latitude: 50.0379,
4227
6775
  longitude: 8.5622,
4228
6776
  name: "Frankfurt am Main",
4229
- tz: "Europe/Berlin"
6777
+ tz: "Europe/Berlin",
6778
+ venues: [
6779
+ "polymarket"
6780
+ ]
4230
6781
  },
4231
6782
  {
4232
6783
  code: "EDDM",
@@ -4236,7 +6787,10 @@ var mostlyright = (() => {
4236
6787
  latitude: 48.3538,
4237
6788
  longitude: 11.7861,
4238
6789
  name: "Munich Franz Josef Strauss",
4239
- tz: "Europe/Berlin"
6790
+ tz: "Europe/Berlin",
6791
+ venues: [
6792
+ "polymarket"
6793
+ ]
4240
6794
  },
4241
6795
  {
4242
6796
  code: "EFHK",
@@ -4246,7 +6800,10 @@ var mostlyright = (() => {
4246
6800
  latitude: 60.3172,
4247
6801
  longitude: 24.9633,
4248
6802
  name: "Helsinki-Vantaa",
4249
- tz: "Europe/Helsinki"
6803
+ tz: "Europe/Helsinki",
6804
+ venues: [
6805
+ "polymarket"
6806
+ ]
4250
6807
  },
4251
6808
  {
4252
6809
  code: "EGKK",
@@ -4256,7 +6813,10 @@ var mostlyright = (() => {
4256
6813
  latitude: 51.1481,
4257
6814
  longitude: -0.1903,
4258
6815
  name: "London Gatwick",
4259
- tz: "Europe/London"
6816
+ tz: "Europe/London",
6817
+ venues: [
6818
+ "polymarket"
6819
+ ]
4260
6820
  },
4261
6821
  {
4262
6822
  code: "EGLL",
@@ -4266,7 +6826,10 @@ var mostlyright = (() => {
4266
6826
  latitude: 51.4706,
4267
6827
  longitude: -0.4619,
4268
6828
  name: "London Heathrow",
4269
- tz: "Europe/London"
6829
+ tz: "Europe/London",
6830
+ venues: [
6831
+ "polymarket"
6832
+ ]
4270
6833
  },
4271
6834
  {
4272
6835
  code: "EHAM",
@@ -4276,7 +6839,10 @@ var mostlyright = (() => {
4276
6839
  latitude: 52.3086,
4277
6840
  longitude: 4.7639,
4278
6841
  name: "Amsterdam Schiphol",
4279
- tz: "Europe/Amsterdam"
6842
+ tz: "Europe/Amsterdam",
6843
+ venues: [
6844
+ "polymarket"
6845
+ ]
4280
6846
  },
4281
6847
  {
4282
6848
  code: "EKCH",
@@ -4286,7 +6852,10 @@ var mostlyright = (() => {
4286
6852
  latitude: 55.6181,
4287
6853
  longitude: 12.6561,
4288
6854
  name: "Copenhagen Kastrup",
4289
- tz: "Europe/Copenhagen"
6855
+ tz: "Europe/Copenhagen",
6856
+ venues: [
6857
+ "polymarket"
6858
+ ]
4290
6859
  },
4291
6860
  {
4292
6861
  code: "EPWA",
@@ -4296,7 +6865,10 @@ var mostlyright = (() => {
4296
6865
  latitude: 52.1657,
4297
6866
  longitude: 20.9671,
4298
6867
  name: "Warsaw Chopin",
4299
- tz: "Europe/Warsaw"
6868
+ tz: "Europe/Warsaw",
6869
+ venues: [
6870
+ "polymarket"
6871
+ ]
4300
6872
  },
4301
6873
  {
4302
6874
  code: "ESSA",
@@ -4306,7 +6878,10 @@ var mostlyright = (() => {
4306
6878
  latitude: 59.6519,
4307
6879
  longitude: 17.9186,
4308
6880
  name: "Stockholm Arlanda",
4309
- tz: "Europe/Stockholm"
6881
+ tz: "Europe/Stockholm",
6882
+ venues: [
6883
+ "polymarket"
6884
+ ]
4310
6885
  },
4311
6886
  {
4312
6887
  code: "ATL",
@@ -4316,7 +6891,11 @@ var mostlyright = (() => {
4316
6891
  latitude: 33.6407,
4317
6892
  longitude: -84.4277,
4318
6893
  name: "Hartsfield-Jackson Atlanta International",
4319
- tz: "America/New_York"
6894
+ tz: "America/New_York",
6895
+ venues: [
6896
+ "kalshi",
6897
+ "polymarket"
6898
+ ]
4320
6899
  },
4321
6900
  {
4322
6901
  code: "AUS",
@@ -4326,7 +6905,24 @@ var mostlyright = (() => {
4326
6905
  latitude: 30.1975,
4327
6906
  longitude: -97.6664,
4328
6907
  name: "Austin-Bergstrom International",
4329
- tz: "America/Chicago"
6908
+ tz: "America/Chicago",
6909
+ venues: [
6910
+ "kalshi",
6911
+ "polymarket"
6912
+ ]
6913
+ },
6914
+ {
6915
+ code: "BNA",
6916
+ country: "US",
6917
+ ghcnh_id: "USW00013897",
6918
+ icao: "KBNA",
6919
+ latitude: 36.1245,
6920
+ longitude: -86.6782,
6921
+ name: "Nashville International",
6922
+ tz: "America/Chicago",
6923
+ venues: [
6924
+ "kalshi"
6925
+ ]
4330
6926
  },
4331
6927
  {
4332
6928
  code: "BOS",
@@ -4336,7 +6932,24 @@ var mostlyright = (() => {
4336
6932
  latitude: 42.3656,
4337
6933
  longitude: -71.0096,
4338
6934
  name: "Boston Logan International",
4339
- tz: "America/New_York"
6935
+ tz: "America/New_York",
6936
+ venues: [
6937
+ "kalshi",
6938
+ "polymarket"
6939
+ ]
6940
+ },
6941
+ {
6942
+ code: "CVG",
6943
+ country: "US",
6944
+ ghcnh_id: "USW00093814",
6945
+ icao: "KCVG",
6946
+ latitude: 39.0488,
6947
+ longitude: -84.6678,
6948
+ name: "Cincinnati/Northern Kentucky International",
6949
+ tz: "America/New_York",
6950
+ venues: [
6951
+ "kalshi"
6952
+ ]
4340
6953
  },
4341
6954
  {
4342
6955
  code: "DCA",
@@ -4346,7 +6959,11 @@ var mostlyright = (() => {
4346
6959
  latitude: 38.8512,
4347
6960
  longitude: -77.0402,
4348
6961
  name: "Washington Reagan National",
4349
- tz: "America/New_York"
6962
+ tz: "America/New_York",
6963
+ venues: [
6964
+ "kalshi",
6965
+ "polymarket"
6966
+ ]
4350
6967
  },
4351
6968
  {
4352
6969
  code: "DEN",
@@ -4356,7 +6973,11 @@ var mostlyright = (() => {
4356
6973
  latitude: 39.8561,
4357
6974
  longitude: -104.6737,
4358
6975
  name: "Denver International",
4359
- tz: "America/Denver"
6976
+ tz: "America/Denver",
6977
+ venues: [
6978
+ "kalshi",
6979
+ "polymarket"
6980
+ ]
4360
6981
  },
4361
6982
  {
4362
6983
  code: "DFW",
@@ -4366,7 +6987,25 @@ var mostlyright = (() => {
4366
6987
  latitude: 32.8998,
4367
6988
  longitude: -97.0403,
4368
6989
  name: "Dallas-Fort Worth International",
4369
- tz: "America/Chicago"
6990
+ tz: "America/Chicago",
6991
+ venues: [
6992
+ "kalshi",
6993
+ "polymarket"
6994
+ ]
6995
+ },
6996
+ {
6997
+ code: "DTW",
6998
+ country: "US",
6999
+ ghcnh_id: "USW00094847",
7000
+ icao: "KDTW",
7001
+ latitude: 42.2124,
7002
+ longitude: -83.3534,
7003
+ name: "Detroit Metropolitan Wayne County",
7004
+ tz: "America/New_York",
7005
+ venues: [
7006
+ "kalshi",
7007
+ "polymarket"
7008
+ ]
4370
7009
  },
4371
7010
  {
4372
7011
  code: "HOU",
@@ -4376,7 +7015,22 @@ var mostlyright = (() => {
4376
7015
  latitude: 29.6454,
4377
7016
  longitude: -95.2789,
4378
7017
  name: "Houston Hobby",
4379
- tz: "America/Chicago"
7018
+ tz: "America/Chicago",
7019
+ venues: []
7020
+ },
7021
+ {
7022
+ code: "IAH",
7023
+ country: "US",
7024
+ ghcnh_id: "USW00012960",
7025
+ icao: "KIAH",
7026
+ latitude: 29.9844,
7027
+ longitude: -95.3414,
7028
+ name: "Houston George Bush Intercontinental",
7029
+ tz: "America/Chicago",
7030
+ venues: [
7031
+ "kalshi",
7032
+ "polymarket"
7033
+ ]
4380
7034
  },
4381
7035
  {
4382
7036
  code: "LAS",
@@ -4386,7 +7040,10 @@ var mostlyright = (() => {
4386
7040
  latitude: 36.084,
4387
7041
  longitude: -115.1537,
4388
7042
  name: "Harry Reid (McCarran) International",
4389
- tz: "America/Los_Angeles"
7043
+ tz: "America/Los_Angeles",
7044
+ venues: [
7045
+ "kalshi"
7046
+ ]
4390
7047
  },
4391
7048
  {
4392
7049
  code: "LAX",
@@ -4396,7 +7053,11 @@ var mostlyright = (() => {
4396
7053
  latitude: 33.9425,
4397
7054
  longitude: -118.4081,
4398
7055
  name: "Los Angeles International",
4399
- tz: "America/Los_Angeles"
7056
+ tz: "America/Los_Angeles",
7057
+ venues: [
7058
+ "kalshi",
7059
+ "polymarket"
7060
+ ]
4400
7061
  },
4401
7062
  {
4402
7063
  code: "MDW",
@@ -4406,7 +7067,10 @@ var mostlyright = (() => {
4406
7067
  latitude: 41.7868,
4407
7068
  longitude: -87.7522,
4408
7069
  name: "Chicago Midway International",
4409
- tz: "America/Chicago"
7070
+ tz: "America/Chicago",
7071
+ venues: [
7072
+ "kalshi"
7073
+ ]
4410
7074
  },
4411
7075
  {
4412
7076
  code: "MIA",
@@ -4416,7 +7080,11 @@ var mostlyright = (() => {
4416
7080
  latitude: 25.7959,
4417
7081
  longitude: -80.287,
4418
7082
  name: "Miami International",
4419
- tz: "America/New_York"
7083
+ tz: "America/New_York",
7084
+ venues: [
7085
+ "kalshi",
7086
+ "polymarket"
7087
+ ]
4420
7088
  },
4421
7089
  {
4422
7090
  code: "MSP",
@@ -4426,7 +7094,11 @@ var mostlyright = (() => {
4426
7094
  latitude: 44.8848,
4427
7095
  longitude: -93.2223,
4428
7096
  name: "Minneapolis-St Paul International",
4429
- tz: "America/Chicago"
7097
+ tz: "America/Chicago",
7098
+ venues: [
7099
+ "kalshi",
7100
+ "polymarket"
7101
+ ]
4430
7102
  },
4431
7103
  {
4432
7104
  code: "MSY",
@@ -4436,7 +7108,8 @@ var mostlyright = (() => {
4436
7108
  latitude: 29.9934,
4437
7109
  longitude: -90.258,
4438
7110
  name: "New Orleans Louis Armstrong International",
4439
- tz: "America/Chicago"
7111
+ tz: "America/Chicago",
7112
+ venues: []
4440
7113
  },
4441
7114
  {
4442
7115
  code: "NYC",
@@ -4446,7 +7119,10 @@ var mostlyright = (() => {
4446
7119
  latitude: 40.7789,
4447
7120
  longitude: -73.9692,
4448
7121
  name: "Central Park, New York",
4449
- tz: "America/New_York"
7122
+ tz: "America/New_York",
7123
+ venues: [
7124
+ "kalshi"
7125
+ ]
4450
7126
  },
4451
7127
  {
4452
7128
  code: "OKC",
@@ -4456,7 +7132,8 @@ var mostlyright = (() => {
4456
7132
  latitude: 35.3931,
4457
7133
  longitude: -97.6007,
4458
7134
  name: "Oklahoma City Will Rogers World",
4459
- tz: "America/Chicago"
7135
+ tz: "America/Chicago",
7136
+ venues: []
4460
7137
  },
4461
7138
  {
4462
7139
  code: "PHL",
@@ -4466,7 +7143,11 @@ var mostlyright = (() => {
4466
7143
  latitude: 39.8721,
4467
7144
  longitude: -75.2411,
4468
7145
  name: "Philadelphia International",
4469
- tz: "America/New_York"
7146
+ tz: "America/New_York",
7147
+ venues: [
7148
+ "kalshi",
7149
+ "polymarket"
7150
+ ]
4470
7151
  },
4471
7152
  {
4472
7153
  code: "PHX",
@@ -4476,7 +7157,11 @@ var mostlyright = (() => {
4476
7157
  latitude: 33.4373,
4477
7158
  longitude: -112.0078,
4478
7159
  name: "Phoenix Sky Harbor International",
4479
- tz: "America/Phoenix"
7160
+ tz: "America/Phoenix",
7161
+ venues: [
7162
+ "kalshi",
7163
+ "polymarket"
7164
+ ]
4480
7165
  },
4481
7166
  {
4482
7167
  code: "SAT",
@@ -4486,7 +7171,8 @@ var mostlyright = (() => {
4486
7171
  latitude: 29.5337,
4487
7172
  longitude: -98.4698,
4488
7173
  name: "San Antonio International",
4489
- tz: "America/Chicago"
7174
+ tz: "America/Chicago",
7175
+ venues: []
4490
7176
  },
4491
7177
  {
4492
7178
  code: "SEA",
@@ -4496,7 +7182,11 @@ var mostlyright = (() => {
4496
7182
  latitude: 47.4502,
4497
7183
  longitude: -122.3088,
4498
7184
  name: "Seattle-Tacoma International",
4499
- tz: "America/Los_Angeles"
7185
+ tz: "America/Los_Angeles",
7186
+ venues: [
7187
+ "kalshi",
7188
+ "polymarket"
7189
+ ]
4500
7190
  },
4501
7191
  {
4502
7192
  code: "SFO",
@@ -4506,7 +7196,24 @@ var mostlyright = (() => {
4506
7196
  latitude: 37.6213,
4507
7197
  longitude: -122.379,
4508
7198
  name: "San Francisco International",
4509
- tz: "America/Los_Angeles"
7199
+ tz: "America/Los_Angeles",
7200
+ venues: [
7201
+ "kalshi",
7202
+ "polymarket"
7203
+ ]
7204
+ },
7205
+ {
7206
+ code: "SLC",
7207
+ country: "US",
7208
+ ghcnh_id: "USW00024127",
7209
+ icao: "KSLC",
7210
+ latitude: 40.7884,
7211
+ longitude: -111.9778,
7212
+ name: "Salt Lake City International",
7213
+ tz: "America/Denver",
7214
+ venues: [
7215
+ "kalshi"
7216
+ ]
4510
7217
  },
4511
7218
  {
4512
7219
  code: "LEBL",
@@ -4516,7 +7223,10 @@ var mostlyright = (() => {
4516
7223
  latitude: 41.2974,
4517
7224
  longitude: 2.0833,
4518
7225
  name: "Barcelona El Prat",
4519
- tz: "Europe/Madrid"
7226
+ tz: "Europe/Madrid",
7227
+ venues: [
7228
+ "polymarket"
7229
+ ]
4520
7230
  },
4521
7231
  {
4522
7232
  code: "LEMD",
@@ -4526,7 +7236,10 @@ var mostlyright = (() => {
4526
7236
  latitude: 40.4719,
4527
7237
  longitude: -3.5626,
4528
7238
  name: "Madrid Barajas",
4529
- tz: "Europe/Madrid"
7239
+ tz: "Europe/Madrid",
7240
+ venues: [
7241
+ "polymarket"
7242
+ ]
4530
7243
  },
4531
7244
  {
4532
7245
  code: "LFPB",
@@ -4536,7 +7249,10 @@ var mostlyright = (() => {
4536
7249
  latitude: 48.9694,
4537
7250
  longitude: 2.4414,
4538
7251
  name: "Paris Le Bourget",
4539
- tz: "Europe/Paris"
7252
+ tz: "Europe/Paris",
7253
+ venues: [
7254
+ "polymarket"
7255
+ ]
4540
7256
  },
4541
7257
  {
4542
7258
  code: "LFPG",
@@ -4546,7 +7262,10 @@ var mostlyright = (() => {
4546
7262
  latitude: 49.0097,
4547
7263
  longitude: 2.5479,
4548
7264
  name: "Paris Charles de Gaulle",
4549
- tz: "Europe/Paris"
7265
+ tz: "Europe/Paris",
7266
+ venues: [
7267
+ "polymarket"
7268
+ ]
4550
7269
  },
4551
7270
  {
4552
7271
  code: "LFPO",
@@ -4556,7 +7275,10 @@ var mostlyright = (() => {
4556
7275
  latitude: 48.7233,
4557
7276
  longitude: 2.3794,
4558
7277
  name: "Paris Orly",
4559
- tz: "Europe/Paris"
7278
+ tz: "Europe/Paris",
7279
+ venues: [
7280
+ "polymarket"
7281
+ ]
4560
7282
  },
4561
7283
  {
4562
7284
  code: "LIMC",
@@ -4566,7 +7288,10 @@ var mostlyright = (() => {
4566
7288
  latitude: 45.6306,
4567
7289
  longitude: 8.7281,
4568
7290
  name: "Milan Malpensa",
4569
- tz: "Europe/Rome"
7291
+ tz: "Europe/Rome",
7292
+ venues: [
7293
+ "polymarket"
7294
+ ]
4570
7295
  },
4571
7296
  {
4572
7297
  code: "LIRF",
@@ -4576,7 +7301,10 @@ var mostlyright = (() => {
4576
7301
  latitude: 41.8003,
4577
7302
  longitude: 12.2389,
4578
7303
  name: "Rome Fiumicino",
4579
- tz: "Europe/Rome"
7304
+ tz: "Europe/Rome",
7305
+ venues: [
7306
+ "polymarket"
7307
+ ]
4580
7308
  },
4581
7309
  {
4582
7310
  code: "LOWW",
@@ -4586,7 +7314,10 @@ var mostlyright = (() => {
4586
7314
  latitude: 48.1103,
4587
7315
  longitude: 16.5697,
4588
7316
  name: "Vienna International",
4589
- tz: "Europe/Vienna"
7317
+ tz: "Europe/Vienna",
7318
+ venues: [
7319
+ "polymarket"
7320
+ ]
4590
7321
  },
4591
7322
  {
4592
7323
  code: "LSZH",
@@ -4596,7 +7327,10 @@ var mostlyright = (() => {
4596
7327
  latitude: 47.4647,
4597
7328
  longitude: 8.5492,
4598
7329
  name: "Zurich",
4599
- tz: "Europe/Zurich"
7330
+ tz: "Europe/Zurich",
7331
+ venues: [
7332
+ "polymarket"
7333
+ ]
4600
7334
  },
4601
7335
  {
4602
7336
  code: "NZAA",
@@ -4606,7 +7340,10 @@ var mostlyright = (() => {
4606
7340
  latitude: -37.0081,
4607
7341
  longitude: 174.7917,
4608
7342
  name: "Auckland",
4609
- tz: "Pacific/Auckland"
7343
+ tz: "Pacific/Auckland",
7344
+ venues: [
7345
+ "polymarket"
7346
+ ]
4610
7347
  },
4611
7348
  {
4612
7349
  code: "NZWN",
@@ -4616,7 +7353,10 @@ var mostlyright = (() => {
4616
7353
  latitude: -41.3272,
4617
7354
  longitude: 174.8053,
4618
7355
  name: "Wellington",
4619
- tz: "Pacific/Auckland"
7356
+ tz: "Pacific/Auckland",
7357
+ venues: [
7358
+ "polymarket"
7359
+ ]
4620
7360
  },
4621
7361
  {
4622
7362
  code: "OERK",
@@ -4626,7 +7366,10 @@ var mostlyright = (() => {
4626
7366
  latitude: 24.9576,
4627
7367
  longitude: 46.6988,
4628
7368
  name: "Riyadh King Khalid International",
4629
- tz: "Asia/Riyadh"
7369
+ tz: "Asia/Riyadh",
7370
+ venues: [
7371
+ "polymarket"
7372
+ ]
4630
7373
  },
4631
7374
  {
4632
7375
  code: "OMDB",
@@ -4636,7 +7379,10 @@ var mostlyright = (() => {
4636
7379
  latitude: 25.2532,
4637
7380
  longitude: 55.3657,
4638
7381
  name: "Dubai International",
4639
- tz: "Asia/Dubai"
7382
+ tz: "Asia/Dubai",
7383
+ venues: [
7384
+ "polymarket"
7385
+ ]
4640
7386
  },
4641
7387
  {
4642
7388
  code: "OTHH",
@@ -4646,7 +7392,10 @@ var mostlyright = (() => {
4646
7392
  latitude: 25.2731,
4647
7393
  longitude: 51.608,
4648
7394
  name: "Doha Hamad International",
4649
- tz: "Asia/Qatar"
7395
+ tz: "Asia/Qatar",
7396
+ venues: [
7397
+ "polymarket"
7398
+ ]
4650
7399
  },
4651
7400
  {
4652
7401
  code: "RCTP",
@@ -4656,7 +7405,10 @@ var mostlyright = (() => {
4656
7405
  latitude: 25.0777,
4657
7406
  longitude: 121.2328,
4658
7407
  name: "Taipei Taoyuan",
4659
- tz: "Asia/Taipei"
7408
+ tz: "Asia/Taipei",
7409
+ venues: [
7410
+ "polymarket"
7411
+ ]
4660
7412
  },
4661
7413
  {
4662
7414
  code: "RJAA",
@@ -4666,7 +7418,10 @@ var mostlyright = (() => {
4666
7418
  latitude: 35.7647,
4667
7419
  longitude: 140.3864,
4668
7420
  name: "Tokyo Narita",
4669
- tz: "Asia/Tokyo"
7421
+ tz: "Asia/Tokyo",
7422
+ venues: [
7423
+ "polymarket"
7424
+ ]
4670
7425
  },
4671
7426
  {
4672
7427
  code: "RJTT",
@@ -4676,7 +7431,10 @@ var mostlyright = (() => {
4676
7431
  latitude: 35.5522,
4677
7432
  longitude: 139.78,
4678
7433
  name: "Tokyo Haneda",
4679
- tz: "Asia/Tokyo"
7434
+ tz: "Asia/Tokyo",
7435
+ venues: [
7436
+ "polymarket"
7437
+ ]
4680
7438
  },
4681
7439
  {
4682
7440
  code: "RKSI",
@@ -4686,7 +7444,10 @@ var mostlyright = (() => {
4686
7444
  latitude: 37.4691,
4687
7445
  longitude: 126.4505,
4688
7446
  name: "Seoul Incheon",
4689
- tz: "Asia/Seoul"
7447
+ tz: "Asia/Seoul",
7448
+ venues: [
7449
+ "polymarket"
7450
+ ]
4690
7451
  },
4691
7452
  {
4692
7453
  code: "SAEZ",
@@ -4696,7 +7457,10 @@ var mostlyright = (() => {
4696
7457
  latitude: -34.8222,
4697
7458
  longitude: -58.5358,
4698
7459
  name: "Buenos Aires Ezeiza",
4699
- tz: "America/Argentina/Buenos_Aires"
7460
+ tz: "America/Argentina/Buenos_Aires",
7461
+ venues: [
7462
+ "polymarket"
7463
+ ]
4700
7464
  },
4701
7465
  {
4702
7466
  code: "SBGR",
@@ -4706,7 +7470,10 @@ var mostlyright = (() => {
4706
7470
  latitude: -23.4356,
4707
7471
  longitude: -46.4731,
4708
7472
  name: "S\xE3o Paulo Guarulhos",
4709
- tz: "America/Sao_Paulo"
7473
+ tz: "America/Sao_Paulo",
7474
+ venues: [
7475
+ "polymarket"
7476
+ ]
4710
7477
  },
4711
7478
  {
4712
7479
  code: "UUEE",
@@ -4716,7 +7483,10 @@ var mostlyright = (() => {
4716
7483
  latitude: 55.9728,
4717
7484
  longitude: 37.4147,
4718
7485
  name: "Moscow Sheremetyevo",
4719
- tz: "Europe/Moscow"
7486
+ tz: "Europe/Moscow",
7487
+ venues: [
7488
+ "polymarket"
7489
+ ]
4720
7490
  },
4721
7491
  {
4722
7492
  code: "VABB",
@@ -4726,7 +7496,10 @@ var mostlyright = (() => {
4726
7496
  latitude: 19.0887,
4727
7497
  longitude: 72.8679,
4728
7498
  name: "Mumbai Chhatrapati Shivaji",
4729
- tz: "Asia/Kolkata"
7499
+ tz: "Asia/Kolkata",
7500
+ venues: [
7501
+ "polymarket"
7502
+ ]
4730
7503
  },
4731
7504
  {
4732
7505
  code: "VHHH",
@@ -4736,7 +7509,10 @@ var mostlyright = (() => {
4736
7509
  latitude: 22.308,
4737
7510
  longitude: 113.9185,
4738
7511
  name: "Hong Kong International",
4739
- tz: "Asia/Hong_Kong"
7512
+ tz: "Asia/Hong_Kong",
7513
+ venues: [
7514
+ "polymarket"
7515
+ ]
4740
7516
  },
4741
7517
  {
4742
7518
  code: "VIDP",
@@ -4746,7 +7522,10 @@ var mostlyright = (() => {
4746
7522
  latitude: 28.5562,
4747
7523
  longitude: 77.1,
4748
7524
  name: "Delhi Indira Gandhi",
4749
- tz: "Asia/Kolkata"
7525
+ tz: "Asia/Kolkata",
7526
+ venues: [
7527
+ "polymarket"
7528
+ ]
4750
7529
  },
4751
7530
  {
4752
7531
  code: "VTBS",
@@ -4756,7 +7535,10 @@ var mostlyright = (() => {
4756
7535
  latitude: 13.69,
4757
7536
  longitude: 100.7501,
4758
7537
  name: "Bangkok Suvarnabhumi",
4759
- tz: "Asia/Bangkok"
7538
+ tz: "Asia/Bangkok",
7539
+ venues: [
7540
+ "polymarket"
7541
+ ]
4760
7542
  },
4761
7543
  {
4762
7544
  code: "WSSS",
@@ -4766,7 +7548,10 @@ var mostlyright = (() => {
4766
7548
  latitude: 1.3644,
4767
7549
  longitude: 103.9915,
4768
7550
  name: "Singapore Changi",
4769
- tz: "Asia/Singapore"
7551
+ tz: "Asia/Singapore",
7552
+ venues: [
7553
+ "polymarket"
7554
+ ]
4770
7555
  },
4771
7556
  {
4772
7557
  code: "YBBN",
@@ -4776,7 +7561,10 @@ var mostlyright = (() => {
4776
7561
  latitude: -27.3842,
4777
7562
  longitude: 153.1175,
4778
7563
  name: "Brisbane",
4779
- tz: "Australia/Brisbane"
7564
+ tz: "Australia/Brisbane",
7565
+ venues: [
7566
+ "polymarket"
7567
+ ]
4780
7568
  },
4781
7569
  {
4782
7570
  code: "YMML",
@@ -4786,7 +7574,10 @@ var mostlyright = (() => {
4786
7574
  latitude: -37.6733,
4787
7575
  longitude: 144.8433,
4788
7576
  name: "Melbourne Tullamarine",
4789
- tz: "Australia/Melbourne"
7577
+ tz: "Australia/Melbourne",
7578
+ venues: [
7579
+ "polymarket"
7580
+ ]
4790
7581
  },
4791
7582
  {
4792
7583
  code: "YSSY",
@@ -4796,7 +7587,10 @@ var mostlyright = (() => {
4796
7587
  latitude: -33.9461,
4797
7588
  longitude: 151.1772,
4798
7589
  name: "Sydney Kingsford Smith",
4799
- tz: "Australia/Sydney"
7590
+ tz: "Australia/Sydney",
7591
+ venues: [
7592
+ "polymarket"
7593
+ ]
4800
7594
  },
4801
7595
  {
4802
7596
  code: "ZBAA",
@@ -4806,7 +7600,10 @@ var mostlyright = (() => {
4806
7600
  latitude: 40.0801,
4807
7601
  longitude: 116.5846,
4808
7602
  name: "Beijing Capital",
4809
- tz: "Asia/Shanghai"
7603
+ tz: "Asia/Shanghai",
7604
+ venues: [
7605
+ "polymarket"
7606
+ ]
4810
7607
  },
4811
7608
  {
4812
7609
  code: "ZSPD",
@@ -4816,134 +7613,147 @@ var mostlyright = (() => {
4816
7613
  latitude: 31.1443,
4817
7614
  longitude: 121.8083,
4818
7615
  name: "Shanghai Pudong",
4819
- tz: "Asia/Shanghai"
7616
+ tz: "Asia/Shanghai",
7617
+ venues: [
7618
+ "polymarket"
7619
+ ]
4820
7620
  }
4821
7621
  ];
4822
- var STATION_BY_CODE2 = /* @__PURE__ */ new Map([
4823
- ["ATL", STATIONS2[10]],
4824
- ["AUS", STATIONS2[11]],
4825
- ["BOS", STATIONS2[12]],
4826
- ["DCA", STATIONS2[13]],
4827
- ["DEN", STATIONS2[14]],
4828
- ["DFW", STATIONS2[15]],
4829
- ["EDDB", STATIONS2[0]],
4830
- ["EDDF", STATIONS2[1]],
4831
- ["EDDM", STATIONS2[2]],
4832
- ["EFHK", STATIONS2[3]],
4833
- ["EGKK", STATIONS2[4]],
4834
- ["EGLL", STATIONS2[5]],
4835
- ["EHAM", STATIONS2[6]],
4836
- ["EKCH", STATIONS2[7]],
4837
- ["EPWA", STATIONS2[8]],
4838
- ["ESSA", STATIONS2[9]],
4839
- ["HOU", STATIONS2[16]],
4840
- ["LAS", STATIONS2[17]],
4841
- ["LAX", STATIONS2[18]],
4842
- ["LEBL", STATIONS2[30]],
4843
- ["LEMD", STATIONS2[31]],
4844
- ["LFPB", STATIONS2[32]],
4845
- ["LFPG", STATIONS2[33]],
4846
- ["LFPO", STATIONS2[34]],
4847
- ["LIMC", STATIONS2[35]],
4848
- ["LIRF", STATIONS2[36]],
4849
- ["LOWW", STATIONS2[37]],
4850
- ["LSZH", STATIONS2[38]],
4851
- ["MDW", STATIONS2[19]],
4852
- ["MIA", STATIONS2[20]],
4853
- ["MSP", STATIONS2[21]],
4854
- ["MSY", STATIONS2[22]],
4855
- ["NYC", STATIONS2[23]],
4856
- ["NZAA", STATIONS2[39]],
4857
- ["NZWN", STATIONS2[40]],
4858
- ["OERK", STATIONS2[41]],
4859
- ["OKC", STATIONS2[24]],
4860
- ["OMDB", STATIONS2[42]],
4861
- ["OTHH", STATIONS2[43]],
4862
- ["PHL", STATIONS2[25]],
4863
- ["PHX", STATIONS2[26]],
4864
- ["RCTP", STATIONS2[44]],
4865
- ["RJAA", STATIONS2[45]],
4866
- ["RJTT", STATIONS2[46]],
4867
- ["RKSI", STATIONS2[47]],
4868
- ["SAEZ", STATIONS2[48]],
4869
- ["SAT", STATIONS2[27]],
4870
- ["SBGR", STATIONS2[49]],
4871
- ["SEA", STATIONS2[28]],
4872
- ["SFO", STATIONS2[29]],
4873
- ["UUEE", STATIONS2[50]],
4874
- ["VABB", STATIONS2[51]],
4875
- ["VHHH", STATIONS2[52]],
4876
- ["VIDP", STATIONS2[53]],
4877
- ["VTBS", STATIONS2[54]],
4878
- ["WSSS", STATIONS2[55]],
4879
- ["YBBN", STATIONS2[56]],
4880
- ["YMML", STATIONS2[57]],
4881
- ["YSSY", STATIONS2[58]],
4882
- ["ZBAA", STATIONS2[59]],
4883
- ["ZSPD", STATIONS2[60]]
7622
+ var STATION_BY_CODE3 = /* @__PURE__ */ new Map([
7623
+ ["ATL", STATIONS3[10]],
7624
+ ["AUS", STATIONS3[11]],
7625
+ ["BNA", STATIONS3[12]],
7626
+ ["BOS", STATIONS3[13]],
7627
+ ["CVG", STATIONS3[14]],
7628
+ ["DCA", STATIONS3[15]],
7629
+ ["DEN", STATIONS3[16]],
7630
+ ["DFW", STATIONS3[17]],
7631
+ ["DTW", STATIONS3[18]],
7632
+ ["EDDB", STATIONS3[0]],
7633
+ ["EDDF", STATIONS3[1]],
7634
+ ["EDDM", STATIONS3[2]],
7635
+ ["EFHK", STATIONS3[3]],
7636
+ ["EGKK", STATIONS3[4]],
7637
+ ["EGLL", STATIONS3[5]],
7638
+ ["EHAM", STATIONS3[6]],
7639
+ ["EKCH", STATIONS3[7]],
7640
+ ["EPWA", STATIONS3[8]],
7641
+ ["ESSA", STATIONS3[9]],
7642
+ ["HOU", STATIONS3[19]],
7643
+ ["IAH", STATIONS3[20]],
7644
+ ["LAS", STATIONS3[21]],
7645
+ ["LAX", STATIONS3[22]],
7646
+ ["LEBL", STATIONS3[35]],
7647
+ ["LEMD", STATIONS3[36]],
7648
+ ["LFPB", STATIONS3[37]],
7649
+ ["LFPG", STATIONS3[38]],
7650
+ ["LFPO", STATIONS3[39]],
7651
+ ["LIMC", STATIONS3[40]],
7652
+ ["LIRF", STATIONS3[41]],
7653
+ ["LOWW", STATIONS3[42]],
7654
+ ["LSZH", STATIONS3[43]],
7655
+ ["MDW", STATIONS3[23]],
7656
+ ["MIA", STATIONS3[24]],
7657
+ ["MSP", STATIONS3[25]],
7658
+ ["MSY", STATIONS3[26]],
7659
+ ["NYC", STATIONS3[27]],
7660
+ ["NZAA", STATIONS3[44]],
7661
+ ["NZWN", STATIONS3[45]],
7662
+ ["OERK", STATIONS3[46]],
7663
+ ["OKC", STATIONS3[28]],
7664
+ ["OMDB", STATIONS3[47]],
7665
+ ["OTHH", STATIONS3[48]],
7666
+ ["PHL", STATIONS3[29]],
7667
+ ["PHX", STATIONS3[30]],
7668
+ ["RCTP", STATIONS3[49]],
7669
+ ["RJAA", STATIONS3[50]],
7670
+ ["RJTT", STATIONS3[51]],
7671
+ ["RKSI", STATIONS3[52]],
7672
+ ["SAEZ", STATIONS3[53]],
7673
+ ["SAT", STATIONS3[31]],
7674
+ ["SBGR", STATIONS3[54]],
7675
+ ["SEA", STATIONS3[32]],
7676
+ ["SFO", STATIONS3[33]],
7677
+ ["SLC", STATIONS3[34]],
7678
+ ["UUEE", STATIONS3[55]],
7679
+ ["VABB", STATIONS3[56]],
7680
+ ["VHHH", STATIONS3[57]],
7681
+ ["VIDP", STATIONS3[58]],
7682
+ ["VTBS", STATIONS3[59]],
7683
+ ["WSSS", STATIONS3[60]],
7684
+ ["YBBN", STATIONS3[61]],
7685
+ ["YMML", STATIONS3[62]],
7686
+ ["YSSY", STATIONS3[63]],
7687
+ ["ZBAA", STATIONS3[64]],
7688
+ ["ZSPD", STATIONS3[65]]
4884
7689
  ]);
4885
- var STATION_BY_ICAO2 = /* @__PURE__ */ new Map([
4886
- ["EDDB", STATIONS2[0]],
4887
- ["EDDF", STATIONS2[1]],
4888
- ["EDDM", STATIONS2[2]],
4889
- ["EFHK", STATIONS2[3]],
4890
- ["EGKK", STATIONS2[4]],
4891
- ["EGLL", STATIONS2[5]],
4892
- ["EHAM", STATIONS2[6]],
4893
- ["EKCH", STATIONS2[7]],
4894
- ["EPWA", STATIONS2[8]],
4895
- ["ESSA", STATIONS2[9]],
4896
- ["KATL", STATIONS2[10]],
4897
- ["KAUS", STATIONS2[11]],
4898
- ["KBOS", STATIONS2[12]],
4899
- ["KDCA", STATIONS2[13]],
4900
- ["KDEN", STATIONS2[14]],
4901
- ["KDFW", STATIONS2[15]],
4902
- ["KHOU", STATIONS2[16]],
4903
- ["KLAS", STATIONS2[17]],
4904
- ["KLAX", STATIONS2[18]],
4905
- ["KMDW", STATIONS2[19]],
4906
- ["KMIA", STATIONS2[20]],
4907
- ["KMSP", STATIONS2[21]],
4908
- ["KMSY", STATIONS2[22]],
4909
- ["KNYC", STATIONS2[23]],
4910
- ["KOKC", STATIONS2[24]],
4911
- ["KPHL", STATIONS2[25]],
4912
- ["KPHX", STATIONS2[26]],
4913
- ["KSAT", STATIONS2[27]],
4914
- ["KSEA", STATIONS2[28]],
4915
- ["KSFO", STATIONS2[29]],
4916
- ["LEBL", STATIONS2[30]],
4917
- ["LEMD", STATIONS2[31]],
4918
- ["LFPB", STATIONS2[32]],
4919
- ["LFPG", STATIONS2[33]],
4920
- ["LFPO", STATIONS2[34]],
4921
- ["LIMC", STATIONS2[35]],
4922
- ["LIRF", STATIONS2[36]],
4923
- ["LOWW", STATIONS2[37]],
4924
- ["LSZH", STATIONS2[38]],
4925
- ["NZAA", STATIONS2[39]],
4926
- ["NZWN", STATIONS2[40]],
4927
- ["OERK", STATIONS2[41]],
4928
- ["OMDB", STATIONS2[42]],
4929
- ["OTHH", STATIONS2[43]],
4930
- ["RCTP", STATIONS2[44]],
4931
- ["RJAA", STATIONS2[45]],
4932
- ["RJTT", STATIONS2[46]],
4933
- ["RKSI", STATIONS2[47]],
4934
- ["SAEZ", STATIONS2[48]],
4935
- ["SBGR", STATIONS2[49]],
4936
- ["UUEE", STATIONS2[50]],
4937
- ["VABB", STATIONS2[51]],
4938
- ["VHHH", STATIONS2[52]],
4939
- ["VIDP", STATIONS2[53]],
4940
- ["VTBS", STATIONS2[54]],
4941
- ["WSSS", STATIONS2[55]],
4942
- ["YBBN", STATIONS2[56]],
4943
- ["YMML", STATIONS2[57]],
4944
- ["YSSY", STATIONS2[58]],
4945
- ["ZBAA", STATIONS2[59]],
4946
- ["ZSPD", STATIONS2[60]]
7690
+ var STATION_BY_ICAO3 = /* @__PURE__ */ new Map([
7691
+ ["EDDB", STATIONS3[0]],
7692
+ ["EDDF", STATIONS3[1]],
7693
+ ["EDDM", STATIONS3[2]],
7694
+ ["EFHK", STATIONS3[3]],
7695
+ ["EGKK", STATIONS3[4]],
7696
+ ["EGLL", STATIONS3[5]],
7697
+ ["EHAM", STATIONS3[6]],
7698
+ ["EKCH", STATIONS3[7]],
7699
+ ["EPWA", STATIONS3[8]],
7700
+ ["ESSA", STATIONS3[9]],
7701
+ ["KATL", STATIONS3[10]],
7702
+ ["KAUS", STATIONS3[11]],
7703
+ ["KBNA", STATIONS3[12]],
7704
+ ["KBOS", STATIONS3[13]],
7705
+ ["KCVG", STATIONS3[14]],
7706
+ ["KDCA", STATIONS3[15]],
7707
+ ["KDEN", STATIONS3[16]],
7708
+ ["KDFW", STATIONS3[17]],
7709
+ ["KDTW", STATIONS3[18]],
7710
+ ["KHOU", STATIONS3[19]],
7711
+ ["KIAH", STATIONS3[20]],
7712
+ ["KLAS", STATIONS3[21]],
7713
+ ["KLAX", STATIONS3[22]],
7714
+ ["KMDW", STATIONS3[23]],
7715
+ ["KMIA", STATIONS3[24]],
7716
+ ["KMSP", STATIONS3[25]],
7717
+ ["KMSY", STATIONS3[26]],
7718
+ ["KNYC", STATIONS3[27]],
7719
+ ["KOKC", STATIONS3[28]],
7720
+ ["KPHL", STATIONS3[29]],
7721
+ ["KPHX", STATIONS3[30]],
7722
+ ["KSAT", STATIONS3[31]],
7723
+ ["KSEA", STATIONS3[32]],
7724
+ ["KSFO", STATIONS3[33]],
7725
+ ["KSLC", STATIONS3[34]],
7726
+ ["LEBL", STATIONS3[35]],
7727
+ ["LEMD", STATIONS3[36]],
7728
+ ["LFPB", STATIONS3[37]],
7729
+ ["LFPG", STATIONS3[38]],
7730
+ ["LFPO", STATIONS3[39]],
7731
+ ["LIMC", STATIONS3[40]],
7732
+ ["LIRF", STATIONS3[41]],
7733
+ ["LOWW", STATIONS3[42]],
7734
+ ["LSZH", STATIONS3[43]],
7735
+ ["NZAA", STATIONS3[44]],
7736
+ ["NZWN", STATIONS3[45]],
7737
+ ["OERK", STATIONS3[46]],
7738
+ ["OMDB", STATIONS3[47]],
7739
+ ["OTHH", STATIONS3[48]],
7740
+ ["RCTP", STATIONS3[49]],
7741
+ ["RJAA", STATIONS3[50]],
7742
+ ["RJTT", STATIONS3[51]],
7743
+ ["RKSI", STATIONS3[52]],
7744
+ ["SAEZ", STATIONS3[53]],
7745
+ ["SBGR", STATIONS3[54]],
7746
+ ["UUEE", STATIONS3[55]],
7747
+ ["VABB", STATIONS3[56]],
7748
+ ["VHHH", STATIONS3[57]],
7749
+ ["VIDP", STATIONS3[58]],
7750
+ ["VTBS", STATIONS3[59]],
7751
+ ["WSSS", STATIONS3[60]],
7752
+ ["YBBN", STATIONS3[61]],
7753
+ ["YMML", STATIONS3[62]],
7754
+ ["YSSY", STATIONS3[63]],
7755
+ ["ZBAA", STATIONS3[64]],
7756
+ ["ZSPD", STATIONS3[65]]
4947
7757
  ]);
4948
7758
  var _STATION_TZ2 = Object.freeze({
4949
7759
  // Eastern (UTC-5 standard / UTC-4 DST)
@@ -5090,13 +7900,13 @@ var mostlyright = (() => {
5090
7900
  }
5091
7901
  function _lstOffsetHoursFor(station) {
5092
7902
  const upper = station.trim().toUpperCase();
5093
- const byCode = STATION_BY_CODE2.get(upper);
7903
+ const byCode = STATION_BY_CODE3.get(upper);
5094
7904
  if (byCode !== void 0) return _lstOffsetHours2(byCode.tz);
5095
- const byIcao = STATION_BY_ICAO2.get(upper);
7905
+ const byIcao = STATION_BY_ICAO3.get(upper);
5096
7906
  if (byIcao !== void 0) return _lstOffsetHours2(byIcao.tz);
5097
7907
  if (upper.length === 4 && upper.startsWith("K")) {
5098
7908
  const stripped = upper.slice(1);
5099
- const retry = STATION_BY_CODE2.get(stripped);
7909
+ const retry = STATION_BY_CODE3.get(stripped);
5100
7910
  if (retry !== void 0) return _lstOffsetHours2(retry.tz);
5101
7911
  }
5102
7912
  throw new RangeError(`unknown station: ${JSON.stringify(station)}`);
@@ -5168,8 +7978,8 @@ var mostlyright = (() => {
5168
7978
 
5169
7979
  // ../core/dist/internal/cache/index.browser.mjs
5170
7980
  async function defaultCacheStore() {
5171
- if (typeof indexedDB !== "undefined") return new IndexedDBStore();
5172
- return new MemoryStore();
7981
+ const inner = typeof indexedDB !== "undefined" ? new IndexedDBStore() : new MemoryStore();
7982
+ return versionedCacheStore(inner, CACHE_SCHEMA_VERSION);
5173
7983
  }
5174
7984
 
5175
7985
  // ../core/dist/internal/pairs.mjs
@@ -5355,9 +8165,9 @@ var mostlyright = (() => {
5355
8165
  );
5356
8166
  return new Date(marketCloseAsUtcMs - offsetHours * 36e5);
5357
8167
  }
5358
- function collectNonNull(obs, key) {
8168
+ function collectNonNull(obs2, key) {
5359
8169
  const out = [];
5360
- for (const o of obs) {
8170
+ for (const o of obs2) {
5361
8171
  const v = o[key];
5362
8172
  if (typeof v === "number" && Number.isFinite(v)) out.push(v);
5363
8173
  }
@@ -5452,13 +8262,68 @@ var mostlyright = (() => {
5452
8262
  function buildPairs(station, dates, observationsByDate, climateByDate, opts = {}) {
5453
8263
  const out = [];
5454
8264
  for (const date of dates) {
5455
- const obs = observationsByDate[date] ?? [];
8265
+ const obs2 = observationsByDate[date] ?? [];
5456
8266
  const climate = climateByDate[date] ?? null;
5457
- out.push(buildPairsRow(date, station, obs, climate, opts));
8267
+ out.push(buildPairsRow(date, station, obs2, climate, opts));
5458
8268
  }
5459
8269
  return Object.freeze(out);
5460
8270
  }
5461
8271
 
8272
+ // src/research.types.ts
8273
+ var KNOWN_RESEARCH_OPTION_KEYS = /* @__PURE__ */ new Set([
8274
+ // Pre-Phase-21 fetcher controls.
8275
+ "signal",
8276
+ "awcHours",
8277
+ "iemPolitenessMs",
8278
+ "ghcnhPolitenessMs",
8279
+ "cliPolitenessMs",
8280
+ "now",
8281
+ "cache",
8282
+ // Pre-Phase-21 selectors.
8283
+ "city",
8284
+ "contract",
8285
+ "contracts",
8286
+ "stationOverride",
8287
+ "sources",
8288
+ "source",
8289
+ "includeTrades",
8290
+ "onWarning",
8291
+ // Phase 21 21-01: Python-parity composable kwargs.
8292
+ "include_forecast",
8293
+ "forecast_model",
8294
+ "forecast_models",
8295
+ "qc",
8296
+ "tz_override",
8297
+ "backend",
8298
+ "return_type"
8299
+ ]);
8300
+ function validateResearchKwargs(opts) {
8301
+ const present = (v) => v !== void 0 && v !== null;
8302
+ for (const key of Object.keys(opts)) {
8303
+ if (!KNOWN_RESEARCH_OPTION_KEYS.has(key)) {
8304
+ throw new TypeError(
8305
+ `research(): unknown option key ${JSON.stringify(key)}. Valid keys: ${[...KNOWN_RESEARCH_OPTION_KEYS].sort().join(", ")}`
8306
+ );
8307
+ }
8308
+ }
8309
+ if (present(opts.sources) && present(opts.source)) {
8310
+ throw new TypeError(
8311
+ "research(): sources= and source= are mutually exclusive \u2014 use `sources=` for the LIVE_V1 multi-source selector or `source=` for a single-source query, not both"
8312
+ );
8313
+ }
8314
+ if (present(opts.forecast_model) && present(opts.forecast_models)) {
8315
+ throw new TypeError(
8316
+ "research(): forecast_model= and forecast_models= are mutually exclusive \u2014 use `forecast_models=` for multi-model fan-out or `forecast_model=` for a single model, not both"
8317
+ );
8318
+ }
8319
+ const wantsForecast = present(opts.forecast_model) || present(opts.forecast_models);
8320
+ if (wantsForecast && opts.include_forecast !== true) {
8321
+ throw new TypeError(
8322
+ "research(): forecast_model=/forecast_models= require include_forecast=true; the model filter is otherwise silently ignored"
8323
+ );
8324
+ }
8325
+ }
8326
+
5462
8327
  // src/research.ts
5463
8328
  var AWC_MAX_HOURS2 = 168;
5464
8329
  async function resolveCache(opts) {
@@ -5726,9 +8591,9 @@ var mostlyright = (() => {
5726
8591
  }
5727
8592
  }
5728
8593
  }
5729
- for (const obs of monthRows) {
5730
- const obsDate = obs.observed_at.slice(0, 10);
5731
- if (obsDate >= fromDate && obsDate <= extendedTo) acc.push(obs);
8594
+ for (const obs2 of monthRows) {
8595
+ const obsDate = obs2.observed_at.slice(0, 10);
8596
+ if (obsDate >= fromDate && obsDate <= extendedTo) acc.push(obs2);
5732
8597
  }
5733
8598
  }
5734
8599
  return acc;
@@ -5799,14 +8664,22 @@ var mostlyright = (() => {
5799
8664
  }
5800
8665
  }
5801
8666
  }
5802
- for (const obs of monthRows) {
5803
- const obsDate = obs.observed_at.slice(0, 10);
5804
- if (obsDate >= fromDate && obsDate <= extendedTo) acc.push(obs);
8667
+ for (const obs2 of monthRows) {
8668
+ const obsDate = obs2.observed_at.slice(0, 10);
8669
+ if (obsDate >= fromDate && obsDate <= extendedTo) acc.push(obs2);
5805
8670
  }
5806
8671
  }
5807
8672
  return acc;
5808
8673
  }
5809
8674
  async function research(station, fromDate, toDate, opts = {}) {
8675
+ validateResearchKwargs(opts);
8676
+ if (opts.backend === "polars") {
8677
+ throw new DataAvailabilityError({
8678
+ reason: "model_unavailable",
8679
+ hint: 'polars backend not available in TypeScript SDK; use Python (mostlyrightmd) for backend="polars". TS returns plain object arrays.',
8680
+ source: "research.backend"
8681
+ });
8682
+ }
5810
8683
  const hasCity = typeof opts.city === "string" && opts.city.length > 0;
5811
8684
  const hasContract = typeof opts.contract === "string" && opts.contract.length > 0;
5812
8685
  const hasContracts = Array.isArray(opts.contracts) && opts.contracts.length > 0;
@@ -5882,8 +8755,8 @@ var mostlyright = (() => {
5882
8755
  if (opts.signal !== void 0) awcOpts.signal = opts.signal;
5883
8756
  const awcRaw = await fetchAwcMetars([resolved.icao], awcOpts);
5884
8757
  for (const m of awcRaw) {
5885
- const obs = awcToObservation(m);
5886
- if (obs !== null) awcRows.push(obs);
8758
+ const obs2 = awcToObservation(m);
8759
+ if (obs2 !== null) awcRows.push(obs2);
5887
8760
  }
5888
8761
  }
5889
8762
  const iemRows = await fetchIemAsosWithCache(
@@ -5914,8 +8787,8 @@ var mostlyright = (() => {
5914
8787
  const observationsByDate = {};
5915
8788
  const dateLo = dates[0] ?? "";
5916
8789
  const dateHi = dates[dates.length - 1] ?? "";
5917
- for (const obs of merged) {
5918
- const settleDate = observedSettlementDate(obs.observed_at, resolved.code);
8790
+ for (const obs2 of merged) {
8791
+ const settleDate = observedSettlementDate(obs2.observed_at, resolved.code);
5919
8792
  if (settleDate === null) continue;
5920
8793
  if (settleDate < dateLo || settleDate > dateHi) continue;
5921
8794
  let bucket = observationsByDate[settleDate];
@@ -5923,7 +8796,7 @@ var mostlyright = (() => {
5923
8796
  bucket = [];
5924
8797
  observationsByDate[settleDate] = bucket;
5925
8798
  }
5926
- bucket.push(obs);
8799
+ bucket.push(obs2);
5927
8800
  }
5928
8801
  const climateByDate = {};
5929
8802
  for (const cli of mergedClimate) {
@@ -6058,8 +8931,8 @@ var mostlyright = (() => {
6058
8931
  const raw = await fetchAwcMetars([resolved.icao], awcOpts);
6059
8932
  const parsed = [];
6060
8933
  for (const m of raw) {
6061
- const obs = awcToObservation(m);
6062
- if (obs !== null) parsed.push(obs);
8934
+ const obs2 = awcToObservation(m);
8935
+ if (obs2 !== null) parsed.push(obs2);
6063
8936
  }
6064
8937
  rows = parsed.filter((r) => {
6065
8938
  const d = r.observed_at.slice(0, 10);
@@ -6351,6 +9224,129 @@ var mostlyright = (() => {
6351
9224
 
6352
9225
  // src/index.ts
6353
9226
  init_src();
9227
+
9228
+ // ../core/dist/preprocessing/index.mjs
9229
+ var preprocessing_exports = {};
9230
+ __export(preprocessing_exports, {
9231
+ PHYSICS_BOUNDS: () => PHYSICS_BOUNDS,
9232
+ clipOutliers: () => clipOutliers,
9233
+ iemCrosscheck: () => crosscheckIemGhcnh
9234
+ });
9235
+ var PHYSICS_BOUNDS = /* @__PURE__ */ new Map([
9236
+ ["temp_c", [-89, 57]],
9237
+ ["dew_point_c", [-89, 35]],
9238
+ ["dewpoint_c", [-89, 35]],
9239
+ ["wind_speed_ms", [0, 100]],
9240
+ ["wind_speed_kt", [0, 200]],
9241
+ ["wind_dir_deg", [0, 360]],
9242
+ ["wind_dir_degrees", [0, 360]],
9243
+ ["slp_hpa", [870, 1085]],
9244
+ ["sea_level_pressure_mb", [870, 1085]],
9245
+ ["relative_humidity_pct_2m", [0, 100]],
9246
+ ["precip_mm_1h", [0, 305]]
9247
+ ]);
9248
+ function clipOutliers(rows, col, opts = {}) {
9249
+ const std = opts.std ?? 3;
9250
+ const key = `${col}_clipped`;
9251
+ let lo;
9252
+ let hi;
9253
+ let passThrough = false;
9254
+ if (opts.bounds !== void 0) {
9255
+ [lo, hi] = opts.bounds;
9256
+ } else if (PHYSICS_BOUNDS.has(col)) {
9257
+ const b = PHYSICS_BOUNDS.get(col);
9258
+ if (b === void 0) {
9259
+ throw new Error(`PHYSICS_BOUNDS.get(${col}) unexpectedly undefined`);
9260
+ }
9261
+ [lo, hi] = b;
9262
+ } else {
9263
+ if (!Number.isFinite(std) || std <= 0) {
9264
+ throw new RangeError(
9265
+ `clipOutliers: std must be > 0 for the sigma fallback (got ${std}); pass bounds=[lo, hi] or use a physics-default column`
9266
+ );
9267
+ }
9268
+ const vals = [];
9269
+ for (const r of rows) {
9270
+ const v = r?.[col];
9271
+ if (typeof v === "number" && Number.isFinite(v)) vals.push(v);
9272
+ }
9273
+ if (vals.length < 2) {
9274
+ passThrough = true;
9275
+ lo = Number.NEGATIVE_INFINITY;
9276
+ hi = Number.POSITIVE_INFINITY;
9277
+ } else {
9278
+ const mu = vals.reduce((a, b) => a + b, 0) / vals.length;
9279
+ const sumSq = vals.reduce((a, b) => a + (b - mu) ** 2, 0);
9280
+ const sigma = Math.sqrt(sumSq / (vals.length - 1));
9281
+ if (sigma === 0 || !Number.isFinite(sigma)) {
9282
+ passThrough = true;
9283
+ lo = Number.NEGATIVE_INFINITY;
9284
+ hi = Number.POSITIVE_INFINITY;
9285
+ } else {
9286
+ lo = mu - std * sigma;
9287
+ hi = mu + std * sigma;
9288
+ }
9289
+ }
9290
+ }
9291
+ const out = [];
9292
+ for (const r of rows) {
9293
+ const v = r?.[col];
9294
+ let clipped;
9295
+ if (typeof v === "number" && Number.isFinite(v)) {
9296
+ clipped = passThrough ? v : Math.min(Math.max(v, lo), hi);
9297
+ } else {
9298
+ clipped = null;
9299
+ }
9300
+ out.push({ ...r, [key]: clipped });
9301
+ }
9302
+ return out;
9303
+ }
9304
+ function crosscheckIemGhcnh(iemRows, ghcnhRows, opts = {}) {
9305
+ const tolC = opts.tolC ?? 2;
9306
+ if (iemRows.length === 0 || ghcnhRows.length === 0) return [];
9307
+ for (const r of iemRows) {
9308
+ if (typeof r?.station !== "string" || typeof r?.eventTime !== "string") {
9309
+ throw new Error(
9310
+ "crosscheckIemGhcnh: iem rows must carry 'station' (string) and 'eventTime' (string) keys"
9311
+ );
9312
+ }
9313
+ }
9314
+ for (const r of ghcnhRows) {
9315
+ if (typeof r?.station !== "string" || typeof r?.eventTime !== "string") {
9316
+ throw new Error(
9317
+ "crosscheckIemGhcnh: ghcnh rows must carry 'station' (string) and 'eventTime' (string) keys"
9318
+ );
9319
+ }
9320
+ }
9321
+ const iemMap = /* @__PURE__ */ new Map();
9322
+ for (const r of iemRows) {
9323
+ const key = `${r.station}|${r.eventTime}`;
9324
+ iemMap.set(key, r);
9325
+ }
9326
+ const out = [];
9327
+ for (const g of ghcnhRows) {
9328
+ const key = `${g.station}|${g.eventTime}`;
9329
+ const i = iemMap.get(key);
9330
+ if (i === void 0) continue;
9331
+ const iT = typeof i.temp_c === "number" && Number.isFinite(i.temp_c) ? i.temp_c : null;
9332
+ const gT = typeof g.temp_c === "number" && Number.isFinite(g.temp_c) ? g.temp_c : null;
9333
+ if (iT === null || gT === null) continue;
9334
+ const delta = Math.abs(iT - gT);
9335
+ if (delta > tolC) {
9336
+ out.push({
9337
+ station: g.station,
9338
+ eventTime: g.eventTime,
9339
+ tempCIem: iT,
9340
+ tempCGhcnh: gT,
9341
+ deltaC: delta
9342
+ });
9343
+ }
9344
+ }
9345
+ return out;
9346
+ }
9347
+
9348
+ // src/index.ts
9349
+ var Preprocessing = preprocessing_exports;
6354
9350
  var version4 = "0.0.0";
6355
9351
  return __toCommonJS(index_exports);
6356
9352
  })();