@neilberkman/sidereon 0.8.1 → 0.9.1

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.
@@ -145,6 +145,12 @@ export class Antex {
145
145
  * Return the satellite antenna for `prn` valid at `epoch`, or `undefined`.
146
146
  */
147
147
  satelliteAntenna(prn: string, epoch: AntexDateTime): Antenna | undefined;
148
+ /**
149
+ * Serialize to standard ANTEX 1.4 text. Deterministic: the same product
150
+ * always produces byte-identical text, and re-parsing the output yields an
151
+ * equal product.
152
+ */
153
+ toAntexString(): string;
148
154
  /**
149
155
  * Number of antenna blocks parsed from the product.
150
156
  */
@@ -210,6 +216,23 @@ export class AppliedCorrections {
210
216
  readonly dropped: string[];
211
217
  }
212
218
 
219
+ /**
220
+ * Total mass density and temperature at altitude from NRLMSISE-00.
221
+ */
222
+ export class AtmosphereDensity {
223
+ private constructor();
224
+ free(): void;
225
+ [Symbol.dispose](): void;
226
+ /**
227
+ * Total mass density, kilograms per cubic metre.
228
+ */
229
+ readonly densityKgM3: number;
230
+ /**
231
+ * Temperature at the requested altitude, kelvin.
232
+ */
233
+ readonly temperatureK: number;
234
+ }
235
+
213
236
  /**
214
237
  * A parsed broadcast ephemeris store from a RINEX NAV file. `records` are the
215
238
  * usable GPS/Galileo/BeiDou records selected by the core default SPP policy.
@@ -230,6 +253,23 @@ export class BroadcastEphemeris {
230
253
  * fields are `null` where no compared epoch populated them.
231
254
  */
232
255
  compareToSp3(precise: Sp3, satellites: string[], from_j2000_s: number, to_j2000_s: number, step_s: number): any;
256
+ /**
257
+ * Compare this broadcast product against a precise SP3 product over a regular
258
+ * sampling window, letting the core window driver build the per-epoch grid.
259
+ *
260
+ * The window-form sibling of [`compareToSp3`]: instead of building the
261
+ * per-epoch keys here, this hands the core
262
+ * `sidereon_core::broadcast_comparison::compare_window` a `CompareWindow`
263
+ * (the inclusive `[fromJ2000S, toJ2000S]` broadcast span, the precise split
264
+ * Julian-date anchor for the window start, the `stepS` sampling step, and the
265
+ * velocity finite-difference half step) so the grid sampling, the final snap
266
+ * to the window end, and the lockstep precise-date advance all run in core.
267
+ * The precise anchor is derived from `fromJ2000S` (both products share GPS
268
+ * system time, as in [`compareToSp3`]), and `velocityHalfS` defaults to
269
+ * `round(stepS / 2)`. Returns the same `{ overall, perSatellite, missing }`
270
+ * report shape.
271
+ */
272
+ compareWindowToSp3(precise: Sp3, satellites: string[], from_j2000_s: number, to_j2000_s: number, step_s: number, velocity_half_s?: number | null): any;
233
273
  /**
234
274
  * Solve a receiver position from broadcast ephemeris ALONE: the supported
235
275
  * real-time / offline single-point-positioning mode. `request` is the same
@@ -237,6 +277,14 @@ export class BroadcastEphemeris {
237
277
  * solving against this broadcast store as an ephemeris source.
238
278
  */
239
279
  solveBroadcast(request: any): SppSolution;
280
+ /**
281
+ * Serialize the usable GPS, Galileo, and BeiDou broadcast records to
282
+ * standard RINEX 3 navigation text. Deterministic: the same record set
283
+ * always produces byte-identical text, and re-parsing the output yields the
284
+ * same records. GLONASS state-vector records are not part of the Keplerian
285
+ * broadcast-orbit grammar this writer emits and are therefore not included.
286
+ */
287
+ toRinexString(): string;
240
288
  /**
241
289
  * Number of usable GLONASS records.
242
290
  */
@@ -577,23 +625,62 @@ export class CdmObject {
577
625
  [Symbol.dispose](): void;
578
626
  /**
579
627
  * Build a CDM object. `positionKm` / `velocityKmS` are length-3
580
- * `Float64Array`s; `covarianceRtn` is the length-6 RTN lower triangle
581
- * `[CR_R, CT_R, CT_T, CN_R, CN_T, CN_N]`. `meta` carries the optional
582
- * string fields.
628
+ * `Float64Array`s; `covarianceRtn` is the length-6 RTN position lower triangle
629
+ * `[CR_R, CT_R, CT_T, CN_R, CN_T, CN_N]`. `meta` carries the optional CCSDS
630
+ * metadata block (`objectDesignator`, `catalogName`, `objectName`,
631
+ * `internationalDesignator`, `objectType`, `operatorContactPosition`,
632
+ * `operatorOrganization`, `operatorPhone`, `operatorEmail`, `ephemerisName`,
633
+ * `covarianceMethod`, `maneuverable`, `orbitCenter`, `refFrame`,
634
+ * `gravityModel`, `atmosphericModel`, `nBodyPerturbations`,
635
+ * `solarRadPressure`, `earthTides`, `intrackThrust`) and the optional
636
+ * `velocityCovarianceRtn`, a length-15 `Float64Array` of the RTN
637
+ * velocity-covariance rows that complete the 6x6 matrix.
583
638
  */
584
639
  constructor(position_km: Float64Array, velocity_km_s: Float64Array, covariance_rtn: Float64Array, meta: any);
640
+ /**
641
+ * Atmospheric model.
642
+ */
643
+ readonly atmosphericModel: string | undefined;
585
644
  /**
586
645
  * Catalog name.
587
646
  */
588
647
  readonly catalogName: string | undefined;
648
+ /**
649
+ * Covariance method.
650
+ */
651
+ readonly covarianceMethod: string | undefined;
589
652
  /**
590
653
  * RTN position-covariance lower triangle, length-6 `Float64Array`.
591
654
  */
592
655
  readonly covarianceRtn: Float64Array;
656
+ /**
657
+ * Earth-tides indicator.
658
+ */
659
+ readonly earthTides: string | undefined;
660
+ /**
661
+ * Ephemeris name.
662
+ */
663
+ readonly ephemerisName: string | undefined;
664
+ /**
665
+ * Gravity model.
666
+ */
667
+ readonly gravityModel: string | undefined;
593
668
  /**
594
669
  * International designator (COSPAR ID).
595
670
  */
596
671
  readonly internationalDesignator: string | undefined;
672
+ /**
673
+ * In-track-thrust indicator.
674
+ */
675
+ readonly intrackThrust: string | undefined;
676
+ /**
677
+ * Maneuverability indicator.
678
+ */
679
+ readonly maneuverable: string | undefined;
680
+ /**
681
+ * N-body perturbations indicator.
682
+ */
683
+ readonly nBodyPerturbations: string | undefined;
597
684
  /**
598
685
  * Object designator.
599
686
  */
@@ -606,6 +693,26 @@ export class CdmObject {
606
693
  * Object type.
607
694
  */
608
695
  readonly objectType: string | undefined;
696
+ /**
697
+ * Operator contact position.
698
+ */
699
+ readonly operatorContactPosition: string | undefined;
700
+ /**
701
+ * Operator email.
702
+ */
703
+ readonly operatorEmail: string | undefined;
704
+ /**
705
+ * Operator organization.
706
+ */
707
+ readonly operatorOrganization: string | undefined;
708
+ /**
709
+ * Operator phone.
710
+ */
711
+ readonly operatorPhone: string | undefined;
712
+ /**
713
+ * Orbit center.
714
+ */
715
+ readonly orbitCenter: string | undefined;
609
716
  /**
610
717
  * Position vector, kilometres, length-3 `Float64Array`.
611
718
  */
@@ -614,6 +721,16 @@ export class CdmObject {
614
721
  * Reference frame.
615
722
  */
616
723
  readonly refFrame: string | undefined;
724
+ /**
725
+ * Solar-radiation-pressure indicator.
726
+ */
727
+ readonly solarRadPressure: string | undefined;
728
+ /**
729
+ * RTN velocity-covariance rows completing the 6x6 matrix, a length-15
730
+ * `Float64Array` in CCSDS order (`CRDOT_R` .. `CNDOT_NDOT`), or `undefined`
731
+ * when the producer carried only the position covariance block.
732
+ */
733
+ readonly velocityCovarianceRtn: Float64Array | undefined;
617
734
  /**
618
735
  * Velocity vector, km/s, length-3 `Float64Array`.
619
736
  */
@@ -643,6 +760,39 @@ export class ChecksumWarning {
643
760
  readonly lineLabel: string;
644
761
  }
645
762
 
763
+ /**
764
+ * Civil calendar fields from a no-leap core time conversion.
765
+ */
766
+ export class CivilDateTime {
767
+ private constructor();
768
+ free(): void;
769
+ [Symbol.dispose](): void;
770
+ /**
771
+ * Civil day of month.
772
+ */
773
+ readonly day: bigint;
774
+ /**
775
+ * Civil hour of day.
776
+ */
777
+ readonly hour: bigint;
778
+ /**
779
+ * Civil minute of hour.
780
+ */
781
+ readonly minute: bigint;
782
+ /**
783
+ * Civil month, 1-12.
784
+ */
785
+ readonly month: bigint;
786
+ /**
787
+ * Whole civil second of minute.
788
+ */
789
+ readonly second: bigint;
790
+ /**
791
+ * Civil year.
792
+ */
793
+ readonly year: bigint;
794
+ }
795
+
646
796
  /**
647
797
  * A civil GPS-time epoch for RINEX clock interpolation. Calendar fields are
648
798
  * interpreted in GPS time; `gpsSeconds` is seconds since 1980-01-06 GPST.
@@ -762,6 +912,90 @@ export class ConjunctionState {
762
912
  readonly velocityKmS: Float64Array;
763
913
  }
764
914
 
915
+ /**
916
+ * A built-once constellation of already-initialized SGP4 satellites for repeated
917
+ * batch operations.
918
+ *
919
+ * Build it once from parsed [`Tle`]s, then call [`Constellation.propagate`] (and
920
+ * `visible` / `lookAngleArcs` / `groundTracks` / `passes`) as often as you like:
921
+ * it OWNS its satellites and BORROWS them on each call, so unlike the free
922
+ * [`propagateBatch`] (which consumes the `Tle` handles it is given) the same
923
+ * `Constellation` drives a live scene across frames with no re-parse and no
924
+ * per-frame handle churn. This is the JS form of Elixir's `Sidereon.Constellation`.
925
+ *
926
+ * It does no parsing or I/O: TLE text becomes satellites at the interface
927
+ * boundary ([`Tle`] / [`parseTleFile`]); the constellation only batches the core
928
+ * geometry over the satellites it was handed.
929
+ */
930
+ export class Constellation {
931
+ free(): void;
932
+ [Symbol.dispose](): void;
933
+ /**
934
+ * Sub-satellite WGS84 ground tracks for every satellite over a shared epoch
935
+ * grid, in fleet order (element `i` is satellite `i`'s track), each reduced
936
+ * TEME->GCRS->ITRS->geodetic by the engine's validated transforms. A satellite
937
+ * that fails yields an empty track, keeping the result index-aligned. The
938
+ * batched form of [`Tle.groundTrack`].
939
+ */
940
+ groundTracks(epochs_unix_us: BigInt64Array): GroundTrack[];
941
+ /**
942
+ * Topocentric az/el/range arcs from `station` for every satellite over a
943
+ * shared epoch grid, in fleet order (element `i` is satellite `i`'s arc). A
944
+ * satellite that fails to propagate yields an empty arc, so the result stays
945
+ * index-aligned with the constellation. The batched form of [`Tle.lookAngles`].
946
+ */
947
+ lookAngleArcs(station: GroundStation, epochs_unix_us: BigInt64Array): LookAngles[];
948
+ /**
949
+ * Build a constellation from already-parsed [`Tle`]s, taking ownership of
950
+ * them. Each `Tle` keeps the opsmode it was constructed with, and its NORAD
951
+ * catalog number becomes the satellite's id in `visible`. The input order is
952
+ * the fleet order (the leading axis of every batch result and the
953
+ * `satelliteIndex` of every pass). The `Tle` handles are consumed; clone first
954
+ * (`tle.clone()`) to keep a per-satellite handle.
955
+ */
956
+ constructor(satellites: Tle[]);
957
+ /**
958
+ * Passes over `station` within `[startUnixUs, endUnixUs)` for every satellite,
959
+ * flattened across the constellation: each [`FleetPass`] carries the
960
+ * `satelliteIndex` (fleet-order) it belongs to. `elevationMaskDeg` defaults to
961
+ * 0, `stepSeconds` to 30, `timeToleranceS` to 1e-3. A satellite that fails to
962
+ * scan contributes no passes. Throws a `RangeError` on a non-positive step or
963
+ * an end at or before the start.
964
+ */
965
+ passes(station: GroundStation, start_unix_us: bigint, end_unix_us: bigint, elevation_mask_deg?: number | null, step_seconds?: number | null, time_tolerance_s?: number | null): FleetPass[];
966
+ /**
967
+ * Propagate the whole constellation over a shared epoch grid in one call,
968
+ * borrowing it (NOT consumed, so the same `Constellation` drives every frame).
969
+ *
970
+ * `epochsUnixUs` is a `BigInt64Array` of unix-microsecond UTC epochs shared
971
+ * by every satellite. Element `(i, j)` of the result is satellite `i`
972
+ * propagated to epoch `j`, bit-for-bit identical to the per-satellite
973
+ * [`Tle.propagate`] path. A satellite that fails to propagate yields `NaN`
974
+ * for all of its epochs, keeping the result index-aligned (mirroring Elixir's
975
+ * `propagate_all`, which surfaces per-satellite outcomes rather than failing
976
+ * the whole batch). An empty constellation or empty epoch grid yields empty
977
+ * arrays.
978
+ */
979
+ propagate(epochs_unix_us: BigInt64Array): FleetPropagation;
980
+ /**
981
+ * Satellites above `minElevationDeg` from `station` at a single epoch, each
982
+ * with its catalog number and topocentric az/el/range, sorted by elevation
983
+ * (highest first). The constellation form of the core `visibleFromSatellites`
984
+ * (Elixir `Constellation.visible_from`). Throws on an invalid station or
985
+ * elevation threshold.
986
+ */
987
+ visible(station: GroundStation, epoch_unix_us: bigint, min_elevation_deg: number): VisibleSatellite[];
988
+ /**
989
+ * The satellites' NORAD catalog numbers, in fleet order.
990
+ */
991
+ readonly catalogNumbers: string[];
992
+ /**
993
+ * Number of satellites in the constellation (the leading axis of every batch
994
+ * result).
995
+ */
996
+ readonly satelliteCount: number;
997
+ }
998
+
765
999
  /**
766
1000
  * Coherent GPS C/A correlation result.
767
1001
  */
@@ -783,6 +1017,49 @@ export class CorrelationResult {
783
1017
  readonly q: number;
784
1018
  }
785
1019
 
1020
+ /**
1021
+ * A computed look-angle grid for a set of satellites and ground stations at one
1022
+ * epoch. Build with [`coverageLookAngles`].
1023
+ */
1024
+ export class CoverageGrid {
1025
+ private constructor();
1026
+ free(): void;
1027
+ [Symbol.dispose](): void;
1028
+ /**
1029
+ * Number of visible satellites per station at `minElevationDeg`, as a flat
1030
+ * array of length `stationCount`. Delegates to
1031
+ * `sidereon_core::astro::coverage::access_counts`.
1032
+ */
1033
+ accessCounts(min_elevation_deg: number): Uint32Array;
1034
+ /**
1035
+ * The look angle for one satellite/station pair as `[azimuthDeg,
1036
+ * elevationDeg, rangeKm]`, or `undefined` when that cell failed (the
1037
+ * satellite was below the horizon geometry the kernel rejects) or the
1038
+ * indices are out of range.
1039
+ */
1040
+ lookAngle(satellite_index: number, station_index: number): Float64Array | undefined;
1041
+ /**
1042
+ * Maximum successful elevation per station, degrees, as a flat array of
1043
+ * length `stationCount`. A station with no successful cell reports `NaN`.
1044
+ * Delegates to `sidereon_core::astro::coverage::max_elevation`.
1045
+ */
1046
+ maxElevationDeg(): Float64Array;
1047
+ /**
1048
+ * Row-major `[satellite][station]` visibility mask at `minElevationDeg`, as a
1049
+ * flat `Uint8Array` of `1` (visible) / `0`. Error cells are not visible.
1050
+ * Delegates to `sidereon_core::astro::coverage::visible_mask`.
1051
+ */
1052
+ visibleMask(min_elevation_deg: number): Uint8Array;
1053
+ /**
1054
+ * Number of satellites (grid rows).
1055
+ */
1056
+ readonly satelliteCount: number;
1057
+ /**
1058
+ * Number of ground stations (grid columns).
1059
+ */
1060
+ readonly stationCount: number;
1061
+ }
1062
+
786
1063
  /**
787
1064
  * A DGNSS rover solve: the corrected SPP solution plus the base-relative
788
1065
  * baseline.
@@ -860,6 +1137,50 @@ export class Dop {
860
1137
  * Position DOP.
861
1138
  */
862
1139
  readonly pdop: number;
1140
+ /**
1141
+ * Per-clock-column time DOP: entry `i` is the cofactor standard deviation
1142
+ * of the `i`-th clock state, indexed by clock column rather than tagged by
1143
+ * constellation. The geometry-only `dop` path (`fromAzEl`,
1144
+ * `fromLineOfSight`, `gnssDop`) carries no constellation context, so it
1145
+ * leaves this **empty**; read the lone clock's value off [`tdop`](Self::tdop).
1146
+ * Per-system entries are only populated on the multi-clock SPP path; pair
1147
+ * them with that solve's system ordering via `SppSolution.systemTdops`.
1148
+ */
1149
+ readonly systemTdops: Float64Array;
1150
+ /**
1151
+ * Time DOP.
1152
+ */
1153
+ readonly tdop: number;
1154
+ /**
1155
+ * Vertical DOP.
1156
+ */
1157
+ readonly vdop: number;
1158
+ }
1159
+
1160
+ /**
1161
+ * Exact DOP at one epoch: the scalars plus the satellites that contributed
1162
+ * rows, from `gnssDopAtEpoch`.
1163
+ */
1164
+ export class DopGeometry {
1165
+ private constructor();
1166
+ free(): void;
1167
+ [Symbol.dispose](): void;
1168
+ /**
1169
+ * Geometric DOP.
1170
+ */
1171
+ readonly gdop: number;
1172
+ /**
1173
+ * Horizontal DOP.
1174
+ */
1175
+ readonly hdop: number;
1176
+ /**
1177
+ * Position DOP.
1178
+ */
1179
+ readonly pdop: number;
1180
+ /**
1181
+ * Satellite tokens that contributed line-of-sight rows.
1182
+ */
1183
+ readonly satellites: string[];
863
1184
  /**
864
1185
  * Time DOP.
865
1186
  */
@@ -920,6 +1241,64 @@ export class DopSeries {
920
1241
  readonly vdop: Float64Array;
921
1242
  }
922
1243
 
1244
+ /**
1245
+ * One sampled exact-DOP point over a uniform window, from `gnssDopSeriesWindow`.
1246
+ */
1247
+ export class DopSeriesSample {
1248
+ private constructor();
1249
+ free(): void;
1250
+ [Symbol.dispose](): void;
1251
+ /**
1252
+ * Geometric DOP.
1253
+ */
1254
+ readonly gdop: number;
1255
+ /**
1256
+ * Horizontal DOP.
1257
+ */
1258
+ readonly hdop: number;
1259
+ /**
1260
+ * Position DOP.
1261
+ */
1262
+ readonly pdop: number;
1263
+ /**
1264
+ * Satellite tokens that contributed rows at this sample.
1265
+ */
1266
+ readonly satellites: string[];
1267
+ /**
1268
+ * Zero-based sample index from the window start.
1269
+ */
1270
+ readonly stepIndex: number;
1271
+ /**
1272
+ * Time DOP.
1273
+ */
1274
+ readonly tdop: number;
1275
+ /**
1276
+ * Vertical DOP.
1277
+ */
1278
+ readonly vdop: number;
1279
+ }
1280
+
1281
+ /**
1282
+ * Range-rate and Doppler result for a carrier frequency.
1283
+ */
1284
+ export class DopplerShift {
1285
+ private constructor();
1286
+ free(): void;
1287
+ [Symbol.dispose](): void;
1288
+ /**
1289
+ * Carrier Doppler shift, hertz; positive means a frequency increase.
1290
+ */
1291
+ readonly dopplerHz: number;
1292
+ /**
1293
+ * Dimensionless Doppler ratio; positive means approaching the station.
1294
+ */
1295
+ readonly dopplerRatio: number;
1296
+ /**
1297
+ * Range rate, kilometres per second; positive means receding.
1298
+ */
1299
+ readonly rangeRateKmS: number;
1300
+ }
1301
+
923
1302
  /**
924
1303
  * Orthonormal encounter frame built from two relative states.
925
1304
  */
@@ -988,6 +1367,37 @@ export class Ephemeris {
988
1367
  readonly velocityKmS: Float64Array;
989
1368
  }
990
1369
 
1370
+ /**
1371
+ * A confidence ellipse from a 2x2 covariance block: semi-axes scaled by the
1372
+ * two-degree-of-freedom chi-square quantile `-2 ln(1 - confidence)`.
1373
+ */
1374
+ export class ErrorEllipse2 {
1375
+ private constructor();
1376
+ free(): void;
1377
+ [Symbol.dispose](): void;
1378
+ /**
1379
+ * Two-degree-of-freedom chi-square scale `-2 ln(1 - confidence)`.
1380
+ */
1381
+ readonly chiSquareScale: number;
1382
+ /**
1383
+ * Requested confidence probability in `(0, 1)`.
1384
+ */
1385
+ readonly confidence: number;
1386
+ /**
1387
+ * Semi-major-axis orientation in radians, from the first (row/col 0) axis
1388
+ * toward the second (row/col 1) axis.
1389
+ */
1390
+ readonly orientationRad: number;
1391
+ /**
1392
+ * Semi-major axis length (same unit as the square root of the covariance).
1393
+ */
1394
+ readonly semiMajor: number;
1395
+ /**
1396
+ * Semi-minor axis length.
1397
+ */
1398
+ readonly semiMinor: number;
1399
+ }
1400
+
991
1401
  /**
992
1402
  * A fault-detection-and-exclusion result: the surviving solution, the excluded
993
1403
  * satellites in exclusion order, and the number of exclusions performed.
@@ -1027,65 +1437,191 @@ export class FdeSolution {
1027
1437
  }
1028
1438
 
1029
1439
  /**
1030
- * A batch of transformed states from [`temeToGcrs`]: flat row-major
1031
- * `positionKm` and `velocityKmS` `Float64Array`s, each length `3 * epochCount`.
1440
+ * One pass in a [`Constellation.passes`] result: the pass geometry plus the
1441
+ * fleet-order `satelliteIndex` of the satellite it belongs to (map that index to
1442
+ * your own per-satellite metadata).
1032
1443
  */
1033
- export class FrameStates {
1444
+ export class FleetPass {
1034
1445
  private constructor();
1035
1446
  free(): void;
1036
1447
  [Symbol.dispose](): void;
1037
1448
  /**
1038
- * Number of states in the batch.
1449
+ * AOS (acquisition of signal), unix microseconds.
1039
1450
  */
1040
- readonly epochCount: number;
1451
+ readonly aosUnixUs: bigint;
1041
1452
  /**
1042
- * Transformed positions, kilometres, flat row-major `(n, 3)`.
1453
+ * Culmination (peak elevation) time, unix microseconds.
1043
1454
  */
1044
- readonly positionKm: Float64Array;
1455
+ readonly culminationUnixUs: bigint;
1045
1456
  /**
1046
- * Transformed velocities, km/s, flat row-major `(n, 3)`.
1457
+ * LOS (loss of signal), unix microseconds.
1047
1458
  */
1048
- readonly velocityKmS: Float64Array;
1459
+ readonly losUnixUs: bigint;
1460
+ /**
1461
+ * Peak elevation during the pass, degrees.
1462
+ */
1463
+ readonly maxElevationDeg: number;
1464
+ /**
1465
+ * Fleet-order index of the satellite this pass belongs to.
1466
+ */
1467
+ readonly satelliteIndex: number;
1049
1468
  }
1050
1469
 
1051
1470
  /**
1052
- * One GLONASS broadcast state-vector record. `toeUtcJ2000S` is UTC seconds past
1053
- * J2000; position is PZ-90.11 ECEF metres, velocity m/s, acceleration m/s^2.
1471
+ * TEME states from a batched fleet SGP4 propagation. Each array is flat
1472
+ * row-major with shape `(satelliteCount, epochCount, 3)`: satellite `i`'s arc
1473
+ * occupies the contiguous slice `[i * epochCount * 3 .. (i + 1) * epochCount *
1474
+ * 3]`, and within it epoch `j` is `[.. j * 3 + 3]`. Satellite `i`'s arc equals
1475
+ * the [`TlePropagation`] from `satellites[i].propagate(epochsUnixUs)`.
1054
1476
  */
1055
- export class GlonassRecordJs {
1477
+ export class FleetPropagation {
1056
1478
  private constructor();
1057
1479
  free(): void;
1058
1480
  [Symbol.dispose](): void;
1059
1481
  /**
1060
- * Lunisolar acceleration `[ax, ay, az]`, metres per second squared.
1482
+ * Number of epochs each satellite was propagated to (the second axis).
1061
1483
  */
1062
- readonly accelerationMS2: Float64Array;
1484
+ readonly epochCount: number;
1063
1485
  /**
1064
- * Broadcast clock bias, seconds.
1486
+ * TEME positions, km, flat row-major `(satelliteCount, epochCount, 3)`,
1487
+ * length `3 * satelliteCount * epochCount`.
1065
1488
  */
1066
- readonly clockBiasS: number;
1489
+ readonly positionKm: Float64Array;
1067
1490
  /**
1068
- * FDMA frequency-channel number.
1491
+ * Number of satellites in the fleet (the leading axis).
1069
1492
  */
1070
- readonly freqChannel: number;
1493
+ readonly satelliteCount: number;
1071
1494
  /**
1072
- * Relative frequency offset.
1495
+ * TEME velocities, km/s, flat row-major `(satelliteCount, epochCount, 3)`,
1496
+ * length `3 * satelliteCount * epochCount`.
1073
1497
  */
1074
- readonly gammaN: number;
1498
+ readonly velocityKmS: Float64Array;
1499
+ }
1500
+
1501
+ /**
1502
+ * A forgiving RTCM 3 stream scanner: slides over a byte buffer, resynchronizes
1503
+ * on the next `0xD3` preamble whenever the length overruns or the CRC fails, and
1504
+ * yields only frames whose CRC verifies, exactly as a receiver locks onto a
1505
+ * serial feed.
1506
+ *
1507
+ * Wraps `sidereon_core::rtcm::FrameScanner`: construction runs the scan to
1508
+ * completion (the core iterator owns the scanning logic) and `next()` walks the
1509
+ * yielded frames.
1510
+ */
1511
+ export class FrameScanner {
1512
+ free(): void;
1513
+ [Symbol.dispose](): void;
1075
1514
  /**
1076
- * PZ-90.11 ECEF position `[x, y, z]`, metres.
1515
+ * Begin scanning `bytes` from the start.
1077
1516
  */
1078
- readonly positionM: Float64Array;
1517
+ constructor(bytes: Uint8Array);
1079
1518
  /**
1080
- * RINEX satellite token such as `"R10"`.
1519
+ * The next CRC-valid frame as `{ body, frameLen }` (`body` a `Uint8Array`,
1520
+ * the message body between the length word and the CRC), or `undefined` when
1521
+ * the scan is exhausted.
1081
1522
  */
1082
- readonly satellite: string;
1523
+ next(): any;
1083
1524
  /**
1084
- * Satellite health; 0 is healthy.
1525
+ * The total number of CRC-valid frames the scan found.
1085
1526
  */
1086
- readonly svHealth: number;
1087
- /**
1088
- * Reference epoch, UTC seconds past J2000.
1527
+ readonly length: number;
1528
+ }
1529
+
1530
+ /**
1531
+ * A batch of transformed states from [`temeToGcrs`]: flat row-major
1532
+ * `positionKm` and `velocityKmS` `Float64Array`s, each length `3 * epochCount`.
1533
+ */
1534
+ export class FrameStates {
1535
+ private constructor();
1536
+ free(): void;
1537
+ [Symbol.dispose](): void;
1538
+ /**
1539
+ * Number of states in the batch.
1540
+ */
1541
+ readonly epochCount: number;
1542
+ /**
1543
+ * Transformed positions, kilometres, flat row-major `(n, 3)`.
1544
+ */
1545
+ readonly positionKm: Float64Array;
1546
+ /**
1547
+ * Transformed velocities, km/s, flat row-major `(n, 3)`.
1548
+ */
1549
+ readonly velocityKmS: Float64Array;
1550
+ }
1551
+
1552
+ /**
1553
+ * A regular latitude/longitude grid of geoid undulation samples with bilinear
1554
+ * interpolation, wrapping a real (loaded) geoid model.
1555
+ */
1556
+ export class GeoidGrid {
1557
+ free(): void;
1558
+ [Symbol.dispose](): void;
1559
+ /**
1560
+ * Parse a grid from the documented whitespace-delimited text format (a
1561
+ * six-field header `lat_min lon_min dlat dlon n_lat n_lon` followed by
1562
+ * `n_lat * n_lon` samples in metres). Throws an `Error` on a malformed
1563
+ * header or sample. Delegates to
1564
+ * `sidereon_core::geoid::GeoidGrid::from_text`.
1565
+ */
1566
+ static fromText(text: string): GeoidGrid;
1567
+ /**
1568
+ * Build a grid from its origin, spacing, dimensions, and row-major samples
1569
+ * (metres, latitude ascending outer, longitude ascending inner). Throws an
1570
+ * `Error` when a dimension is zero, the sample count is not `nLat * nLon`, a
1571
+ * spacing/origin is non-finite or a spacing is non-positive, or a sample is
1572
+ * non-finite. Delegates to `sidereon_core::geoid::GeoidGrid::new`.
1573
+ */
1574
+ constructor(lat_min_deg: number, lon_min_deg: number, dlat_deg: number, dlon_deg: number, n_lat: number, n_lon: number, values_m: Float64Array);
1575
+ /**
1576
+ * Bilinearly interpolated undulation `N` (metres) at a geodetic position in
1577
+ * degrees (latitude positive north, longitude positive east).
1578
+ */
1579
+ undulationDeg(lat_deg: number, lon_deg: number): number;
1580
+ /**
1581
+ * Bilinearly interpolated undulation `N` (metres) at a geodetic position in
1582
+ * radians (latitude positive north, longitude positive east).
1583
+ */
1584
+ undulationRad(lat_rad: number, lon_rad: number): number;
1585
+ }
1586
+
1587
+ /**
1588
+ * One GLONASS broadcast state-vector record. `toeUtcJ2000S` is UTC seconds past
1589
+ * J2000; position is PZ-90.11 ECEF metres, velocity m/s, acceleration m/s^2.
1590
+ */
1591
+ export class GlonassRecordJs {
1592
+ private constructor();
1593
+ free(): void;
1594
+ [Symbol.dispose](): void;
1595
+ /**
1596
+ * Lunisolar acceleration `[ax, ay, az]`, metres per second squared.
1597
+ */
1598
+ readonly accelerationMS2: Float64Array;
1599
+ /**
1600
+ * Broadcast clock bias, seconds.
1601
+ */
1602
+ readonly clockBiasS: number;
1603
+ /**
1604
+ * FDMA frequency-channel number.
1605
+ */
1606
+ readonly freqChannel: number;
1607
+ /**
1608
+ * Relative frequency offset.
1609
+ */
1610
+ readonly gammaN: number;
1611
+ /**
1612
+ * PZ-90.11 ECEF position `[x, y, z]`, metres.
1613
+ */
1614
+ readonly positionM: Float64Array;
1615
+ /**
1616
+ * RINEX satellite token such as `"R10"`.
1617
+ */
1618
+ readonly satellite: string;
1619
+ /**
1620
+ * Satellite health; 0 is healthy.
1621
+ */
1622
+ readonly svHealth: number;
1623
+ /**
1624
+ * Reference epoch, UTC seconds past J2000.
1089
1625
  */
1090
1626
  readonly toeUtcJ2000S: number;
1091
1627
  /**
@@ -1094,6 +1630,35 @@ export class GlonassRecordJs {
1094
1630
  readonly velocityMS: Float64Array;
1095
1631
  }
1096
1632
 
1633
+ /**
1634
+ * One sampled rise/set/peak visibility pass, from `gnssPasses`.
1635
+ */
1636
+ export class GnssPass {
1637
+ private constructor();
1638
+ free(): void;
1639
+ [Symbol.dispose](): void;
1640
+ /**
1641
+ * Maximum sampled elevation in the pass, degrees.
1642
+ */
1643
+ readonly peakElevationDeg: number;
1644
+ /**
1645
+ * Zero-based sample index of the maximum sampled elevation.
1646
+ */
1647
+ readonly peakStepIndex: number;
1648
+ /**
1649
+ * Zero-based sample index of the first above-mask sample.
1650
+ */
1651
+ readonly riseStepIndex: number;
1652
+ /**
1653
+ * Satellite token, e.g. `"G05"`.
1654
+ */
1655
+ readonly satellite: string;
1656
+ /**
1657
+ * Zero-based sample index of the last above-mask sample.
1658
+ */
1659
+ readonly setStepIndex: number;
1660
+ }
1661
+
1097
1662
  /**
1098
1663
  * A GNSS constellation. The JS value matches the variant order below.
1099
1664
  */
@@ -1128,6 +1693,45 @@ export enum GnssSystem {
1128
1693
  Sbas = 6,
1129
1694
  }
1130
1695
 
1696
+ /**
1697
+ * Per-epoch visible-satellite count over a sampled window, from
1698
+ * `gnssVisibilitySeries`.
1699
+ */
1700
+ export class GnssVisibilityCount {
1701
+ private constructor();
1702
+ free(): void;
1703
+ [Symbol.dispose](): void;
1704
+ /**
1705
+ * Number of satellites visible at this sample.
1706
+ */
1707
+ readonly nVisible: number;
1708
+ /**
1709
+ * Zero-based sample index from the window start.
1710
+ */
1711
+ readonly stepIndex: number;
1712
+ }
1713
+
1714
+ /**
1715
+ * One satellite above the elevation mask at a single epoch, from `gnssVisible`.
1716
+ */
1717
+ export class GnssVisibleSatellite {
1718
+ private constructor();
1719
+ free(): void;
1720
+ [Symbol.dispose](): void;
1721
+ /**
1722
+ * Topocentric azimuth in `[0, 360)`, degrees.
1723
+ */
1724
+ readonly azimuthDeg: number;
1725
+ /**
1726
+ * Topocentric elevation, degrees.
1727
+ */
1728
+ readonly elevationDeg: number;
1729
+ /**
1730
+ * Satellite token, e.g. `"G05"`.
1731
+ */
1732
+ readonly satellite: string;
1733
+ }
1734
+
1131
1735
  /**
1132
1736
  * A GNSS week number plus time-of-week, tagged by constellation.
1133
1737
  */
@@ -1177,6 +1781,34 @@ export class GroundStation {
1177
1781
  readonly longitudeDeg: number;
1178
1782
  }
1179
1783
 
1784
+ /**
1785
+ * Sub-satellite ground-track points from a batched [`Tle.groundTrack`] call.
1786
+ * Each array is a `Float64Array` of length `epochCount`, aligned to the input
1787
+ * epoch grid. WGS84 geodetic: latitude/longitude in degrees, ellipsoidal height
1788
+ * in kilometres.
1789
+ */
1790
+ export class GroundTrack {
1791
+ private constructor();
1792
+ free(): void;
1793
+ [Symbol.dispose](): void;
1794
+ /**
1795
+ * Ellipsoidal height above the WGS84 ellipsoid, kilometres.
1796
+ */
1797
+ readonly altKm: Float64Array;
1798
+ /**
1799
+ * Number of epochs evaluated.
1800
+ */
1801
+ readonly epochCount: number;
1802
+ /**
1803
+ * Geodetic latitude of the sub-satellite point, degrees north.
1804
+ */
1805
+ readonly latDeg: Float64Array;
1806
+ /**
1807
+ * Geodetic longitude of the sub-satellite point, degrees east in `[-180, 180]`.
1808
+ */
1809
+ readonly lonDeg: Float64Array;
1810
+ }
1811
+
1180
1812
  /**
1181
1813
  * A point in time, tagged UTC, with the precise time scales resolved.
1182
1814
  *
@@ -1276,6 +1908,49 @@ export class Instant {
1276
1908
  readonly ut1JdSplit: JulianDate;
1277
1909
  }
1278
1910
 
1911
+ /**
1912
+ * A determined orbit state: position and velocity at one epoch.
1913
+ */
1914
+ export class IodState {
1915
+ private constructor();
1916
+ free(): void;
1917
+ [Symbol.dispose](): void;
1918
+ /**
1919
+ * Position `[x, y, z]`, kilometres.
1920
+ */
1921
+ readonly positionKm: Float64Array;
1922
+ /**
1923
+ * Velocity `[vx, vy, vz]`, kilometres per second.
1924
+ */
1925
+ readonly velocityKmS: Float64Array;
1926
+ }
1927
+
1928
+ /**
1929
+ * A Gibbs / Herrick-Gibbs velocity solve: the velocity at the middle position
1930
+ * and the geometry diagnostics.
1931
+ */
1932
+ export class IodVelocity {
1933
+ private constructor();
1934
+ free(): void;
1935
+ [Symbol.dispose](): void;
1936
+ /**
1937
+ * Coplanarity angle of the three position vectors, radians.
1938
+ */
1939
+ readonly coplanarityRad: number;
1940
+ /**
1941
+ * Angle between the first and second position vectors, radians.
1942
+ */
1943
+ readonly theta12Rad: number;
1944
+ /**
1945
+ * Angle between the second and third position vectors, radians.
1946
+ */
1947
+ readonly theta23Rad: number;
1948
+ /**
1949
+ * Velocity at the middle position `[vx, vy, vz]`, kilometres per second.
1950
+ */
1951
+ readonly velocityKmS: Float64Array;
1952
+ }
1953
+
1279
1954
  /**
1280
1955
  * A parsed IONEX vertical-TEC product. Create with [`load_ionex`].
1281
1956
  */
@@ -1294,6 +1969,13 @@ export class Ionex {
1294
1969
  * a `RangeError` on non-finite input and an `Error` on out-of-range input.
1295
1970
  */
1296
1971
  slantDelay(lat_deg: number, lon_deg: number, azimuth_deg: number, elevation_deg: number, epoch_j2000_s: number, frequency_hz: number): number;
1972
+ /**
1973
+ * Serialize to standard IONEX text. Deterministic: the same product always
1974
+ * produces byte-identical text, and re-parsing the output yields an equal
1975
+ * product (the canonical node axes, geometry, exponent, map epochs, and
1976
+ * every TEC/RMS value).
1977
+ */
1978
+ toIonexString(): string;
1297
1979
  /**
1298
1980
  * Mean Earth radius used by the geometry, kilometres.
1299
1981
  */
@@ -1430,6 +2112,19 @@ export class JulianDate {
1430
2112
  private constructor();
1431
2113
  free(): void;
1432
2114
  [Symbol.dispose](): void;
2115
+ /**
2116
+ * Build the no-leap civil UTC two-part Julian date for calendar fields.
2117
+ *
2118
+ * Delegates to `sidereon_core::astro::time::model::Instant::from_utc_civil`:
2119
+ * `(year, month, day, hour, minute, second)` are marshalled through the
2120
+ * engine's `split_julian_date`, tagged UTC, with no leap second applied
2121
+ * (the civil convention the ionosphere / troposphere dispatchers consume).
2122
+ * This is distinct from the leap-aware `Instant`, whose TT/UT1/TDB scales
2123
+ * run the full UTC conversion. `second` may be fractional. Throws a
2124
+ * `RangeError` on an out-of-day field whose residual leaves the one-day
2125
+ * fraction window.
2126
+ */
2127
+ static fromUtcCivil(year: number, month: number, day: number, hour?: number | null, minute?: number | null, second?: number | null): JulianDate;
1433
2128
  /**
1434
2129
  * Residual day fraction relative to `whole`.
1435
2130
  */
@@ -1487,6 +2182,23 @@ export class KlobucharAlphaBetaJs {
1487
2182
  readonly beta: Float64Array;
1488
2183
  }
1489
2184
 
2185
+ /**
2186
+ * The two transfer velocity vectors of a Lambert solution.
2187
+ */
2188
+ export class LambertTransfer {
2189
+ private constructor();
2190
+ free(): void;
2191
+ [Symbol.dispose](): void;
2192
+ /**
2193
+ * Transfer velocity at `r2` (arrival) `[vx, vy, vz]`, km/s.
2194
+ */
2195
+ readonly arrivalVelocityKmS: Float64Array;
2196
+ /**
2197
+ * Transfer velocity at `r1` (departure) `[vx, vy, vz]`, km/s.
2198
+ */
2199
+ readonly departureVelocityKmS: Float64Array;
2200
+ }
2201
+
1490
2202
  /**
1491
2203
  * Provenance and coverage of the embedded IERS leap-second (TAI-UTC) table.
1492
2204
  */
@@ -1512,6 +2224,95 @@ export class LeapSecondTable {
1512
2224
  readonly source: string;
1513
2225
  }
1514
2226
 
2227
+ /**
2228
+ * A serial leave-one-out sweep: the base solve over all rows plus one re-solve
2229
+ * per masked row, with the per-row optimum-cost shift.
2230
+ */
2231
+ export class LeastSquaresDropOneReport {
2232
+ private constructor();
2233
+ free(): void;
2234
+ [Symbol.dispose](): void;
2235
+ /**
2236
+ * The solve with residual row `index` masked out. Throws a `RangeError` for
2237
+ * an out-of-range index.
2238
+ */
2239
+ dropAt(index: number): LeastSquaresResult;
2240
+ /**
2241
+ * The solve over the full residual.
2242
+ */
2243
+ readonly base: LeastSquaresResult;
2244
+ /**
2245
+ * `costDeltas[i] = dropAt(i).cost - base.cost`: how much the optimum cost
2246
+ * moves when row `i` is removed. `Float64Array` of length `count`.
2247
+ */
2248
+ readonly costDeltas: Float64Array;
2249
+ /**
2250
+ * Number of masked-row re-solves (equals the residual-row count `m`).
2251
+ */
2252
+ readonly count: number;
2253
+ }
2254
+
2255
+ /**
2256
+ * The outcome of one trust-region least-squares solve, mirroring the fields of
2257
+ * `scipy.optimize.least_squares`'s `OptimizeResult`.
2258
+ */
2259
+ export class LeastSquaresResult {
2260
+ private constructor();
2261
+ free(): void;
2262
+ [Symbol.dispose](): void;
2263
+ /**
2264
+ * Optimal cost `0.5 * sum(residual^2)` (after robust reweighting when a
2265
+ * non-linear loss is used).
2266
+ */
2267
+ readonly cost: number;
2268
+ /**
2269
+ * Residual vector at the solution, `Float64Array` of length `m`.
2270
+ */
2271
+ readonly fun: Float64Array;
2272
+ /**
2273
+ * Gradient `J^T f` at the solution, `Float64Array` of length `n`.
2274
+ */
2275
+ readonly grad: Float64Array;
2276
+ /**
2277
+ * Row-major `m`-by-`n` Jacobian at the solution, flat `Float64Array` of
2278
+ * length `m * n`.
2279
+ */
2280
+ readonly jac: Float64Array;
2281
+ /**
2282
+ * Residual row count `m`.
2283
+ */
2284
+ readonly m: number;
2285
+ /**
2286
+ * Parameter count `n`.
2287
+ */
2288
+ readonly n: number;
2289
+ /**
2290
+ * Number of residual evaluations.
2291
+ */
2292
+ readonly nfev: number;
2293
+ /**
2294
+ * Number of Jacobian evaluations.
2295
+ */
2296
+ readonly njev: number;
2297
+ /**
2298
+ * First-order optimality `||J^T f||_inf` at the solution.
2299
+ */
2300
+ readonly optimality: number;
2301
+ /**
2302
+ * SciPy-compatible termination status: `0` max evaluations, `1` gtol,
2303
+ * `2` ftol, `3` xtol, `4` both ftol and xtol.
2304
+ */
2305
+ readonly status: number;
2306
+ /**
2307
+ * Whether the solve converged (`status > 0`).
2308
+ */
2309
+ readonly success: boolean;
2310
+ /**
2311
+ * Solution parameter vector, `Float64Array` of length `n`.
2312
+ */
2313
+ readonly x: Float64Array;
2314
+ }
2315
+
1515
2316
  /**
1516
2317
  * Link-budget inputs for [`LinkBudget.margin`].
1517
2318
  */
@@ -1550,46 +2351,291 @@ export class LinkBudget {
1550
2351
  }
1551
2352
 
1552
2353
  /**
1553
- * Topocentric look angles from a batched arc, each a `Float64Array` of length
1554
- * `epochCount`.
2354
+ * Decoded LNAV clock and ephemeris parameters (engineering units). Integer
2355
+ * fields are recovered exactly; scaled fields are the transmitted integer times
2356
+ * the IS-GPS-200 LSB. `l2_p_data_flag` is encode-only and not recovered.
1555
2357
  */
1556
- export class LookAngles {
2358
+ export class LnavDecoded {
1557
2359
  private constructor();
1558
2360
  free(): void;
1559
2361
  [Symbol.dispose](): void;
1560
2362
  /**
1561
- * Azimuth, degrees clockwise from north.
2363
+ * Clock bias coefficient, seconds.
1562
2364
  */
1563
- readonly azimuthDeg: Float64Array;
2365
+ readonly af0: number;
1564
2366
  /**
1565
- * Elevation, degrees above the horizon.
2367
+ * Clock drift coefficient, seconds per second.
1566
2368
  */
1567
- readonly elevationDeg: Float64Array;
2369
+ readonly af1: number;
1568
2370
  /**
1569
- * Number of epochs evaluated.
2371
+ * Clock drift-rate coefficient, seconds per second squared.
1570
2372
  */
1571
- readonly epochCount: number;
2373
+ readonly af2: number;
1572
2374
  /**
1573
- * Slant range, kilometres.
2375
+ * Age of data offset.
1574
2376
  */
1575
- readonly rangeKm: Float64Array;
1576
- }
1577
-
1578
- /**
1579
- * Niell hydrostatic and wet mapping factors, dimensionless.
1580
- */
1581
- export class MappingFactors {
1582
- private constructor();
1583
- free(): void;
1584
- [Symbol.dispose](): void;
2377
+ readonly aodo: number;
1585
2378
  /**
1586
- * Hydrostatic mapping factor (includes the height correction).
2379
+ * Cosine harmonic correction to inclination, radians.
1587
2380
  */
1588
- readonly dry: number;
2381
+ readonly cic: number;
1589
2382
  /**
1590
- * Wet mapping factor.
2383
+ * Sine harmonic correction to inclination, radians.
1591
2384
  */
1592
- readonly wet: number;
2385
+ readonly cis: number;
2386
+ /**
2387
+ * Cosine harmonic correction to orbit radius, metres.
2388
+ */
2389
+ readonly crc: number;
2390
+ /**
2391
+ * Sine harmonic correction to orbit radius, metres.
2392
+ */
2393
+ readonly crs: number;
2394
+ /**
2395
+ * Cosine harmonic correction to argument of latitude, radians.
2396
+ */
2397
+ readonly cuc: number;
2398
+ /**
2399
+ * Sine harmonic correction to argument of latitude, radians.
2400
+ */
2401
+ readonly cus: number;
2402
+ /**
2403
+ * Mean motion difference, radians per second.
2404
+ */
2405
+ readonly deltaN: number;
2406
+ /**
2407
+ * Eccentricity.
2408
+ */
2409
+ readonly eccentricity: number;
2410
+ /**
2411
+ * Fit-interval flag.
2412
+ */
2413
+ readonly fitIntervalFlag: number;
2414
+ /**
2415
+ * Inclination at reference time, radians.
2416
+ */
2417
+ readonly i0: number;
2418
+ /**
2419
+ * Rate of inclination, radians per second.
2420
+ */
2421
+ readonly idot: number;
2422
+ /**
2423
+ * Issue of data, clock.
2424
+ */
2425
+ readonly iodc: number;
2426
+ /**
2427
+ * Issue of data, ephemeris.
2428
+ */
2429
+ readonly iode: number;
2430
+ /**
2431
+ * L2 code indicator.
2432
+ */
2433
+ readonly l2Code: number;
2434
+ /**
2435
+ * Mean anomaly at reference time, radians.
2436
+ */
2437
+ readonly m0: number;
2438
+ /**
2439
+ * Argument of perigee, radians.
2440
+ */
2441
+ readonly omega: number;
2442
+ /**
2443
+ * Longitude of ascending node at weekly epoch, radians.
2444
+ */
2445
+ readonly omega0: number;
2446
+ /**
2447
+ * Rate of right ascension, radians per second.
2448
+ */
2449
+ readonly omegaDot: number;
2450
+ /**
2451
+ * Square root of the semi-major axis, sqrt(metres).
2452
+ */
2453
+ readonly sqrtA: number;
2454
+ /**
2455
+ * SV health bits.
2456
+ */
2457
+ readonly svHealth: number;
2458
+ /**
2459
+ * Group delay differential, seconds.
2460
+ */
2461
+ readonly tgd: number;
2462
+ /**
2463
+ * Clock reference time, seconds.
2464
+ */
2465
+ readonly toc: number;
2466
+ /**
2467
+ * Ephemeris reference time, seconds.
2468
+ */
2469
+ readonly toe: number;
2470
+ /**
2471
+ * User range accuracy index.
2472
+ */
2473
+ readonly uraIndex: number;
2474
+ /**
2475
+ * GPS week number.
2476
+ */
2477
+ readonly weekNumber: number;
2478
+ }
2479
+
2480
+ /**
2481
+ * The three 300-bit LNAV subframes produced by [`lnavEncode`].
2482
+ */
2483
+ export class LnavSubframes {
2484
+ private constructor();
2485
+ free(): void;
2486
+ [Symbol.dispose](): void;
2487
+ /**
2488
+ * Subframe 1 (clock/health) as a 300-element `Uint8Array` of `0`/`1` bits.
2489
+ */
2490
+ readonly subframe1: Uint8Array;
2491
+ /**
2492
+ * Subframe 2 (ephemeris part 1) as a 300-element `Uint8Array`.
2493
+ */
2494
+ readonly subframe2: Uint8Array;
2495
+ /**
2496
+ * Subframe 3 (ephemeris part 2) as a 300-element `Uint8Array`.
2497
+ */
2498
+ readonly subframe3: Uint8Array;
2499
+ }
2500
+
2501
+ /**
2502
+ * Topocentric look angles from a batched arc, each a `Float64Array` of length
2503
+ * `epochCount`.
2504
+ */
2505
+ export class LookAngles {
2506
+ private constructor();
2507
+ free(): void;
2508
+ [Symbol.dispose](): void;
2509
+ /**
2510
+ * Azimuth, degrees clockwise from north.
2511
+ */
2512
+ readonly azimuthDeg: Float64Array;
2513
+ /**
2514
+ * Elevation, degrees above the horizon.
2515
+ */
2516
+ readonly elevationDeg: Float64Array;
2517
+ /**
2518
+ * Number of epochs evaluated.
2519
+ */
2520
+ readonly epochCount: number;
2521
+ /**
2522
+ * Slant range, kilometres.
2523
+ */
2524
+ readonly rangeKm: Float64Array;
2525
+ }
2526
+
2527
+ /**
2528
+ * Niell hydrostatic and wet mapping factors, dimensionless.
2529
+ */
2530
+ export class MappingFactors {
2531
+ private constructor();
2532
+ free(): void;
2533
+ [Symbol.dispose](): void;
2534
+ /**
2535
+ * Hydrostatic mapping factor (includes the height correction).
2536
+ */
2537
+ readonly dry: number;
2538
+ /**
2539
+ * Wet mapping factor.
2540
+ */
2541
+ readonly wet: number;
2542
+ }
2543
+
2544
+ /**
2545
+ * One refined Moon elevation threshold crossing (moonrise / moonset).
2546
+ */
2547
+ export class MoonElevationCrossing {
2548
+ private constructor();
2549
+ free(): void;
2550
+ [Symbol.dispose](): void;
2551
+ /**
2552
+ * Topocentric Moon elevation at the refined instant, degrees.
2553
+ */
2554
+ readonly elevationDeg: number;
2555
+ /**
2556
+ * Crossing direction: `"rising"` (moonrise) or `"setting"` (moonset).
2557
+ */
2558
+ readonly kind: string;
2559
+ /**
2560
+ * Refined crossing instant, unix microseconds.
2561
+ */
2562
+ readonly timeUnixUs: bigint;
2563
+ }
2564
+
2565
+ /**
2566
+ * One refined Moon meridian transit (culmination).
2567
+ */
2568
+ export class MoonTransit {
2569
+ private constructor();
2570
+ free(): void;
2571
+ [Symbol.dispose](): void;
2572
+ /**
2573
+ * Topocentric Moon elevation at the refined instant, degrees.
2574
+ */
2575
+ readonly elevationDeg: number;
2576
+ /**
2577
+ * Culmination kind: `"upper"` (due south, highest) or `"lower"` (due north,
2578
+ * lowest).
2579
+ */
2580
+ readonly kind: string;
2581
+ /**
2582
+ * Refined culmination instant, unix microseconds.
2583
+ */
2584
+ readonly timeUnixUs: bigint;
2585
+ }
2586
+
2587
+ /**
2588
+ * One solved moving-baseline epoch.
2589
+ */
2590
+ export class MovingBaselineSolution {
2591
+ private constructor();
2592
+ free(): void;
2593
+ [Symbol.dispose](): void;
2594
+ /**
2595
+ * Base receiver ECEF position (metres) used for this epoch, `[x, y, z]`.
2596
+ */
2597
+ readonly basePositionM: Float64Array;
2598
+ /**
2599
+ * Euclidean baseline length, metres.
2600
+ */
2601
+ readonly baselineLengthM: number;
2602
+ /**
2603
+ * Baseline vector `rover - base` (metres) in ECEF, `[dx, dy, dz]`. The
2604
+ * integer-fixed baseline when `status` is `"Fixed"`, else the float baseline.
2605
+ */
2606
+ readonly baselineM: Float64Array;
2607
+ /**
2608
+ * The float baseline this epoch reduced through, `[dx, dy, dz]`, metres.
2609
+ */
2610
+ readonly floatBaselineM: Float64Array;
2611
+ /**
2612
+ * Whether the float baseline solve converged.
2613
+ */
2614
+ readonly floatConverged: boolean;
2615
+ /**
2616
+ * Integer ambiguity verdict for this epoch: `"Fixed"` or `"Float"`.
2617
+ */
2618
+ readonly status: string;
2619
+ }
2620
+
2621
+ /**
2622
+ * A named entry from a parsed TLE file: the satellite's name line (empty for a
2623
+ * bare 2-line set) paired with its initialized [`Tle`].
2624
+ */
2625
+ export class NamedTle {
2626
+ private constructor();
2627
+ free(): void;
2628
+ [Symbol.dispose](): void;
2629
+ /**
2630
+ * The satellite name from the preceding name line, with any CelesTrak `0 `
2631
+ * marker stripped. Empty string for a bare 2-line element set.
2632
+ */
2633
+ readonly name: string;
2634
+ /**
2635
+ * The initialized two-line element set. Call `.propagate()` /
2636
+ * `.lookAngles()` / `.findPasses()` on it directly.
2637
+ */
2638
+ readonly tle: Tle;
1593
2639
  }
1594
2640
 
1595
2641
  /**
@@ -1836,6 +2882,193 @@ export class ObservationValueSeries {
1836
2882
  readonly values: Float64Array;
1837
2883
  }
1838
2884
 
2885
+ /**
2886
+ * A canonical, format-agnostic CCSDS Orbit Ephemeris Message parsed from KVN or
2887
+ * XML.
2888
+ */
2889
+ export class Oem {
2890
+ free(): void;
2891
+ [Symbol.dispose](): void;
2892
+ /**
2893
+ * Build an OEM from one or more segments. `meta` carries the optional header
2894
+ * fields (`ccsdsOemVers`, `creationDate`, `originator`).
2895
+ */
2896
+ constructor(segments: OemSegment[], meta: any);
2897
+ /**
2898
+ * Encode this OEM to CCSDS OEM KVN text.
2899
+ */
2900
+ toKvnString(): string;
2901
+ /**
2902
+ * Encode this OEM to CCSDS OEM XML text.
2903
+ */
2904
+ toXmlString(): string;
2905
+ /**
2906
+ * CCSDS OEM version string.
2907
+ */
2908
+ readonly ccsdsOemVers: string;
2909
+ /**
2910
+ * Creation date.
2911
+ */
2912
+ readonly creationDate: string | undefined;
2913
+ /**
2914
+ * Originator.
2915
+ */
2916
+ readonly originator: string | undefined;
2917
+ /**
2918
+ * Number of segments.
2919
+ */
2920
+ readonly segmentCount: number;
2921
+ /**
2922
+ * Metadata/data segments in message order.
2923
+ */
2924
+ readonly segments: OemSegment[];
2925
+ /**
2926
+ * Forgiving-parse count of ephemeris data lines skipped as malformed (KVN
2927
+ * only; 0 for a constructed or XML-parsed message).
2928
+ */
2929
+ readonly skippedStates: number;
2930
+ }
2931
+
2932
+ /**
2933
+ * One OEM covariance block.
2934
+ */
2935
+ export class OemCovariance {
2936
+ free(): void;
2937
+ [Symbol.dispose](): void;
2938
+ /**
2939
+ * Build an OEM covariance block. `matrix` is a length-36 row-major
2940
+ * `Float64Array` for the `[r, v]` state; it must be finite, symmetric, and
2941
+ * positive semidefinite. `covRefFrame` is the optional frame label.
2942
+ */
2943
+ constructor(epoch: string, matrix: Float64Array, cov_ref_frame?: string | null);
2944
+ /**
2945
+ * Covariance reference-frame label, or `undefined`.
2946
+ */
2947
+ readonly covRefFrame: string | undefined;
2948
+ /**
2949
+ * Epoch text.
2950
+ */
2951
+ readonly epoch: string;
2952
+ /**
2953
+ * The 6x6 state covariance as a length-36 row-major `Float64Array`.
2954
+ */
2955
+ readonly matrix: Float64Array;
2956
+ }
2957
+
2958
+ /**
2959
+ * OEM segment metadata: object identity, frame, time system, and span.
2960
+ */
2961
+ export class OemMetadata {
2962
+ free(): void;
2963
+ [Symbol.dispose](): void;
2964
+ /**
2965
+ * Build OEM segment metadata. The seven leading arguments are required;
2966
+ * `meta` carries the optional fields (`useableStartTime`, `useableStopTime`,
2967
+ * `interpolation`, `interpolationDegree`).
2968
+ */
2969
+ constructor(object_name: string, object_id: string, center_name: string, ref_frame: string, time_system: string, start_time: string, stop_time: string, meta: any);
2970
+ /**
2971
+ * Center name.
2972
+ */
2973
+ readonly centerName: string;
2974
+ /**
2975
+ * Interpolation method label, or `undefined`.
2976
+ */
2977
+ readonly interpolation: string | undefined;
2978
+ /**
2979
+ * Interpolation polynomial degree, or `undefined`.
2980
+ */
2981
+ readonly interpolationDegree: number | undefined;
2982
+ /**
2983
+ * Object id (COSPAR international designator).
2984
+ */
2985
+ readonly objectId: string;
2986
+ /**
2987
+ * Object name.
2988
+ */
2989
+ readonly objectName: string;
2990
+ /**
2991
+ * Reference frame.
2992
+ */
2993
+ readonly refFrame: string;
2994
+ /**
2995
+ * Segment start time text.
2996
+ */
2997
+ readonly startTime: string;
2998
+ /**
2999
+ * Segment stop time text.
3000
+ */
3001
+ readonly stopTime: string;
3002
+ /**
3003
+ * Time system.
3004
+ */
3005
+ readonly timeSystem: string;
3006
+ /**
3007
+ * Useable start time text, or `undefined`.
3008
+ */
3009
+ readonly useableStartTime: string | undefined;
3010
+ /**
3011
+ * Useable stop time text, or `undefined`.
3012
+ */
3013
+ readonly useableStopTime: string | undefined;
3014
+ }
3015
+
3016
+ /**
3017
+ * One OEM metadata/data segment.
3018
+ */
3019
+ export class OemSegment {
3020
+ free(): void;
3021
+ [Symbol.dispose](): void;
3022
+ /**
3023
+ * Build an OEM segment from its metadata, state samples, and (possibly
3024
+ * empty) covariance blocks.
3025
+ */
3026
+ constructor(metadata: OemMetadata, states: OemState[], covariances: OemCovariance[]);
3027
+ /**
3028
+ * Covariance blocks in segment order.
3029
+ */
3030
+ readonly covariances: OemCovariance[];
3031
+ /**
3032
+ * Segment metadata.
3033
+ */
3034
+ readonly metadata: OemMetadata;
3035
+ /**
3036
+ * State samples in segment order.
3037
+ */
3038
+ readonly states: OemState[];
3039
+ }
3040
+
3041
+ /**
3042
+ * One OEM Cartesian state sample.
3043
+ */
3044
+ export class OemState {
3045
+ free(): void;
3046
+ [Symbol.dispose](): void;
3047
+ /**
3048
+ * Build an OEM state sample. `epoch` is carried as text; `positionKm` and
3049
+ * `velocityKmS` are length-3 `Float64Array`s. `accelerationKmS2` is an
3050
+ * optional length-3 `Float64Array` (pass `undefined` for a position/velocity
3051
+ * sample).
3052
+ */
3053
+ constructor(epoch: string, position_km: Float64Array, velocity_km_s: Float64Array, acceleration_km_s2?: Float64Array | null);
3054
+ /**
3055
+ * Acceleration vector, km/s^2, length-3 `Float64Array`, or `undefined`.
3056
+ */
3057
+ readonly accelerationKmS2: Float64Array | undefined;
3058
+ /**
3059
+ * Epoch text.
3060
+ */
3061
+ readonly epoch: string;
3062
+ /**
3063
+ * Position vector, kilometres, length-3 `Float64Array`.
3064
+ */
3065
+ readonly positionKm: Float64Array;
3066
+ /**
3067
+ * Velocity vector, km/s, length-3 `Float64Array`.
3068
+ */
3069
+ readonly velocityKmS: Float64Array;
3070
+ }
3071
+
1839
3072
  /**
1840
3073
  * A canonical, format-agnostic CCSDS Orbit Mean-Elements Message.
1841
3074
  */
@@ -1905,102 +3138,455 @@ export class Omm {
1905
3138
  */
1906
3139
  readonly inclinationDeg: number;
1907
3140
  /**
1908
- * Mean anomaly, degrees.
3141
+ * Mean anomaly, degrees.
3142
+ */
3143
+ readonly meanAnomalyDeg: number;
3144
+ /**
3145
+ * Mean-element theory.
3146
+ */
3147
+ readonly meanElementTheory: string | undefined;
3148
+ /**
3149
+ * Mean motion, rev/day.
3150
+ */
3151
+ readonly meanMotion: number;
3152
+ /**
3153
+ * Second derivative of mean motion.
3154
+ */
3155
+ readonly meanMotionDdot: number;
3156
+ /**
3157
+ * First derivative of mean motion.
3158
+ */
3159
+ readonly meanMotionDot: number;
3160
+ /**
3161
+ * NORAD catalog number.
3162
+ */
3163
+ readonly noradCatId: number;
3164
+ /**
3165
+ * Object id.
3166
+ */
3167
+ readonly objectId: string | undefined;
3168
+ /**
3169
+ * Object name.
3170
+ */
3171
+ readonly objectName: string | undefined;
3172
+ /**
3173
+ * Originator.
3174
+ */
3175
+ readonly originator: string | undefined;
3176
+ /**
3177
+ * Right ascension of the ascending node, degrees.
3178
+ */
3179
+ readonly raOfAscNodeDeg: number;
3180
+ /**
3181
+ * Reference frame.
3182
+ */
3183
+ readonly refFrame: string | undefined;
3184
+ /**
3185
+ * Revolution number at epoch.
3186
+ */
3187
+ readonly revAtEpoch: bigint;
3188
+ /**
3189
+ * Time system.
3190
+ */
3191
+ readonly timeSystem: string | undefined;
3192
+ }
3193
+
3194
+ /**
3195
+ * UTC calendar epoch carried by an OMM `EPOCH` field.
3196
+ */
3197
+ export class OmmEpoch {
3198
+ free(): void;
3199
+ [Symbol.dispose](): void;
3200
+ /**
3201
+ * Build an OMM epoch from UTC calendar fields. Throws a `RangeError` on an
3202
+ * out-of-range field.
3203
+ */
3204
+ constructor(year: number, month: number, day: number, hour: number, minute: number, second: number, microsecond: number);
3205
+ /**
3206
+ * Calendar day.
3207
+ */
3208
+ readonly day: number;
3209
+ /**
3210
+ * Hour of day.
3211
+ */
3212
+ readonly hour: number;
3213
+ /**
3214
+ * ISO-8601 epoch text with microsecond precision.
3215
+ */
3216
+ readonly iso8601: string;
3217
+ /**
3218
+ * Microsecond of second.
3219
+ */
3220
+ readonly microsecond: number;
3221
+ /**
3222
+ * Minute of hour.
3223
+ */
3224
+ readonly minute: number;
3225
+ /**
3226
+ * Calendar month.
3227
+ */
3228
+ readonly month: number;
3229
+ /**
3230
+ * Second of minute.
3231
+ */
3232
+ readonly second: number;
3233
+ /**
3234
+ * Calendar year.
3235
+ */
3236
+ readonly year: number;
3237
+ }
3238
+
3239
+ /**
3240
+ * A canonical, format-agnostic CCSDS Orbit Parameter Message parsed from KVN or
3241
+ * XML.
3242
+ */
3243
+ export class Opm {
3244
+ free(): void;
3245
+ [Symbol.dispose](): void;
3246
+ /**
3247
+ * Build an OPM from its blocks. `keplerian`, `spacecraft`, and `covariance`
3248
+ * are optional (pass `undefined`); `maneuvers` is an array (possibly empty).
3249
+ * `meta` carries the optional header fields (`ccsdsOpmVers`, `creationDate`,
3250
+ * `originator`).
3251
+ */
3252
+ constructor(metadata: OpmMetadata, state: OpmState, keplerian: OpmKeplerian | null | undefined, spacecraft: OpmSpacecraft | null | undefined, covariance: OpmCovariance | null | undefined, maneuvers: OpmManeuver[], meta: any);
3253
+ /**
3254
+ * Encode this OPM to CCSDS OPM KVN text.
3255
+ */
3256
+ toKvnString(): string;
3257
+ /**
3258
+ * Encode this OPM to CCSDS OPM XML text.
3259
+ */
3260
+ toXmlString(): string;
3261
+ /**
3262
+ * CCSDS OPM version string.
3263
+ */
3264
+ readonly ccsdsOpmVers: string;
3265
+ /**
3266
+ * Covariance block, or `undefined`.
3267
+ */
3268
+ readonly covariance: OpmCovariance | undefined;
3269
+ /**
3270
+ * Creation date.
3271
+ */
3272
+ readonly creationDate: string | undefined;
3273
+ /**
3274
+ * Keplerian-elements block, or `undefined`.
3275
+ */
3276
+ readonly keplerian: OpmKeplerian | undefined;
3277
+ /**
3278
+ * Maneuver blocks in message order.
3279
+ */
3280
+ readonly maneuvers: OpmManeuver[];
3281
+ /**
3282
+ * Metadata block.
3283
+ */
3284
+ readonly metadata: OpmMetadata;
3285
+ /**
3286
+ * Originator.
3287
+ */
3288
+ readonly originator: string | undefined;
3289
+ /**
3290
+ * Spacecraft-parameters block, or `undefined`.
3291
+ */
3292
+ readonly spacecraft: OpmSpacecraft | undefined;
3293
+ /**
3294
+ * Cartesian state vector.
3295
+ */
3296
+ readonly state: OpmState;
3297
+ }
3298
+
3299
+ /**
3300
+ * Optional OPM 6x6 state covariance.
3301
+ */
3302
+ export class OpmCovariance {
3303
+ free(): void;
3304
+ [Symbol.dispose](): void;
3305
+ /**
3306
+ * Build the covariance block. `matrix` is a length-36 row-major
3307
+ * `Float64Array` for the `[r, v]` state; it must be finite, symmetric, and
3308
+ * positive semidefinite. `covRefFrame` is the optional frame label.
3309
+ */
3310
+ constructor(matrix: Float64Array, cov_ref_frame?: string | null);
3311
+ /**
3312
+ * Covariance reference-frame label, or `undefined`.
3313
+ */
3314
+ readonly covRefFrame: string | undefined;
3315
+ /**
3316
+ * The 6x6 state covariance as a length-36 row-major `Float64Array`.
3317
+ */
3318
+ readonly matrix: Float64Array;
3319
+ }
3320
+
3321
+ /**
3322
+ * Optional OPM Keplerian-elements block.
3323
+ */
3324
+ export class OpmKeplerian {
3325
+ free(): void;
3326
+ [Symbol.dispose](): void;
3327
+ /**
3328
+ * Build the Keplerian block. Supply exactly one of `trueAnomalyDeg` or
3329
+ * `meanAnomalyDeg`; throws a `TypeError` if neither or both are given.
3330
+ */
3331
+ constructor(semi_major_axis_km: number, eccentricity: number, inclination_deg: number, ra_of_asc_node_deg: number, arg_of_pericenter_deg: number, gm_km3_s2: number, true_anomaly_deg?: number | null, mean_anomaly_deg?: number | null);
3332
+ /**
3333
+ * Argument of pericenter, degrees.
3334
+ */
3335
+ readonly argOfPericenterDeg: number;
3336
+ /**
3337
+ * Eccentricity.
3338
+ */
3339
+ readonly eccentricity: number;
3340
+ /**
3341
+ * Gravitational parameter, km^3/s^2.
3342
+ */
3343
+ readonly gmKm3S2: number;
3344
+ /**
3345
+ * Inclination, degrees.
3346
+ */
3347
+ readonly inclinationDeg: number;
3348
+ /**
3349
+ * Mean anomaly, degrees, or `undefined` when a true anomaly was supplied.
3350
+ */
3351
+ readonly meanAnomalyDeg: number | undefined;
3352
+ /**
3353
+ * Right ascension of the ascending node, degrees.
3354
+ */
3355
+ readonly raOfAscNodeDeg: number;
3356
+ /**
3357
+ * Semi-major axis, kilometres.
3358
+ */
3359
+ readonly semiMajorAxisKm: number;
3360
+ /**
3361
+ * True anomaly, degrees, or `undefined` when a mean anomaly was supplied.
3362
+ */
3363
+ readonly trueAnomalyDeg: number | undefined;
3364
+ }
3365
+
3366
+ /**
3367
+ * One OPM maneuver block. Every field is mandatory in CCSDS 502.0-B when a
3368
+ * maneuver is present.
3369
+ */
3370
+ export class OpmManeuver {
3371
+ free(): void;
3372
+ [Symbol.dispose](): void;
3373
+ /**
3374
+ * Build a maneuver block. `dvKmS` is a length-3 `Float64Array` of the
3375
+ * delta-v in km/s.
3376
+ */
3377
+ constructor(epoch_ignition: string, duration_s: number, delta_mass_kg: number, ref_frame: string, dv_km_s: Float64Array);
3378
+ /**
3379
+ * Change in mass, kilograms.
3380
+ */
3381
+ readonly deltaMassKg: number;
3382
+ /**
3383
+ * Maneuver duration, seconds.
3384
+ */
3385
+ readonly durationS: number;
3386
+ /**
3387
+ * Delta-v vector, km/s, length-3 `Float64Array`.
3388
+ */
3389
+ readonly dvKmS: Float64Array;
3390
+ /**
3391
+ * Ignition epoch text.
3392
+ */
3393
+ readonly epochIgnition: string;
3394
+ /**
3395
+ * Maneuver reference frame.
3396
+ */
3397
+ readonly refFrame: string;
3398
+ }
3399
+
3400
+ /**
3401
+ * OPM metadata block: object identity, center, reference frame, and time system.
3402
+ */
3403
+ export class OpmMetadata {
3404
+ free(): void;
3405
+ [Symbol.dispose](): void;
3406
+ /**
3407
+ * Build the OPM metadata block. Every field is mandatory in CCSDS 502.0-B.
3408
+ */
3409
+ constructor(object_name: string, object_id: string, center_name: string, ref_frame: string, time_system: string);
3410
+ /**
3411
+ * Center name.
3412
+ */
3413
+ readonly centerName: string;
3414
+ /**
3415
+ * Object id (COSPAR international designator).
3416
+ */
3417
+ readonly objectId: string;
3418
+ /**
3419
+ * Object name.
3420
+ */
3421
+ readonly objectName: string;
3422
+ /**
3423
+ * Reference frame.
3424
+ */
3425
+ readonly refFrame: string;
3426
+ /**
3427
+ * Time system.
3428
+ */
3429
+ readonly timeSystem: string;
3430
+ }
3431
+
3432
+ /**
3433
+ * Optional OPM spacecraft-parameters block. Every sub-field is individually
3434
+ * optional.
3435
+ */
3436
+ export class OpmSpacecraft {
3437
+ free(): void;
3438
+ [Symbol.dispose](): void;
3439
+ /**
3440
+ * Build the spacecraft-parameters block. Pass `undefined` for absent fields.
1909
3441
  */
1910
- readonly meanAnomalyDeg: number;
3442
+ constructor(mass_kg?: number | null, solar_rad_area_m2?: number | null, solar_rad_coeff?: number | null, drag_area_m2?: number | null, drag_coeff?: number | null);
1911
3443
  /**
1912
- * Mean-element theory.
3444
+ * Drag area, square metres.
1913
3445
  */
1914
- readonly meanElementTheory: string | undefined;
3446
+ readonly dragAreaM2: number | undefined;
1915
3447
  /**
1916
- * Mean motion, rev/day.
3448
+ * Drag coefficient.
1917
3449
  */
1918
- readonly meanMotion: number;
3450
+ readonly dragCoeff: number | undefined;
1919
3451
  /**
1920
- * Second derivative of mean motion.
3452
+ * Mass, kilograms.
1921
3453
  */
1922
- readonly meanMotionDdot: number;
3454
+ readonly massKg: number | undefined;
1923
3455
  /**
1924
- * First derivative of mean motion.
3456
+ * Solar-radiation-pressure area, square metres.
1925
3457
  */
1926
- readonly meanMotionDot: number;
3458
+ readonly solarRadAreaM2: number | undefined;
1927
3459
  /**
1928
- * NORAD catalog number.
3460
+ * Solar-radiation-pressure coefficient.
1929
3461
  */
1930
- readonly noradCatId: number;
3462
+ readonly solarRadCoeff: number | undefined;
3463
+ }
3464
+
3465
+ /**
3466
+ * OPM Cartesian state vector at the message epoch.
3467
+ */
3468
+ export class OpmState {
3469
+ free(): void;
3470
+ [Symbol.dispose](): void;
1931
3471
  /**
1932
- * Object id.
3472
+ * Build the OPM state. `epoch` is carried as text; `positionKm` and
3473
+ * `velocityKmS` are length-3 `Float64Array`s in kilometres and km/s.
1933
3474
  */
1934
- readonly objectId: string | undefined;
3475
+ constructor(epoch: string, position_km: Float64Array, velocity_km_s: Float64Array);
1935
3476
  /**
1936
- * Object name.
3477
+ * Epoch text.
1937
3478
  */
1938
- readonly objectName: string | undefined;
3479
+ readonly epoch: string;
1939
3480
  /**
1940
- * Originator.
3481
+ * Position vector, kilometres, length-3 `Float64Array`.
1941
3482
  */
1942
- readonly originator: string | undefined;
3483
+ readonly positionKm: Float64Array;
1943
3484
  /**
1944
- * Right ascension of the ascending node, degrees.
3485
+ * Velocity vector, km/s, length-3 `Float64Array`.
1945
3486
  */
1946
- readonly raOfAscNodeDeg: number;
3487
+ readonly velocityKmS: Float64Array;
3488
+ }
3489
+
3490
+ /**
3491
+ * The result of [`parseTleFile`]: the satellites that parsed, plus a count of
3492
+ * complete records that were skipped because SGP4 initialization failed.
3493
+ */
3494
+ export class ParsedTleFile {
3495
+ private constructor();
3496
+ free(): void;
3497
+ [Symbol.dispose](): void;
1947
3498
  /**
1948
- * Reference frame.
3499
+ * Number of satellites that parsed (length of `satellites`).
1949
3500
  */
1950
- readonly refFrame: string | undefined;
3501
+ readonly count: number;
1951
3502
  /**
1952
- * Revolution number at epoch.
3503
+ * The successfully parsed satellites, in file order, each as a `{ name, tle }`.
1953
3504
  */
1954
- readonly revAtEpoch: bigint;
3505
+ readonly satellites: NamedTle[];
1955
3506
  /**
1956
- * Time system.
3507
+ * How many complete `(line 1, line 2)` records were found but skipped
3508
+ * because their element set failed SGP4 initialization.
1957
3509
  */
1958
- readonly timeSystem: string | undefined;
3510
+ readonly skipped: number;
1959
3511
  }
1960
3512
 
1961
3513
  /**
1962
- * UTC calendar epoch carried by an OMM `EPOCH` field.
3514
+ * A long span represented by contiguous independently-fitted reduced-orbit
3515
+ * segments. Carries the fitted segments and the time scale they were fitted in;
3516
+ * evaluate and drift queries reuse that scale.
1963
3517
  */
1964
- export class OmmEpoch {
3518
+ export class PiecewiseOrbit {
3519
+ private constructor();
1965
3520
  free(): void;
1966
3521
  [Symbol.dispose](): void;
1967
3522
  /**
1968
- * Build an OMM epoch from UTC calendar fields. Throws a `RangeError` on an
1969
- * out-of-range field.
3523
+ * Evaluate the piecewise model against `truth` ECEF samples, flagging the
3524
+ * first epoch whose error exceeds `thresholdM`. Truth samples outside the
3525
+ * model span are skipped. Delegates to
3526
+ * `sidereon_core::orbit::piecewise_drift`.
1970
3527
  */
1971
- constructor(year: number, month: number, day: number, hour: number, minute: number, second: number, microsecond: number);
3528
+ drift(truth: any, threshold_m: number): ReducedOrbitDrift;
1972
3529
  /**
1973
- * Calendar day.
3530
+ * Sample an SP3 product and evaluate this piecewise model against those
3531
+ * positions. Delegates to
3532
+ * `sidereon_core::orbit::drift_piecewise_reduced_orbit_source`.
1974
3533
  */
1975
- readonly day: number;
3534
+ driftSp3(sp3: Sp3, satellite: string, options: any): ReducedOrbitDrift;
1976
3535
  /**
1977
- * Hour of day.
3536
+ * Sample a TLE/SGP4 source in UTC and evaluate this piecewise model against
3537
+ * those positions. Delegates to
3538
+ * `sidereon_core::orbit::drift_piecewise_reduced_orbit_source`.
1978
3539
  */
1979
- readonly hour: number;
3540
+ driftTle(tle: Tle, options: any): ReducedOrbitDrift;
1980
3541
  /**
1981
- * ISO-8601 epoch text with microsecond precision.
3542
+ * Evaluate the piecewise model position at `query` in `frame` (`"ecef"` or
3543
+ * `"gcrs"`). Delegates to `sidereon_core::orbit::piecewise_position`.
1982
3544
  */
1983
- readonly iso8601: string;
3545
+ position(query: any, frame: string): Float64Array;
1984
3546
  /**
1985
- * Microsecond of second.
3547
+ * Evaluate the piecewise model position and velocity at `query` in `frame`.
3548
+ * Delegates to `sidereon_core::orbit::piecewise_position_velocity`.
1986
3549
  */
1987
- readonly microsecond: number;
3550
+ positionVelocity(query: any, frame: string): ReducedOrbitState;
1988
3551
  /**
1989
- * Minute of hour.
3552
+ * Zero-based index of the segment covering `query`. Delegates to
3553
+ * `sidereon_core::orbit::select_piecewise_segment`. Throws an `Error` when
3554
+ * the epoch is outside coverage.
1990
3555
  */
1991
- readonly minute: number;
3556
+ segmentIndexAt(query: any): number;
1992
3557
  /**
1993
- * Calendar month.
3558
+ * Model label, `"circular_secular"` or `"eccentric_secular"`.
1994
3559
  */
1995
- readonly month: number;
3560
+ readonly model: string;
1996
3561
  /**
1997
- * Second of minute.
3562
+ * Number of contiguous fitted segments.
1998
3563
  */
1999
- readonly second: number;
3564
+ readonly segmentCount: number;
2000
3565
  /**
2001
- * Calendar year.
3566
+ * Rounded segment length used to tile the requested window, seconds.
2002
3567
  */
2003
- readonly year: number;
3568
+ readonly segmentSeconds: bigint;
3569
+ }
3570
+
3571
+ /**
3572
+ * Source-backed piecewise reduced-orbit fit result.
3573
+ */
3574
+ export class PiecewiseOrbitSourceFit {
3575
+ private constructor();
3576
+ free(): void;
3577
+ [Symbol.dispose](): void;
3578
+ /**
3579
+ * The fitted piecewise reduced-orbit model.
3580
+ */
3581
+ readonly orbit: PiecewiseOrbit;
3582
+ /**
3583
+ * Number of samples requested from the source.
3584
+ */
3585
+ readonly requestedSamples: number;
3586
+ /**
3587
+ * Number of source samples used by all fitted segments.
3588
+ */
3589
+ readonly usedSamples: number;
2004
3590
  }
2005
3591
 
2006
3592
  /**
@@ -2077,6 +3663,92 @@ export class PppFloatSolution {
2077
3663
  readonly ztdResidualM: number | undefined;
2078
3664
  }
2079
3665
 
3666
+ /**
3667
+ * The per-request results of a batch observable prediction, index-aligned to
3668
+ * the input requests. Each request independently either produced observables or
3669
+ * failed; query a request with [`PredictBatch.isOk`] /
3670
+ * [`PredictBatch.observables`] / [`PredictBatch.error`].
3671
+ */
3672
+ export class PredictBatch {
3673
+ private constructor();
3674
+ free(): void;
3675
+ [Symbol.dispose](): void;
3676
+ /**
3677
+ * The failure message for request `index`, or `undefined` when it
3678
+ * succeeded. Throws a `RangeError` for an out-of-range index.
3679
+ */
3680
+ error(index: number): string | undefined;
3681
+ /**
3682
+ * Whether request `index` produced observables. Throws a `RangeError` for
3683
+ * an out-of-range index.
3684
+ */
3685
+ isOk(index: number): boolean;
3686
+ /**
3687
+ * The observables for request `index`. Throws a `RangeError` for an
3688
+ * out-of-range index and an `Error` carrying that request's failure message
3689
+ * when the prediction failed (check [`PredictBatch.isOk`] first).
3690
+ */
3691
+ observables(index: number): PredictedObservables;
3692
+ /**
3693
+ * Number of requests in the batch.
3694
+ */
3695
+ readonly count: number;
3696
+ }
3697
+
3698
+ /**
3699
+ * Predicted GNSS observables for one satellite at one receive epoch. Every
3700
+ * field is computed by `sidereon_core::observables::predict`.
3701
+ */
3702
+ export class PredictedObservables {
3703
+ private constructor();
3704
+ free(): void;
3705
+ [Symbol.dispose](): void;
3706
+ /**
3707
+ * Topocentric azimuth in `[0, 360)`, degrees.
3708
+ */
3709
+ readonly azimuthDeg: number;
3710
+ /**
3711
+ * Doppler shift at the option carrier frequency, hertz.
3712
+ */
3713
+ readonly dopplerHz: number;
3714
+ /**
3715
+ * Topocentric elevation, degrees.
3716
+ */
3717
+ readonly elevationDeg: number;
3718
+ /**
3719
+ * Geometric range after optional Sagnac rotation, metres.
3720
+ */
3721
+ readonly geometricRangeM: number;
3722
+ /**
3723
+ * Receiver-to-satellite line-of-sight unit vector in ECEF, `[x, y, z]`.
3724
+ */
3725
+ readonly losUnit: Float64Array;
3726
+ /**
3727
+ * Range-rate line-of-sight projection, metres per second.
3728
+ */
3729
+ readonly rangeRateMS: number;
3730
+ /**
3731
+ * Satellite clock offset at transmit time, seconds, or `undefined`.
3732
+ */
3733
+ readonly satClockS: number | undefined;
3734
+ /**
3735
+ * Sagnac-rotated satellite ECEF position, metres, `[x, y, z]`.
3736
+ */
3737
+ readonly satPosEcefM: Float64Array;
3738
+ /**
3739
+ * Sagnac-rotated satellite ECEF velocity, metres per second, `[vx, vy, vz]`.
3740
+ */
3741
+ readonly satVelocityMS: Float64Array;
3742
+ /**
3743
+ * Transmit-time offset from receive time, rounded to microseconds.
3744
+ */
3745
+ readonly transmitOffsetUs: bigint;
3746
+ /**
3747
+ * Transmit time as seconds since J2000.
3748
+ */
3749
+ readonly transmitTimeJ2000S: number;
3750
+ }
3751
+
2080
3752
  /**
2081
3753
  * Reason a satellite was dropped from paired pseudorange combination.
2082
3754
  */
@@ -2153,6 +3825,136 @@ export class RaimWeights {
2153
3825
  readonly weights: Float64Array;
2154
3826
  }
2155
3827
 
3828
+ /**
3829
+ * A fitted compact reduced-orbit model. Carries the fitted elements and the
3830
+ * time scale they were fitted in; evaluate and drift queries reuse that scale.
3831
+ */
3832
+ export class ReducedOrbit {
3833
+ private constructor();
3834
+ free(): void;
3835
+ [Symbol.dispose](): void;
3836
+ /**
3837
+ * Evaluate the model against `truth` ECEF samples, flagging the first epoch
3838
+ * whose error exceeds `thresholdM`. Delegates to
3839
+ * `sidereon_core::orbit::drift`.
3840
+ */
3841
+ drift(truth: any, threshold_m: number): ReducedOrbitDrift;
3842
+ /**
3843
+ * Sample an SP3 product and evaluate this model against those positions.
3844
+ * Delegates to `sidereon_core::orbit::drift_reduced_orbit_source`.
3845
+ */
3846
+ driftSp3(sp3: Sp3, satellite: string, options: any): ReducedOrbitDrift;
3847
+ /**
3848
+ * Sample a TLE/SGP4 source in UTC and evaluate this model against those
3849
+ * positions. Delegates to
3850
+ * `sidereon_core::orbit::drift_reduced_orbit_source`.
3851
+ */
3852
+ driftTle(tle: Tle, options: any): ReducedOrbitDrift;
3853
+ /**
3854
+ * Evaluate the model position at `query` in `frame` (`"ecef"` or
3855
+ * `"gcrs"`). Delegates to `sidereon_core::orbit::position`.
3856
+ */
3857
+ position(query: any, frame: string): Float64Array;
3858
+ /**
3859
+ * Evaluate the model position and velocity at `query` in `frame`.
3860
+ * Delegates to `sidereon_core::orbit::position_velocity`.
3861
+ */
3862
+ positionVelocity(query: any, frame: string): ReducedOrbitState;
3863
+ /**
3864
+ * Fitted mean elements as a `Float64Array`:
3865
+ * `[a_m, e, i, raan, raanRate, raanRateJ2, argLat, n]` for the circular
3866
+ * model, with `[h, k, argPerigee]` appended for the eccentric model.
3867
+ */
3868
+ readonly elements: Float64Array;
3869
+ /**
3870
+ * Fit residual maximum over the samples, metres.
3871
+ */
3872
+ readonly maxM: number;
3873
+ /**
3874
+ * Model label, `"circular_secular"` or `"eccentric_secular"`.
3875
+ */
3876
+ readonly model: string;
3877
+ /**
3878
+ * Number of samples used in the fit.
3879
+ */
3880
+ readonly nSamples: number;
3881
+ /**
3882
+ * Fit residual RMS over the samples, metres.
3883
+ */
3884
+ readonly rmsM: number;
3885
+ }
3886
+
3887
+ /**
3888
+ * Model-vs-truth drift report from `drift`.
3889
+ */
3890
+ export class ReducedOrbitDrift {
3891
+ private constructor();
3892
+ free(): void;
3893
+ [Symbol.dispose](): void;
3894
+ /**
3895
+ * Per-epoch position error magnitudes, metres, in input order.
3896
+ */
3897
+ readonly errorsM: Float64Array;
3898
+ /**
3899
+ * Maximum error over the horizon, metres.
3900
+ */
3901
+ readonly maxM: number;
3902
+ /**
3903
+ * Number of samples requested from the source or supplied by the caller.
3904
+ */
3905
+ readonly requestedSamples: number;
3906
+ /**
3907
+ * Root-mean-square error over the horizon, metres.
3908
+ */
3909
+ readonly rmsM: number;
3910
+ /**
3911
+ * Index of the first epoch whose error exceeds the threshold, or `-1`.
3912
+ */
3913
+ readonly thresholdIndex: bigint;
3914
+ /**
3915
+ * Number of samples evaluated in the drift report.
3916
+ */
3917
+ readonly usedSamples: number;
3918
+ }
3919
+
3920
+ /**
3921
+ * Source-backed reduced-orbit fit result.
3922
+ */
3923
+ export class ReducedOrbitSourceFit {
3924
+ private constructor();
3925
+ free(): void;
3926
+ [Symbol.dispose](): void;
3927
+ /**
3928
+ * The fitted reduced-orbit model.
3929
+ */
3930
+ readonly orbit: ReducedOrbit;
3931
+ /**
3932
+ * Number of samples requested from the source.
3933
+ */
3934
+ readonly requestedSamples: number;
3935
+ /**
3936
+ * Number of source samples used by the fit.
3937
+ */
3938
+ readonly usedSamples: number;
3939
+ }
3940
+
3941
+ /**
3942
+ * Receiver model position and velocity from `positionVelocity`.
3943
+ */
3944
+ export class ReducedOrbitState {
3945
+ private constructor();
3946
+ free(): void;
3947
+ [Symbol.dispose](): void;
3948
+ /**
3949
+ * Model position `[x, y, z]`, metres.
3950
+ */
3951
+ readonly positionM: Float64Array;
3952
+ /**
3953
+ * Model velocity `[vx, vy, vz]`, metres per second.
3954
+ */
3955
+ readonly velocityMS: Float64Array;
3956
+ }
3957
+
2156
3958
  /**
2157
3959
  * A parsed RINEX clock product with satellite clock-bias interpolation.
2158
3960
  */
@@ -2174,6 +3976,12 @@ export class RinexClock {
2174
3976
  * One satellite's clock series, or `undefined` if the satellite is absent.
2175
3977
  */
2176
3978
  seriesFor(satellite_id: string): ClockSeries | undefined;
3979
+ /**
3980
+ * Serialize to standard RINEX clock text. Deterministic: the same product
3981
+ * always produces byte-identical text, and re-parsing the output reproduces
3982
+ * the same time scale and per-satellite bias series.
3983
+ */
3984
+ toRinexString(): string;
2177
3985
  /**
2178
3986
  * Total number of parsed satellite clock samples.
2179
3987
  */
@@ -2219,6 +4027,12 @@ export class RinexObs {
2219
4027
  * Extract single-frequency pseudoranges for one epoch.
2220
4028
  */
2221
4029
  pseudoranges(epoch_index: number, policy?: SignalPolicy | null): PseudorangeSeries;
4030
+ /**
4031
+ * Serialize to standard RINEX 3 observation text. Deterministic: the same
4032
+ * product always produces byte-identical text, and re-parsing the output
4033
+ * reproduces the same header and epochs.
4034
+ */
4035
+ toRinexString(): string;
2222
4036
  /**
2223
4037
  * Number of parsed epoch records.
2224
4038
  */
@@ -2456,6 +4270,21 @@ export class Sp3 {
2456
4270
  private constructor();
2457
4271
  free(): void;
2458
4272
  [Symbol.dispose](): void;
4273
+ /**
4274
+ * Return a copy of `other` with its clocks shifted onto this product's
4275
+ * clock datum. Epochs without an offset estimate are left unchanged.
4276
+ * Delegates to `sidereon_core::ephemeris::align_clock_reference`.
4277
+ */
4278
+ alignClockReference(other: Sp3, min_common?: number | null): Sp3;
4279
+ /**
4280
+ * Estimate `other`'s per-epoch common clock offset relative to this product.
4281
+ *
4282
+ * The result is one row per matched epoch with enough common clocked
4283
+ * satellites. Subtract `offsetS` from `other` clocks to put them on this
4284
+ * product's clock datum. Delegates to
4285
+ * `sidereon_core::ephemeris::clock_reference_offset`.
4286
+ */
4287
+ clockReferenceOffset(other: Sp3, min_common?: number | null): Sp3ClockReferenceOffset[];
2459
4288
  /**
2460
4289
  * Compute DGNSS pseudorange corrections from a surveyed base station.
2461
4290
  *
@@ -2502,6 +4331,16 @@ export class Sp3 {
2502
4331
  * a `TypeError` for malformed input and an `Error` if the solve fails.
2503
4332
  */
2504
4333
  solveSpp(request: any): SppSolution;
4334
+ /**
4335
+ * Solve a batch of independent SPP epochs against this ephemeris in one call.
4336
+ *
4337
+ * `epochs` is an array of SPP request objects (the `SppRequest` shape) and
4338
+ * `options` the shared `{ withGeodetic?, maxPdop?, coarseSearchSeeds? }`
4339
+ * applied to every epoch. Returns an `SppBatchSolution` whose per-epoch
4340
+ * results are index-aligned to `epochs`; each epoch independently converged
4341
+ * or failed. Delegates to the serial reference batch kernel.
4342
+ */
4343
+ solveSppBatch(epochs: any, options: any): SppBatchSolution;
2505
4344
  /**
2506
4345
  * The exact parsed state of `satellite` at record `epochIndex` (no
2507
4346
  * interpolation). Throws a `RangeError` past the last epoch and a
@@ -2523,6 +4362,74 @@ export class Sp3 {
2523
4362
  readonly satellites: string[];
2524
4363
  }
2525
4364
 
4365
+ /**
4366
+ * Per-(epoch, satellite) agreement statistics for one accepted merged cell:
4367
+ * how tightly the consensus sources clustered about the combined value.
4368
+ */
4369
+ export class Sp3AgreementMetric {
4370
+ private constructor();
4371
+ free(): void;
4372
+ [Symbol.dispose](): void;
4373
+ /**
4374
+ * Largest absolute clock deviation from the combined clock, seconds;
4375
+ * `undefined` when the cell carries no clock.
4376
+ */
4377
+ readonly clockMaxS: number | undefined;
4378
+ /**
4379
+ * Number of sources in the accepted clock consensus (0 when the cell
4380
+ * carries no clock).
4381
+ */
4382
+ readonly clockMembers: number;
4383
+ /**
4384
+ * RMS of the consensus members' deviation from the combined clock, seconds;
4385
+ * `undefined` when the cell carries no clock.
4386
+ */
4387
+ readonly clockRmsS: number | undefined;
4388
+ /**
4389
+ * Cell epoch as seconds since J2000 in the product time scale.
4390
+ */
4391
+ readonly epochJ2000Seconds: number;
4392
+ /**
4393
+ * Largest 3D distance of any consensus member from the combined position,
4394
+ * metres.
4395
+ */
4396
+ readonly positionMaxM: number;
4397
+ /**
4398
+ * Number of sources in the accepted position consensus (>= 1).
4399
+ */
4400
+ readonly positionMembers: number;
4401
+ /**
4402
+ * RMS of the consensus members' 3D distance from the combined position,
4403
+ * metres (zero for a single-source cell).
4404
+ */
4405
+ readonly positionRmsM: number;
4406
+ /**
4407
+ * Satellite token, e.g. `"G01"`.
4408
+ */
4409
+ readonly satellite: string;
4410
+ }
4411
+
4412
+ /**
4413
+ * One epoch's common clock offset between two SP3 products.
4414
+ */
4415
+ export class Sp3ClockReferenceOffset {
4416
+ private constructor();
4417
+ free(): void;
4418
+ [Symbol.dispose](): void;
4419
+ /**
4420
+ * Matched epoch as seconds since J2000 in the product time scale.
4421
+ */
4422
+ readonly epochJ2000Seconds: number;
4423
+ /**
4424
+ * `other - reference` clock datum, seconds.
4425
+ */
4426
+ readonly offsetS: number;
4427
+ /**
4428
+ * Number of satellites used in the median offset estimate.
4429
+ */
4430
+ readonly satellites: number;
4431
+ }
4432
+
2526
4433
  /**
2527
4434
  * A batch of interpolated SP3 states.
2528
4435
  */
@@ -2574,6 +4481,13 @@ export class Sp3MergeReport {
2574
4481
  private constructor();
2575
4482
  free(): void;
2576
4483
  [Symbol.dispose](): void;
4484
+ /**
4485
+ * Per-(epoch, satellite) agreement statistics for every accepted cell, in
4486
+ * output (epoch, then satellite) order — one entry per cell written to the
4487
+ * merged product.
4488
+ */
4489
+ readonly agreement: Sp3AgreementMetric[];
4490
+ readonly agreementCount: number;
2577
4491
  readonly positionOutlierCount: number;
2578
4492
  /**
2579
4493
  * Cells where an accepted consensus rejected source outliers.
@@ -2672,6 +4586,29 @@ export class Sp3State {
2672
4586
  readonly velocityMS: Float64Array | undefined;
2673
4587
  }
2674
4588
 
4589
+ /**
4590
+ * Canonical quiet-Sun space-weather indices for NRLMSISE-00, mirrored from the
4591
+ * core so a JS caller can pass moderate-activity defaults to [`atmosphereDensity`]
4592
+ * without re-deriving the magic numbers.
4593
+ */
4594
+ export class SpaceWeatherDefaults {
4595
+ private constructor();
4596
+ free(): void;
4597
+ [Symbol.dispose](): void;
4598
+ /**
4599
+ * Daily magnetic Ap index.
4600
+ */
4601
+ readonly ap: number;
4602
+ /**
4603
+ * Daily F10.7 solar radio flux.
4604
+ */
4605
+ readonly f107: number;
4606
+ /**
4607
+ * 81-day centred F10.7 average.
4608
+ */
4609
+ readonly f107a: number;
4610
+ }
4611
+
2675
4612
  /**
2676
4613
  * A parsed in-memory JPL/NAIF SPK kernel.
2677
4614
  *
@@ -2790,6 +4727,38 @@ export class SpkState {
2790
4727
  readonly velocityKmS: Float64Array | undefined;
2791
4728
  }
2792
4729
 
4730
+ /**
4731
+ * The per-epoch results of a batch SPP solve, index-aligned to the input epochs.
4732
+ * Each epoch independently either converged to a solution or failed; query an
4733
+ * epoch with [`SppBatchSolution.isOk`] / [`SppBatchSolution.solution`] /
4734
+ * [`SppBatchSolution.error`].
4735
+ */
4736
+ export class SppBatchSolution {
4737
+ private constructor();
4738
+ free(): void;
4739
+ [Symbol.dispose](): void;
4740
+ /**
4741
+ * The solve-failure message for epoch `index`, or `undefined` when the epoch
4742
+ * converged. Throws a `RangeError` for an out-of-range index.
4743
+ */
4744
+ error(index: number): string | undefined;
4745
+ /**
4746
+ * Whether epoch `index` converged to a solution. Throws a `RangeError` for
4747
+ * an out-of-range index.
4748
+ */
4749
+ isOk(index: number): boolean;
4750
+ /**
4751
+ * The solution for epoch `index`. Throws a `RangeError` for an out-of-range
4752
+ * index and an `Error` carrying that epoch's solve-failure message when the
4753
+ * epoch did not converge (check [`SppBatchSolution.isOk`] first).
4754
+ */
4755
+ solution(index: number): SppSolution;
4756
+ /**
4757
+ * Number of epochs in the batch (equals the input epoch count).
4758
+ */
4759
+ readonly count: number;
4760
+ }
4761
+
2793
4762
  /**
2794
4763
  * The result of an SPP solve.
2795
4764
  */
@@ -2797,6 +4766,12 @@ export class SppSolution {
2797
4766
  private constructor();
2798
4767
  free(): void;
2799
4768
  [Symbol.dispose](): void;
4769
+ /**
4770
+ * Dilution-of-precision scalars (GDOP/PDOP/HDOP/VDOP/TDOP) from the
4771
+ * converged geometry, or `undefined` when the converged geometry is
4772
+ * rank-deficient. The same `Dop` produced by [`gnssDop`](crate::gnss_dop).
4773
+ */
4774
+ readonly dop: Dop | undefined;
2800
4775
  /**
2801
4776
  * `[latRad, lonRad, heightM]` as a `Float64Array` if the solve was asked
2802
4777
  * for geodetic output, otherwise `undefined`.
@@ -2814,6 +4789,13 @@ export class SppSolution {
2814
4789
  * Receiver clock bias, seconds.
2815
4790
  */
2816
4791
  readonly rxClockS: number;
4792
+ /**
4793
+ * Per-constellation time (clock) DOP as a `{ system, tdop }[]`, one entry
4794
+ * per GNSS in the solve in ascending system order (the same order as the
4795
+ * per-system clocks). The first entry's `tdop` equals the reference clock's
4796
+ * `dop.tdop`. Empty when the converged geometry is rank-deficient.
4797
+ */
4798
+ readonly systemTdops: any;
2817
4799
  /**
2818
4800
  * Satellite tokens used in the accepted solution, ascending.
2819
4801
  */
@@ -2893,6 +4875,14 @@ export enum TimeScale {
2893
4875
  * BeiDou Time.
2894
4876
  */
2895
4877
  Bdt = 6,
4878
+ /**
4879
+ * GLONASS system time (UTC(SU)-based, leap-second carrying).
4880
+ */
4881
+ Glonasst = 7,
4882
+ /**
4883
+ * QZSS system time (steered to GPST).
4884
+ */
4885
+ Qzsst = 8,
2896
4886
  }
2897
4887
 
2898
4888
  /**
@@ -2908,6 +4898,14 @@ export class Tle {
2908
4898
  * an end at or before the start.
2909
4899
  */
2910
4900
  findPasses(station: GroundStation, start_unix_us: bigint, end_unix_us: bigint, elevation_mask_deg?: number | null, step_seconds?: number | null, time_tolerance_s?: number | null): SatellitePass[];
4901
+ /**
4902
+ * Sub-satellite (ground-track) WGS84 geodetic points over a `BigInt64Array`
4903
+ * of unix-microsecond epochs. For each epoch the satellite is propagated to
4904
+ * TEME and reduced TEME->GCRS->ECEF->geodetic by the engine's own transforms,
4905
+ * honoring this `Tle`'s opsmode. Throws an `Error` on propagation or frame
4906
+ * failure.
4907
+ */
4908
+ groundTrack(epochs_unix_us: BigInt64Array): GroundTrack;
2911
4909
  /**
2912
4910
  * Topocentric azimuth/elevation/range from `station` over a
2913
4911
  * `BigInt64Array` of unix-microsecond epochs. Throws an `Error` on failure.
@@ -3132,6 +5130,38 @@ export class VisibilitySeries {
3132
5130
  readonly visible: Uint8Array;
3133
5131
  }
3134
5132
 
5133
+ /**
5134
+ * One satellite visible above the elevation mask at a single instant, from
5135
+ * [`visibleFromSatellites`].
5136
+ */
5137
+ export class VisibleSatellite {
5138
+ private constructor();
5139
+ free(): void;
5140
+ [Symbol.dispose](): void;
5141
+ /**
5142
+ * Topocentric azimuth, degrees clockwise from north.
5143
+ */
5144
+ readonly azimuthDeg: number;
5145
+ /**
5146
+ * The caller-supplied identity (the `ids[i]` paired with this satellite):
5147
+ * a NORAD catalog number, a name, or whatever the caller chose.
5148
+ */
5149
+ readonly catalogNumber: string;
5150
+ /**
5151
+ * Topocentric elevation, degrees above the horizon.
5152
+ */
5153
+ readonly elevationDeg: number;
5154
+ /**
5155
+ * TEME position of the satellite at the instant, km, as a length-3
5156
+ * `Float64Array` `[x, y, z]`.
5157
+ */
5158
+ readonly positionKm: Float64Array;
5159
+ /**
5160
+ * Slant range from the ground station, kilometres.
5161
+ */
5162
+ readonly rangeKm: number;
5163
+ }
5164
+
3135
5165
  /**
3136
5166
  * WGS84 receiver geodetic coordinates (radians, metres) for DOP.
3137
5167
  */
@@ -3180,6 +5210,40 @@ export class ZenithDelay {
3180
5210
  */
3181
5211
  export function acquire(samples: Float64Array, prn: bigint, options: any): AcquisitionResult;
3182
5212
 
5213
+ /**
5214
+ * Evaluate NRLMSISE-00 neutral-atmosphere density and temperature.
5215
+ *
5216
+ * `latDeg` / `lonDeg` are geodetic degrees, `altKm` geodetic altitude in
5217
+ * kilometres, `year` / `doy` the UT year and day-of-year (1-366), `sec` the
5218
+ * seconds-in-day, and `f107` / `f107a` / `ap` the space-weather indices (daily
5219
+ * F10.7, 81-day centred F10.7 average, and daily magnetic Ap). The local solar
5220
+ * time is derived in the core (`sec/3600 + lonDeg/15`). Delegates to
5221
+ * `sidereon_core::astro::atmosphere::nrlmsise00_with_lst` with `lst = None`, so
5222
+ * the core derives the solar time under its default flags.
5223
+ */
5224
+ export function atmosphereDensity(lat_deg: number, lon_deg: number, alt_km: number, year: number, doy: number, sec: number, f107: number, f107a: number, ap: number): AtmosphereDensity;
5225
+
5226
+ /**
5227
+ * The canonical quiet-Sun space-weather defaults for NRLMSISE-00. Delegates to
5228
+ * `sidereon_core::astro::atmosphere::{DEFAULT_F107, DEFAULT_F107A, DEFAULT_AP}`.
5229
+ */
5230
+ export function atmosphereSpaceWeatherDefaults(): SpaceWeatherDefaults;
5231
+
5232
+ /**
5233
+ * Resolve integer ambiguities with a bounded lattice search.
5234
+ *
5235
+ * `floatCycles` and `covariance` match [`lambdaIlsSearch`]. `radius` is the
5236
+ * per-ambiguity integer search half-width (the lattice spans `radius` integers
5237
+ * either side of each rounded float), `candidateLimit` caps the number of
5238
+ * lattice points evaluated before the search aborts, and `ratioThreshold` is the
5239
+ * ratio-test acceptance threshold. Correct in the weakly-correlated regime and a
5240
+ * drop-in match for `lambdaIlsSearch` there; on strongly-correlated geometry
5241
+ * prefer `lambdaIlsSearch`. Returns an `IlsResult`. Throws a `TypeError` on a
5242
+ * malformed shape, a `RangeError` on a non-finite or out-of-domain input, and an
5243
+ * `Error` on a singular covariance or a lattice that exceeds `candidateLimit`.
5244
+ */
5245
+ export function boundedIlsSearch(float_cycles: Float64Array, covariance: any, radius: number, candidate_limit: number, ratio_threshold: number): any;
5246
+
3183
5247
  /**
3184
5248
  * One wrapping GPS C/A chip at a zero-based index.
3185
5249
  */
@@ -3205,11 +5269,28 @@ export function carrierFrequencyHz(system: GnssSystem, band: CarrierBand): numbe
3205
5269
  */
3206
5270
  export function changed(diff: any): boolean;
3207
5271
 
5272
+ /**
5273
+ * Continuous seconds since J2000 for a civil instant.
5274
+ */
5275
+ export function civilToJ2000Seconds(year: number, month: number, day: number, hour: number, minute: number, second: number): number;
5276
+
3208
5277
  /**
3209
5278
  * Carrier-to-noise-density ratio, dB-Hz. `otherLossesDb` defaults to 0.
3210
5279
  */
3211
5280
  export function cn0(eirp_dbw: number, fspl_db: number, receiver_gt_dbk: number, other_losses_db?: number | null): number;
3212
5281
 
5282
+ /**
5283
+ * Convert classical orbital elements to an inertial Cartesian state.
5284
+ *
5285
+ * `coe` is a `ClassicalElements` object (see `rv2coe`); only `p`, `ecc`,
5286
+ * `incl`, `raan`, `argp`, and `nu` are required for an ordinary orbit, with
5287
+ * `orbitType` and the auxiliary angles defaulting so the six primary elements
5288
+ * suffice. `mu` is the gravitational parameter (km^3/s^2). Returns
5289
+ * `{ positionKm, velocityKmS }`, each a length-3 `Float64Array`. Delegates to
5290
+ * `sidereon_core::astro::elements::coe2rv`.
5291
+ */
5292
+ export function coe2rv(coe: any, mu: number): any;
5293
+
3213
5294
  /**
3214
5295
  * Coherent integration loss from residual frequency error.
3215
5296
  */
@@ -3233,6 +5314,21 @@ export function collisionProbability(object1: ConjunctionState, object2: Conjunc
3233
5314
  */
3234
5315
  export function correlate(iq: Float64Array, prn: bigint, options: any): CorrelationResult;
3235
5316
 
5317
+ /**
5318
+ * Fitted parameter covariance from a converged solve, scaling `(J^T J)^-1` by
5319
+ * the post-fit reduced chi-square `s_sq = 2 * cost / (m - n)` (the same scale
5320
+ * `scipy.optimize.curve_fit` applies to its `pcov`).
5321
+ *
5322
+ * `jacobian` is a flat row-major `(m, n)` `Float64Array` (the Jacobian at the
5323
+ * solution), and `cost` is the solve's optimal cost `0.5 * sum(residual^2)`;
5324
+ * the degrees of freedom `m - n` (taken from the Jacobian's own shape) must be
5325
+ * positive. Pairs naturally with a [`crate::LeastSquaresResult`] (`result.jac`,
5326
+ * `result.m`, `result.n`, `result.cost`). Returns the `n`-by-`n` covariance as
5327
+ * a flat row-major `Float64Array`. Delegates to
5328
+ * `sidereon_core::astro::math::least_squares::covariance_from_jacobian`.
5329
+ */
5330
+ export function covarianceFromJacobian(jacobian: Float64Array, m: number, n: number, cost: number): Float64Array;
5331
+
3236
5332
  /**
3237
5333
  * Whether a 3x3 covariance (flat row-major length 9) is symmetric positive
3238
5334
  * semidefinite within the engine tolerance.
@@ -3245,6 +5341,13 @@ export function covarianceIsPositiveSemidefinite(covariance_km2: Float64Array):
3245
5341
  */
3246
5342
  export function covarianceIsSymmetric(covariance_km2: Float64Array): boolean;
3247
5343
 
5344
+ /**
5345
+ * Build a look-angle coverage grid for `satellites` and `stations` at the
5346
+ * `epochUnixUs` (Unix microseconds) epoch. Each cell is the per-pair look angle
5347
+ * from `sidereon_core::astro::coverage::look_angles_batch`.
5348
+ */
5349
+ export function coverageLookAngles(satellites: Tle[], stations: GroundStation[], epoch_unix_us: bigint): CoverageGrid;
5350
+
3248
5351
  /**
3249
5352
  * Decode Compact RINEX (Hatanaka) bytes into plain RINEX OBS text. Throws a
3250
5353
  * `TypeError` on non-UTF-8 input and an `Error` on a decode failure.
@@ -3258,11 +5361,46 @@ export function decodeCrinex(bytes: Uint8Array): string;
3258
5361
  */
3259
5362
  export function decodeCrinexLines(bytes: Uint8Array): string[];
3260
5363
 
5364
+ /**
5365
+ * Decode every CRC-valid RTCM 3 frame in a byte buffer into the message IR.
5366
+ *
5367
+ * Frames whose CRC fails, or whose body cannot be decoded, are skipped and the
5368
+ * scan resynchronizes on the next preamble. Returns an array of message objects,
5369
+ * each tagged with a `type` discriminant (`"msm"`, `"stationCoordinates"`,
5370
+ * `"antennaDescriptor"`, `"gpsEphemeris"`, `"glonassEphemeris"`,
5371
+ * `"unsupported"`). Delegates to `sidereon_core::rtcm::decode_messages`.
5372
+ */
5373
+ export function decodeRtcm(bytes: Uint8Array): any;
5374
+
5375
+ /**
5376
+ * Decode the single RTCM 3 frame that begins at the start of `bytes`.
5377
+ *
5378
+ * Returns the decoded message object plus the total `frameLen` consumed
5379
+ * (preamble, length word, body, CRC). Throws an `Error` if the preamble is
5380
+ * missing, the buffer is shorter than the declared frame, or the CRC does not
5381
+ * match. Delegates to `sidereon_core::rtcm::decode_frame` +
5382
+ * `sidereon_core::rtcm::Message::decode`.
5383
+ */
5384
+ export function decodeRtcmFrame(bytes: Uint8Array): any;
5385
+
5386
+ /**
5387
+ * Decode a single RTCM 3 message body without the transport frame.
5388
+ *
5389
+ * `body` is the bytes between the frame length word and CRC. Delegates to
5390
+ * `sidereon_core::rtcm::Message::decode`.
5391
+ */
5392
+ export function decodeRtcmMessage(body: Uint8Array): any;
5393
+
3261
5394
  /**
3262
5395
  * Standard dual-frequency ionosphere-free carrier pair for a constellation.
3263
5396
  */
3264
5397
  export function defaultPair(system: GnssSystem): CarrierPair | undefined;
3265
5398
 
5399
+ /**
5400
+ * Single-frequency carrier used by the SPP ionosphere-scaling policy.
5401
+ */
5402
+ export function defaultSppFrequencyHz(system: GnssSystem): number | undefined;
5403
+
3266
5404
  /**
3267
5405
  * Detect cycle slips on a time-ordered single-satellite carrier-phase arc.
3268
5406
  * `arc` is an array of `{ phi1Cycles?, phi2Cycles?, p1M?, p2M?, lli1?, lli2?,
@@ -3293,6 +5431,40 @@ export function diff(previous: any, current: any): any;
3293
5431
  */
3294
5432
  export function dishGain(diameter_m: number, frequency_hz: number, efficiency: number): number;
3295
5433
 
5434
+ /**
5435
+ * GNSS dilution of precision with an explicit ENU convention for the
5436
+ * horizontal/vertical split.
5437
+ *
5438
+ * `lineOfSight` is a flat row-major `(n, 3)` `Float64Array` of ECEF unit
5439
+ * vectors, `weights` a positive `Float64Array` of length `n`, and `convention`
5440
+ * is `"geodeticNormal"` (the GNSS-standard default, matching [`gnssDop`]) or
5441
+ * `"geocentricRadial"` (radial up). Only HDOP/VDOP differ between conventions
5442
+ * (by ~`1e-3` relative); GDOP/PDOP/TDOP are identical. Delegates to
5443
+ * `sidereon_core::geometry::dop_with_convention`.
5444
+ */
5445
+ export function dopWithConvention(line_of_sight: Float64Array, weights: Float64Array, receiver: Wgs84Geodetic, convention: string): Dop;
5446
+
5447
+ /**
5448
+ * Range rate and dimensionless Doppler ratio from a GCRS state.
5449
+ *
5450
+ * `gcrsPositionKm` and `gcrsVelocityKmS` are length-3 `Float64Array`s (km and
5451
+ * km/s). The station is geodetic `stationLatDeg` / `stationLonDeg` (degrees) at
5452
+ * `stationAltKm` (km). The receive epoch is the UTC civil time
5453
+ * `year`/`month`/`day`/`hour`/`minute`/`second`. Returns `[rangeRateKmS,
5454
+ * dopplerRatio]`. Delegates to
5455
+ * `sidereon_core::astro::doppler::range_rate_and_ratio`.
5456
+ */
5457
+ export function dopplerRangeRate(gcrs_position_km: Float64Array, gcrs_velocity_km_s: Float64Array, station_lat_deg: number, station_lon_deg: number, station_alt_km: number, year: number, month: number, day: number, hour: number, minute: number, second: number): Float64Array;
5458
+
5459
+ /**
5460
+ * Range rate, Doppler ratio, and carrier Doppler shift from a GCRS state.
5461
+ *
5462
+ * Same geometry and epoch inputs as [`dopplerRangeRate`], plus the transmit
5463
+ * `frequencyHz` whose shift is reported. Delegates to
5464
+ * `sidereon_core::astro::doppler::doppler_shift`.
5465
+ */
5466
+ export function dopplerShift(gcrs_position_km: Float64Array, gcrs_velocity_km_s: Float64Array, station_lat_deg: number, station_lon_deg: number, station_alt_km: number, year: number, month: number, day: number, hour: number, minute: number, second: number, frequency_hz: number): DopplerShift;
5467
+
3296
5468
  /**
3297
5469
  * Convert a Doppler shift in hertz to pseudorange rate in metres per second.
3298
5470
  */
@@ -3318,11 +5490,82 @@ export function ecefToGeodetic(position_km: Float64Array): Float64Array;
3318
5490
  */
3319
5491
  export function eclipseStatus(satellite_position_km: Float64Array, sun_position_km: Float64Array): string[];
3320
5492
 
5493
+ /**
5494
+ * Ellipsoidal height `h = H + N` (metres above the WGS84 ellipsoid) from an
5495
+ * orthometric height and a geodetic position in radians, using the embedded
5496
+ * genuine EGM96 1-degree model. Delegates to
5497
+ * `sidereon_core::geoid::egm96_ellipsoidal_height_m`.
5498
+ */
5499
+ export function egm96EllipsoidalHeightM(orthometric_height_m: number, lat_rad: number, lon_rad: number): number;
5500
+
5501
+ /**
5502
+ * Orthometric height `H = h - N` (metres above mean sea level) from an
5503
+ * ellipsoidal height and a geodetic position in radians, using the embedded
5504
+ * genuine EGM96 1-degree model. Delegates to
5505
+ * `sidereon_core::geoid::egm96_orthometric_height_m`.
5506
+ */
5507
+ export function egm96OrthometricHeightM(ellipsoidal_height_m: number, lat_rad: number, lon_rad: number): number;
5508
+
5509
+ /**
5510
+ * Geoid undulation `N` (metres above the WGS84 ellipsoid) at a geodetic
5511
+ * position in radians, from the embedded GENUINE EGM96 1-degree global grid.
5512
+ * Latitude is positive north, longitude positive east. This is the recommended
5513
+ * zero-setup default for metre-class datum work (its bilinear lookup agrees
5514
+ * with the full 15-arcminute EGM96 grid to ~0.4 m RMS); the coarse
5515
+ * [`geoidUndulation`] is only suitable for sanity checks. Delegates to
5516
+ * `sidereon_core::geoid::egm96_undulation`.
5517
+ */
5518
+ export function egm96Undulation(lat_rad: number, lon_rad: number): number;
5519
+
3321
5520
  /**
3322
5521
  * Effective isotropic radiated power, dBW.
3323
5522
  */
3324
5523
  export function eirp(tx_power_dbm: number, tx_antenna_gain_dbi: number): number;
3325
5524
 
5525
+ /**
5526
+ * Ellipsoidal height `h = H + N` (metres above the WGS84 ellipsoid) from an
5527
+ * orthometric height and a geodetic position in radians, using the built-in
5528
+ * grid's undulation. Delegates to
5529
+ * `sidereon_core::geoid::ellipsoidal_height_m`.
5530
+ */
5531
+ export function ellipsoidalHeightM(orthometric_height_m: number, lat_rad: number, lon_rad: number): number;
5532
+
5533
+ /**
5534
+ * Encode plain RINEX observation text into a Compact RINEX (Hatanaka) stream,
5535
+ * the inverse of [`decodeCrinex`]. RINEX 2 is emitted as CRINEX 1.0 and RINEX 3
5536
+ * as CRINEX 3.0, selected from the embedded `RINEX VERSION / TYPE` header. The
5537
+ * output is the canonical all-reset compression form, so it round-trips
5538
+ * (`decodeCrinex(encodeCrinex(rinex)) == rinex`) but is not byte-identical to an
5539
+ * arbitrary `RNX2CRX` stream. Throws an `Error` on malformed input. Delegates to
5540
+ * `sidereon_core::rinex::crinex::encode_crinex`.
5541
+ */
5542
+ export function encodeCrinex(rinex_text: string): string;
5543
+
5544
+ /**
5545
+ * Encode a constructed RTCM message into a message body (without the transport
5546
+ * frame).
5547
+ *
5548
+ * `message` is a `type`-tagged plain object of the same shape [`decodeRtcm`]
5549
+ * returns (`"stationCoordinates"`, `"antennaDescriptor"`, `"gpsEphemeris"`,
5550
+ * `"glonassEphemeris"`, `"msm"`, `"unsupported"`), carrying the raw transmitted
5551
+ * field integers (large fields as `bigint`). Returns the encoded body as a
5552
+ * `Uint8Array`. Delegates to `sidereon_core::rtcm::Message::encode`. Throws a
5553
+ * `TypeError` for a malformed object or unknown type.
5554
+ */
5555
+ export function encodeRtcm(message: any): Uint8Array;
5556
+
5557
+ /**
5558
+ * Encode a constructed RTCM message and wrap it in a fresh RTCM transport frame
5559
+ * (preamble, length word, body, CRC).
5560
+ *
5561
+ * `message` has the same shape [`encodeRtcm`] takes. Returns the framed bytes as
5562
+ * a `Uint8Array`, ready to feed back to [`decodeRtcmFrame`] / [`decodeRtcm`].
5563
+ * Delegates to `sidereon_core::rtcm::Message::to_frame`. Throws a `TypeError`
5564
+ * for a malformed object and an `Error` if the encoded body exceeds the frame
5565
+ * length limit.
5566
+ */
5567
+ export function encodeRtcmFrame(message: any): Uint8Array;
5568
+
3326
5569
  /**
3327
5570
  * Build the encounter frame from two position/velocity states (each a length-3
3328
5571
  * `Float64Array`).
@@ -3335,6 +5578,126 @@ export function encounterFrame(position1_km: Float64Array, velocity1_km_s: Float
3335
5578
  */
3336
5579
  export function encounterPlaneCovariance(frame: EncounterFrame, covariance_km2: Float64Array): Float64Array;
3337
5580
 
5581
+ /**
5582
+ * Confidence ellipse from an arbitrary 2x2 covariance block.
5583
+ *
5584
+ * `covariance` is a flat row-major length-4 `Float64Array` (`[c00, c01, c10,
5585
+ * c11]`); `confidence` is in `(0, 1)`. The semi-axes are the eigenvalues of the
5586
+ * symmetrized block scaled by the chi-square(2) quantile. Throws a `RangeError`
5587
+ * for a non-positive-semidefinite block or an out-of-range confidence.
5588
+ * Delegates to `sidereon_core::geometry::error_ellipse_2x2`.
5589
+ */
5590
+ export function errorEllipse2(covariance: Float64Array, confidence: number): ErrorEllipse2;
5591
+
5592
+ /**
5593
+ * Find Moon elevation threshold crossings (moonrise / moonset) over a UTC
5594
+ * window.
5595
+ *
5596
+ * The station is geodetic (`latitudeDeg`, `longitudeDeg`, `altitudeKm`);
5597
+ * `startUnixUs` / `endUnixUs` bound the window in unix microseconds. `options`
5598
+ * is `{ elevationThresholdDeg?, stepSeconds?, timeToleranceSeconds? }`.
5599
+ * Delegates to `sidereon_core::astro::bodies::find_moon_elevation_crossings`.
5600
+ */
5601
+ export function findMoonElevationCrossings(latitude_deg: number, longitude_deg: number, altitude_km: number, start_unix_us: bigint, end_unix_us: bigint, options: any): MoonElevationCrossing[];
5602
+
5603
+ /**
5604
+ * Find Moon meridian transits (upper and lower culminations) over a UTC window.
5605
+ *
5606
+ * The station is geodetic (`latitudeDeg`, `longitudeDeg`, `altitudeKm`);
5607
+ * `startUnixUs` / `endUnixUs` bound the window in unix microseconds.
5608
+ * `stepSeconds` is the uniform scan step and `timeToleranceSeconds` the
5609
+ * refinement tolerance. Delegates to
5610
+ * `sidereon_core::astro::bodies::find_moon_transits`.
5611
+ */
5612
+ export function findMoonTransits(latitude_deg: number, longitude_deg: number, altitude_km: number, start_unix_us: bigint, end_unix_us: bigint, step_seconds: number, time_tolerance_seconds: number): MoonTransit[];
5613
+
5614
+ /**
5615
+ * Find local TCA candidates between two satellites over a UTC window.
5616
+ *
5617
+ * `primaryLine1` / `primaryLine2` and `secondaryLine1` / `secondaryLine2` are
5618
+ * the TLE line pairs; `windowStartUnixMicros` / `windowEndUnixMicros` are the
5619
+ * window bounds as unix-microsecond UTC stamps (`bigint`); `options` is an
5620
+ * optional `TcaFinderOptions` object. Returns an array of `TcaCandidate`
5621
+ * objects. Delegates to
5622
+ * `sidereon_core::astro::tca::find_tca_candidates_from_tles`.
5623
+ */
5624
+ export function findTcaCandidates(primary_line1: string, primary_line2: string, secondary_line1: string, secondary_line2: string, window_start_unix_micros: bigint, window_end_unix_micros: bigint, options: any): any;
5625
+
5626
+ /**
5627
+ * Find local TCA candidates between two satellites and evaluate collision
5628
+ * probability at each.
5629
+ *
5630
+ * Like `findTcaCandidates`, plus `pcOptions` (a `TcaPcOptions` object with the
5631
+ * hard-body radius, Pc method, and optional per-object covariances). Returns an
5632
+ * array of `TcaConjunction` objects. Delegates to
5633
+ * `sidereon_core::astro::tca::find_tca_conjunctions_from_tles`.
5634
+ */
5635
+ export function findTcaConjunctions(primary_line1: string, primary_line2: string, secondary_line1: string, secondary_line2: string, window_start_unix_micros: bigint, window_end_unix_micros: bigint, pc_options: any, options: any): any;
5636
+
5637
+ /**
5638
+ * Fit a piecewise reduced-orbit model: tile `[t0, t1]` into segments of
5639
+ * `segmentSeconds` and fit each independently.
5640
+ *
5641
+ * `samples` is an array of `{ epoch, xM, yM, zM }` (ECEF metres), `scale` the
5642
+ * time scale the epochs are expressed in, and `model` is `"circular_secular"`
5643
+ * or `"eccentric_secular"`. `t0` / `t1` are `{ year, month, day, hour, minute,
5644
+ * second }` calendar epochs in that scale. Delegates to
5645
+ * `sidereon_core::orbit::fit_piecewise`.
5646
+ */
5647
+ export function fitPiecewiseReducedOrbit(samples: any, scale: TimeScale, model: string, t0: any, t1: any, segment_seconds: number): PiecewiseOrbit;
5648
+
5649
+ /**
5650
+ * Sample an SP3 product and fit a piecewise reduced orbit.
5651
+ *
5652
+ * `options` is `{ t0, t1, cadenceS, model, segmentSeconds }`. Epochs are
5653
+ * interpreted in the SP3 product time scale. Delegates to
5654
+ * `sidereon_core::orbit::fit_piecewise_reduced_orbit_source`.
5655
+ */
5656
+ export function fitPiecewiseReducedOrbitSp3(sp3: Sp3, satellite: string, options: any): PiecewiseOrbitSourceFit;
5657
+
5658
+ /**
5659
+ * Sample a TLE/SGP4 source in UTC and fit a piecewise reduced orbit.
5660
+ *
5661
+ * `options` is `{ t0, t1, cadenceS, model, segmentSeconds }`. Delegates to
5662
+ * `sidereon_core::orbit::fit_piecewise_reduced_orbit_source`.
5663
+ */
5664
+ export function fitPiecewiseReducedOrbitTle(tle: Tle, options: any): PiecewiseOrbitSourceFit;
5665
+
5666
+ /**
5667
+ * Fit a reduced-orbit model to ECEF position samples.
5668
+ *
5669
+ * `samples` is an array of `{ epoch, xM, yM, zM }` (ECEF metres), `scale` the
5670
+ * time scale the epochs are expressed in, and `model` is `"circular_secular"`
5671
+ * or `"eccentric_secular"`. Delegates to `sidereon_core::orbit::fit_with_model`.
5672
+ */
5673
+ export function fitReducedOrbit(samples: any, scale: TimeScale, model: string): ReducedOrbit;
5674
+
5675
+ /**
5676
+ * Sample an SP3 product and fit a reduced orbit.
5677
+ *
5678
+ * `options` is `{ t0, t1, cadenceS, model }`. Epochs are interpreted in the
5679
+ * SP3 product time scale. Delegates to
5680
+ * `sidereon_core::orbit::fit_reduced_orbit_source`.
5681
+ */
5682
+ export function fitReducedOrbitSp3(sp3: Sp3, satellite: string, options: any): ReducedOrbitSourceFit;
5683
+
5684
+ /**
5685
+ * Sample a TLE/SGP4 source in UTC and fit a reduced orbit.
5686
+ *
5687
+ * `options` is `{ t0, t1, cadenceS, model }`. Delegates to
5688
+ * `sidereon_core::orbit::fit_reduced_orbit_source`.
5689
+ */
5690
+ export function fitReducedOrbitTle(tle: Tle, options: any): ReducedOrbitSourceFit;
5691
+
5692
+ /**
5693
+ * Fix Melbourne-Wubbena wide-lane ambiguities over a dual-frequency RTK arc.
5694
+ *
5695
+ * `epochs` is an array of `RtkDualFrequencyArcEpoch` objects and `config` a
5696
+ * `RtkWideLaneArcConfig` object. Delegates to
5697
+ * `sidereon_core::rtk_filter::arc::fix_wide_lane_rtk_arc`.
5698
+ */
5699
+ export function fixWideLaneRtkArc(epochs: any, config: any): any;
5700
+
3338
5701
  /**
3339
5702
  * J2 oblateness gravitational acceleration in km/s^2.
3340
5703
  *
@@ -3357,19 +5720,53 @@ export function forceJ2Acceleration(position_km: Float64Array, velocity_km_s: Fl
3357
5720
  export function forceTwoBodyAcceleration(position_km: Float64Array, velocity_km_s: Float64Array): Float64Array;
3358
5721
 
3359
5722
  /**
3360
- * Build GPS identity records from CelesTrak `gps-ops` OMM JSON-array text.
5723
+ * Build constellation identity records from a CelesTrak OMM JSON-array text.
5724
+ *
5725
+ * `system` is the constellation label (`"gps"`, `"glonass"`, `"galileo"`,
5726
+ * `"beidou"`, `"qzss"`); it dispatches the per-system `OBJECT_NAME` identity
5727
+ * adapter and defaults to `"gps"`. Parses the CelesTrak JSON array into OMM
5728
+ * records (skipping array elements that are not parseable OMM objects), then
5729
+ * derives normalized `Record` rows sorted by `(system, prn)`. Returns a
5730
+ * `Record[]`. Throws an `Error` on a JSON parse failure or a CelesTrak object
5731
+ * name with no PRN resolvable for `system`.
5732
+ */
5733
+ export function fromCelestrakJson(json: string, system?: string | null): any;
5734
+
5735
+ /**
5736
+ * Build constellation identity records from a CelesTrak OMM JSON-array text,
5737
+ * skipping (rather than throwing on) entries that do not resolve.
3361
5738
  *
3362
- * Parses the CelesTrak JSON array into OMM records, then derives normalized
3363
- * `Record` rows (sorted by PRN). Returns a `Record[]`. Throws an `Error` on a
3364
- * JSON parse failure or a CelesTrak object name with no parseable PRN.
5739
+ * The lenient sibling of [`fromCelestrakJson`]: feed it a raw combined CelesTrak
5740
+ * `gnss` feed and it returns `{ records, skipped }` `records` is the `Record[]`
5741
+ * for `system` (the same shape `fromCelestrakJson` returns, sorted by
5742
+ * `(system, prn)`), and `skipped` is a `SkippedOmm[]` of the entries whose
5743
+ * `OBJECT_NAME` did not resolve to a PRN for `system` (another constellation's
5744
+ * satellite in the combined feed, or a freshly launched satellite not yet in the
5745
+ * published slot/SVID table), each carrying its `{ objectName?, noradId }` so the
5746
+ * caller can triage. `system` defaults to `"gps"`. Throws an `Error` only on a
5747
+ * JSON parse failure.
3365
5748
  */
3366
- export function fromCelestrakJson(json: string): any;
5749
+ export function fromCelestrakJsonLenient(json: string, system?: string | null): any;
3367
5750
 
3368
5751
  /**
3369
5752
  * Free-space path loss, dB, for range in km and frequency in MHz.
3370
5753
  */
3371
5754
  export function fspl(distance_km: number, frequency_mhz: number): number;
3372
5755
 
5756
+ /**
5757
+ * Galileo NeQuick-G single-frequency ionospheric group delay (positive metres).
5758
+ *
5759
+ * `ai0`/`ai1`/`ai2` are the three Galileo broadcast NeQuick-G coefficients.
5760
+ * `latDeg`/`lonDeg` are the receiver geodetic coordinates, `azimuthDeg` /
5761
+ * `elevationDeg` the satellite topocentric angles (degrees). The receive epoch
5762
+ * is the UTC civil time `year`/`month`/`day`/`hour`/`minute`/`second`, taken in
5763
+ * Galileo System Time. `frequencyHz` is the reporting carrier. Delegates to
5764
+ * `sidereon_core::atmosphere::ionosphere::ionosphere_delay` with
5765
+ * `IonoModel::GalileoNequickG`, which dispatches to the Galileo arm. Throws an
5766
+ * `Error` on an out-of-domain input.
5767
+ */
5768
+ export function galileoNequickDelay(ai0: number, ai1: number, ai2: number, lat_deg: number, lon_deg: number, azimuth_deg: number, elevation_deg: number, year: number, month: number, day: number, hour: number, minute: number, second: number, frequency_hz: number): number;
5769
+
3373
5770
  /**
3374
5771
  * Ionosphere-free coefficient `gamma = f1^2 / (f1^2 - f2^2)`.
3375
5772
  */
@@ -3382,46 +5779,159 @@ export function gamma(f1_hz: number, f2_hz: number): number;
3382
5779
  export function gcrsToItrs(position_km: Float64Array, epochs_unix_us: BigInt64Array, skyfield_compat?: boolean | null): Float64Array;
3383
5780
 
3384
5781
  /**
3385
- * Convert a batch of geodetic coordinates to ITRS (ECEF).
3386
- *
3387
- * `geodetic` is a flat row-major `(n, 3)` `Float64Array` whose columns are
3388
- * `[latitudeDeg, longitudeDeg, altitudeKm]` (WGS84). Returns a flat `(n, 3)`
3389
- * ITRS `Float64Array` in kilometres. Time-independent.
5782
+ * Convert a batch of geodetic coordinates to ITRS (ECEF).
5783
+ *
5784
+ * `geodetic` is a flat row-major `(n, 3)` `Float64Array` whose columns are
5785
+ * `[latitudeDeg, longitudeDeg, altitudeKm]` (WGS84). Returns a flat `(n, 3)`
5786
+ * ITRS `Float64Array` in kilometres. Time-independent.
5787
+ */
5788
+ export function geodeticToEcef(geodetic: Float64Array): Float64Array;
5789
+
5790
+ /**
5791
+ * Geoid undulation `N` (metres above the WGS84 ellipsoid) at a geodetic
5792
+ * position in radians, from the COARSE built-in global grid. Latitude is
5793
+ * positive north, longitude positive east. Delegates to
5794
+ * `sidereon_core::geoid::geoid_undulation`.
5795
+ */
5796
+ export function geoidUndulation(lat_rad: number, lon_rad: number): number;
5797
+
5798
+ /**
5799
+ * Geometry-free phase combination `L_GF = L1 - L2`, metres.
5800
+ */
5801
+ export function geometryFree(l1_m: number, l2_m: number): number;
5802
+
5803
+ /**
5804
+ * GLONASS FDMA L1/L2 frequency-channel number (`k`, in `-7..=6`) for an
5805
+ * orbital slot, from the published IGS/MCC slot-channel table. Returns `null`
5806
+ * for a slot with no tabulated channel.
5807
+ */
5808
+ export function glonassFdmaChannel(slot: number): number | undefined;
5809
+
5810
+ /**
5811
+ * GLONASS G1 FDMA carrier frequency in hertz for channel `k`.
5812
+ */
5813
+ export function glonassG1FrequencyHz(channel: number): number;
5814
+
5815
+ /**
5816
+ * GNSS dilution of precision from ECEF line-of-sight unit rows and weights.
5817
+ *
5818
+ * `lineOfSight` is a flat row-major `(n, 3)` `Float64Array`; `weights` is a
5819
+ * positive `Float64Array` of length `n`.
5820
+ */
5821
+ export function gnssDop(line_of_sight: Float64Array, weights: Float64Array, receiver: Wgs84Geodetic): Dop;
5822
+
5823
+ /**
5824
+ * Compute exact GNSS DOP at a single epoch from an SP3 precise product.
5825
+ *
5826
+ * `stationEcefM` is an ECEF metre vector (length 3); `j2000Seconds` the receive
5827
+ * time as continuous seconds since J2000 in the SP3 product time scale.
5828
+ * `options` is `{ satellites?, elevationMaskDeg?=5, systems?, weighting?="unit",
5829
+ * lightTime?=false }`. Delegates to `sidereon_core::geometry::dop_at_epoch`.
5830
+ */
5831
+ export function gnssDopAtEpoch(sp3: Sp3, station_ecef_m: Float64Array, j2000_seconds: number, options: any): DopGeometry;
5832
+
5833
+ /**
5834
+ * Sample SP3-derived GNSS DOP over a J2000 epoch grid.
5835
+ *
5836
+ * `stationEcefM` is an ECEF metre vector (length 3); `j2000Seconds` is a
5837
+ * `Float64Array` grid in the SP3 product time scale. Samples with too few
5838
+ * satellites or singular geometry are omitted. `options` is
5839
+ * `{ satellites?, elevationMaskDeg?=5, systems?, weighting?="unit", lightTime?=false }`.
5840
+ */
5841
+ export function gnssDopSeries(sp3: Sp3, station_ecef_m: Float64Array, j2000_seconds: Float64Array, options: any): DopSeries;
5842
+
5843
+ /**
5844
+ * Sample exact GNSS DOP over an inclusive uniform window `[startJ2000S,
5845
+ * endJ2000S]` at `stepSeconds` spacing, skipping singular or underdetermined
5846
+ * samples. `options` is the same shape as [`gnssDopAtEpoch`]. Delegates to
5847
+ * `sidereon_core::geometry::dop_series`.
5848
+ */
5849
+ export function gnssDopSeriesWindow(sp3: Sp3, station_ecef_m: Float64Array, start_j2000_s: number, end_j2000_s: number, step_seconds: number, options: any): DopSeriesSample[];
5850
+
5851
+ /**
5852
+ * Sampled visibility passes over `[startJ2000S, endJ2000S]` at `stepSeconds`
5853
+ * spacing. Delegates to `sidereon_core::geometry::passes`.
5854
+ */
5855
+ export function gnssPasses(sp3: Sp3, station_ecef_m: Float64Array, start_j2000_s: number, end_j2000_s: number, step_seconds: number, options: any): GnssPass[];
5856
+
5857
+ /**
5858
+ * Render the canonical SP3/RINEX satellite token for a constellation + PRN
5859
+ * (`("gps", 7)` -> `"G07"`, `("glonass", 13)` -> `"R13"`).
5860
+ */
5861
+ export function gnssSp3Id(system: string, prn: number): string;
5862
+
5863
+ /**
5864
+ * Stable lower-case display label for a constellation, e.g. `"gps"`.
5865
+ */
5866
+ export function gnssSystemLabel(system: GnssSystem): string;
5867
+
5868
+ /**
5869
+ * Canonical RINEX one-letter identifier for a constellation, e.g. `"G"`.
5870
+ */
5871
+ export function gnssSystemLetter(system: GnssSystem): string;
5872
+
5873
+ /**
5874
+ * Visible-satellite counts over `[startJ2000S, endJ2000S]` sampled every
5875
+ * `stepSeconds`. Delegates to `sidereon_core::geometry::visibility_series`.
5876
+ */
5877
+ export function gnssVisibilitySeries(sp3: Sp3, station_ecef_m: Float64Array, start_j2000_s: number, end_j2000_s: number, step_seconds: number, options: any): GnssVisibilityCount[];
5878
+
5879
+ /**
5880
+ * Satellites visible above the elevation mask from an SP3 product at one
5881
+ * receive epoch. `stationEcefM` is a length-3 `Float64Array` (ECEF metres),
5882
+ * `j2000Seconds` the receive time as continuous seconds since J2000.
5883
+ * Delegates to `sidereon_core::geometry::visible`.
3390
5884
  */
3391
- export function geodeticToEcef(geodetic: Float64Array): Float64Array;
5885
+ export function gnssVisible(sp3: Sp3, station_ecef_m: Float64Array, j2000_seconds: number, options: any): GnssVisibleSatellite[];
3392
5886
 
3393
5887
  /**
3394
- * Geometry-free phase combination `L_GF = L1 - L2`, metres.
5888
+ * GPS - UTC (the GNSS leap-second offset since the GPS epoch) on a UTC calendar
5889
+ * date: the IS-GPS-200 quantity broadcast in the navigation message (18 s from
5890
+ * 2017-01-01). Equals `taiUtcOffsetS - 19`. Use this, not [`taiUtcOffsetS`],
5891
+ * whenever you mean the leap seconds a GPS receiver applies. Delegates to
5892
+ * `sidereon_core::astro::time::scales::gps_utc_offset_s`.
3395
5893
  */
3396
- export function geometryFree(l1_m: number, l2_m: number): number;
5894
+ export function gpsUtcOffsetS(year: number, month: number, day: number): number;
3397
5895
 
3398
5896
  /**
3399
- * GNSS dilution of precision from ECEF line-of-sight unit rows and weights.
5897
+ * Trace of the Gauss-Newton Hessian approximation `J^T J`: the sum of the
5898
+ * squared column norms of the Jacobian, with no inverse formed.
3400
5899
  *
3401
- * `lineOfSight` is a flat row-major `(n, 3)` `Float64Array`; `weights` is a
3402
- * positive `Float64Array` of length `n`.
5900
+ * `jacobian` is a flat row-major `(m, n)` `Float64Array`. Delegates to
5901
+ * `sidereon_core::astro::math::least_squares::hessian_trace`.
3403
5902
  */
3404
- export function gnssDop(line_of_sight: Float64Array, weights: Float64Array, receiver: Wgs84Geodetic): Dop;
5903
+ export function hessianTrace(jacobian: Float64Array, m: number, n: number): number;
3405
5904
 
3406
5905
  /**
3407
- * Sample SP3-derived GNSS DOP over a J2000 epoch grid.
5906
+ * Gauss angles-only orbit determination.
3408
5907
  *
3409
- * `stationEcefM` is an ECEF metre vector (length 3); `j2000Seconds` is a
3410
- * `Float64Array` grid in the SP3 product time scale. Samples with too few
3411
- * satellites or singular geometry are omitted. `options` is
3412
- * `{ satellites?, elevationMaskDeg?=5, systems?, weighting?="unit", lightTime?=false }`.
5908
+ * `decl` and `rtasc` are length-3 declination / right-ascension
5909
+ * `Float64Array`s (radians), `jd` and `jdf` length-3 split Julian dates (whole
5910
+ * part and fraction, days), and `rseci` a flat row-major `(3, 3)`
5911
+ * `Float64Array` of observer-site ECI positions (km), one row per epoch.
5912
+ * Returns the orbit state at the middle observation. Delegates to
5913
+ * `sidereon_core::astro::iod::gauss_angles`.
3413
5914
  */
3414
- export function gnssDopSeries(sp3: Sp3, station_ecef_m: Float64Array, j2000_seconds: Float64Array, options: any): DopSeries;
5915
+ export function iodGaussAngles(decl: Float64Array, rtasc: Float64Array, jd: Float64Array, jdf: Float64Array, rseci: Float64Array): IodState;
3415
5916
 
3416
5917
  /**
3417
- * Stable lower-case display label for a constellation, e.g. `"gps"`.
5918
+ * Gibbs three-position velocity solve.
5919
+ *
5920
+ * `r1`, `r2`, `r3` are length-3 coplanar geocentric position `Float64Array`s
5921
+ * (km). Returns the velocity at `r2` plus the inter-vector and coplanarity
5922
+ * angles. Delegates to `sidereon_core::astro::iod::gibbs`.
3418
5923
  */
3419
- export function gnssSystemLabel(system: GnssSystem): string;
5924
+ export function iodGibbs(r1: Float64Array, r2: Float64Array, r3: Float64Array): IodVelocity;
3420
5925
 
3421
5926
  /**
3422
- * Canonical RINEX one-letter identifier for a constellation, e.g. `"G"`.
5927
+ * Herrick-Gibbs three-position velocity solve.
5928
+ *
5929
+ * `r1`, `r2`, `r3` are length-3 closely-spaced geocentric position
5930
+ * `Float64Array`s (km) and `jd1`/`jd2`/`jd3` their Julian-date epochs (days).
5931
+ * Returns the velocity at `r2` plus the inter-vector and coplanarity angles.
5932
+ * Delegates to `sidereon_core::astro::iod::hgibbs`.
3423
5933
  */
3424
- export function gnssSystemLetter(system: GnssSystem): string;
5934
+ export function iodHerrickGibbs(r1: Float64Array, r2: Float64Array, r3: Float64Array, jd1: number, jd2: number, jd3: number): IodVelocity;
3425
5935
 
3426
5936
  /**
3427
5937
  * Ionosphere-free code or meter-valued phase combination, metres.
@@ -3456,6 +5966,76 @@ export function isValid(validation: any): boolean;
3456
5966
  */
3457
5967
  export function itrsToGcrs(position_km: Float64Array, epochs_unix_us: BigInt64Array): Float64Array;
3458
5968
 
5969
+ /**
5970
+ * Civil calendar fields from whole seconds since J2000.
5971
+ */
5972
+ export function j2000SecondsToCivil(seconds: bigint): CivilDateTime;
5973
+
5974
+ /**
5975
+ * Jarque-Bera normality test on a residual set.
5976
+ *
5977
+ * `x` is a `Float64Array` (at least two values). Returns
5978
+ * `{ statistic, pValue }` with `statistic = n/6 (S^2 + K^2/4)` (biased moments)
5979
+ * and the chi-square(2) survival `pValue = exp(-statistic/2)`, matching
5980
+ * `scipy.stats.jarque_bera`. Delegates to
5981
+ * `sidereon_core::quality::normality::jarque_bera`.
5982
+ */
5983
+ export function jarqueBera(x: Float64Array): any;
5984
+
5985
+ /**
5986
+ * GPS broadcast Klobuchar ionospheric group delay in the model's native units
5987
+ * (positive metres).
5988
+ *
5989
+ * `alpha` and `beta` are the eight transmitted GPS Klobuchar coefficients, each
5990
+ * a length-4 `Float64Array` (`a0..a3`, `b0..b3`). Receiver latitude/longitude
5991
+ * and satellite azimuth/elevation are degrees (latitude positive north,
5992
+ * longitude positive east, azimuth clockwise from north). `tGpsS` is the GPS
5993
+ * second-of-day in `[0, 86400)`. `frequencyHz` is the carrier the dispersive
5994
+ * delay is reported on; the model evaluates the L1 delay and scales it by the
5995
+ * dispersive `(f_l1 / f)^2` factor. Delegates to
5996
+ * `sidereon_core::atmosphere::ionosphere::klobuchar_native`. Throws an `Error`
5997
+ * on an out-of-domain coefficient, angle, time, or frequency.
5998
+ */
5999
+ export function klobucharDelay(alpha: Float64Array, beta: Float64Array, lat_deg: number, lon_deg: number, azimuth_deg: number, elevation_deg: number, t_gps_s: number, frequency_hz: number): number;
6000
+
6001
+ /**
6002
+ * Sample kurtosis of a residual set.
6003
+ *
6004
+ * `x` is a `Float64Array`. `fisher` (default `true`) returns the excess
6005
+ * kurtosis `m4 / m2^2 - 3` (Gaussian -> 0, `scipy.stats.kurtosis`); `false`
6006
+ * returns the Pearson kurtosis (Gaussian -> 3). `bias` (default `true`); pass
6007
+ * `false` for the sample correction (needs at least four values). Delegates to
6008
+ * `sidereon_core::quality::normality::kurtosis`.
6009
+ */
6010
+ export function kurtosis(x: Float64Array, fisher?: boolean | null, bias?: boolean | null): number;
6011
+
6012
+ /**
6013
+ * Resolve integer ambiguities with the LAMBDA method (RTKLIB `lambda()` port).
6014
+ *
6015
+ * `floatCycles` is the real-valued ambiguity vector (`Float64Array`),
6016
+ * `covariance` is its `n x n` covariance as a row-major `number[][]`, and
6017
+ * `ratioThreshold` is the ratio-test acceptance threshold (RTKLIB's default is
6018
+ * `3.0`). Finds the true integer-least-squares optimum and runner-up for any
6019
+ * positive-definite covariance — no search box, no combinatorial blow-up.
6020
+ * Returns an `IlsResult`. Throws a `TypeError` on a malformed shape, a
6021
+ * `RangeError` on a non-finite or out-of-domain input, and an `Error` on a
6022
+ * singular covariance or a non-converging search.
6023
+ */
6024
+ export function lambdaIlsSearch(float_cycles: Float64Array, covariance: any, ratio_threshold: number): any;
6025
+
6026
+ /**
6027
+ * Solve Lambert's problem with Battin's method.
6028
+ *
6029
+ * `r1`, `r2` are length-3 position `Float64Array`s (km) and `dtsec` the time of
6030
+ * flight (seconds). `v1` (length-3, km/s) is only consulted for the degenerate
6031
+ * 180-degree transfer where the transfer-plane normal is otherwise undefined.
6032
+ * `directionOfMotion` is `"short"` or `"long"`, `directionOfEnergy` is `"low"`
6033
+ * or `"high"`, and `nrev` is the number of complete revolutions. Returns the
6034
+ * departure and arrival transfer velocities. Delegates to
6035
+ * `sidereon_core::astro::lambert::battin`.
6036
+ */
6037
+ export function lambertBattin(r1: Float64Array, r2: Float64Array, v1: Float64Array, dtsec: number, direction_of_motion_label: string, direction_of_energy_label: string, nrev: number): LambertTransfer;
6038
+
3459
6039
  /**
3460
6040
  * Provenance and coverage of the embedded leap-second (TAI-UTC) table.
3461
6041
  */
@@ -3472,6 +6052,87 @@ export function leapSeconds(year: number, month: number, day: number): number;
3472
6052
  */
3473
6053
  export function leapSecondsBatch(dates: Int32Array): Float64Array;
3474
6054
 
6055
+ /**
6056
+ * Solve a generic data-driven least-squares problem.
6057
+ *
6058
+ * `request` is a `DataProblemInput` object: a `kind` (`"linear"`,
6059
+ * `"polynomial"`, `"exponential"`) carrying its data arrays, the `x0` starting
6060
+ * point, and the SciPy `least_squares` options. The whole trust-region
6061
+ * iteration runs in Rust through
6062
+ * `trust_region_least_squares::data::solve_data_problem` (the serial entry, the
6063
+ * default in-crate SVD backend); no rayon thread pool is entered.
6064
+ */
6065
+ export function leastSquares(request: any): LeastSquaresResult;
6066
+
6067
+ /**
6068
+ * Serial leave-one-out (jackknife) over a data-driven least-squares problem.
6069
+ *
6070
+ * Delegates to the core's serial leave-one-out entry
6071
+ * `trust_region_least_squares::batch::solve_data_problem_drop_one_serial`: the
6072
+ * full problem is solved once, then re-solved with each residual row masked in
6073
+ * turn. The core's default `solve_data_problem_drop_one` fans these re-solves
6074
+ * across a rayon pool that wasm has no threads for, so this binding takes the
6075
+ * serial twin, which runs the identical re-solves one row at a time and is
6076
+ * byte-identical to the parallel version.
6077
+ */
6078
+ export function leastSquaresDropOne(request: any): LeastSquaresDropOneReport;
6079
+
6080
+ /**
6081
+ * Decode LNAV subframes 1-3 back into engineering-unit parameters.
6082
+ *
6083
+ * Each subframe is a 300-bit `Uint8Array` of `0`/`1`. Parity is verified on all
6084
+ * 30 words first; a failure throws an `Error`. Delegates to
6085
+ * `sidereon_core::navigation::lnav::decode`.
6086
+ */
6087
+ export function lnavDecode(sf1: Uint8Array, sf2: Uint8Array, sf3: Uint8Array): LnavDecoded;
6088
+
6089
+ /**
6090
+ * Encode clock and ephemeris parameters into LNAV subframes 1-3.
6091
+ *
6092
+ * `params` is the engineering-unit parameter object and `options` the optional
6093
+ * TLM/HOW object (omitted fields default to `0`). Returns the three 300-bit
6094
+ * subframes. Throws an `Error` on an out-of-range field. Delegates to
6095
+ * `sidereon_core::navigation::lnav::encode`.
6096
+ */
6097
+ export function lnavEncode(params: any, options: any): LnavSubframes;
6098
+
6099
+ /**
6100
+ * The six parity bits `[D25..D30]` of a word from its 24 source data bits.
6101
+ *
6102
+ * `data24` is the 24 source data bits (most significant first, before the
6103
+ * `D30*` complementation). `d29Prev` / `d30Prev` are the previous word's two
6104
+ * trailing parity bits. Delegates to `sidereon_core::navigation::lnav::parity`.
6105
+ */
6106
+ export function lnavParity(data24: Uint8Array, d29_prev: number, d30_prev: number): Uint8Array;
6107
+
6108
+ /**
6109
+ * Verify the parity of a single 30-bit word.
6110
+ *
6111
+ * `word30` is the 30-bit word as transmitted (data bits possibly complemented
6112
+ * by `D30*`, then 6 received parity bits). `d29Prev` / `d30Prev` are the
6113
+ * previous word's trailing parity bits. Delegates to
6114
+ * `sidereon_core::navigation::lnav::parity_valid`.
6115
+ */
6116
+ export function lnavParityValid(word30: Uint8Array, d29_prev: number, d30_prev: number): boolean;
6117
+
6118
+ /**
6119
+ * Subframe ID from a hand-over word or a full subframe.
6120
+ *
6121
+ * `bits` is a 30-bit HOW word or a 300-bit subframe. Returns the 3-bit subframe
6122
+ * ID, or `undefined` for any other length. Delegates to
6123
+ * `sidereon_core::navigation::lnav::subframe_id`.
6124
+ */
6125
+ export function lnavSubframeId(bits: Uint8Array): bigint | undefined;
6126
+
6127
+ /**
6128
+ * Time-of-week count from a hand-over word or a full subframe.
6129
+ *
6130
+ * `bits` is a 30-bit HOW word or a 300-bit subframe (whose word 2 is the HOW),
6131
+ * as a `Uint8Array` of `0`/`1`. Returns the 17-bit TOW count, or `undefined`
6132
+ * for any other length. Delegates to `sidereon_core::navigation::lnav::tow`.
6133
+ */
6134
+ export function lnavTow(bits: Uint8Array): bigint | undefined;
6135
+
3475
6136
  /**
3476
6137
  * Parse an ANTEX 1.4 antenna product from in-memory bytes (a `Uint8Array`).
3477
6138
  * Throws an `Error` on a parse failure or non-UTF-8 input.
@@ -3541,11 +6202,47 @@ export function mergeNavcen(records: any, statuses: any): any;
3541
6202
  */
3542
6203
  export function mergeSp3(sources: Sp3[], options: any): Sp3MergeResult;
3543
6204
 
6205
+ /**
6206
+ * Mean, variance, skewness, and excess kurtosis of a residual set in one pass.
6207
+ *
6208
+ * `x` is a `Float64Array`; `fisher` and `bias` select the kurtosis convention
6209
+ * and the bias correction exactly as in [`skewness`] / [`kurtosis`] (both
6210
+ * default `true`). Returns `{ mean, variance, skewness, kurtosisExcess }`; the
6211
+ * variance is the biased second central moment. Delegates to
6212
+ * `sidereon_core::quality::normality::moments`.
6213
+ */
6214
+ export function moments(x: Float64Array, fisher?: boolean | null, bias?: boolean | null): any;
6215
+
3544
6216
  /**
3545
6217
  * Angle in degrees between satellite nadir and the Moon direction.
3546
6218
  */
3547
6219
  export function moonAngle(satellite_position_km: Float64Array, moon_position_km: Float64Array): Float64Array;
3548
6220
 
6221
+ /**
6222
+ * Topocentric azimuth/elevation/range of the Moon from a ground site,
6223
+ * including the diurnal parallax. See [`sunAzEl`] for the argument shapes.
6224
+ * Delegates to `sidereon_core::astro::bodies::moon_az_el`.
6225
+ */
6226
+ export function moonAzEl(latitude_deg: number, longitude_deg: number, altitude_km: number, epoch_unix_us: bigint): any;
6227
+
6228
+ /**
6229
+ * Topocentric geometric Moon (disk-center) elevation from a ground site,
6230
+ * degrees. See [`sunAzEl`] for the argument shapes. Delegates to
6231
+ * `sidereon_core::astro::bodies::moon_az_el` and returns its `elevationDeg`: the
6232
+ * core `moon_elevation_deg` convenience wrapper `expect`s on the geometry, so a
6233
+ * valid-shaped but out-of-range station (e.g. latitude 120) would panic the
6234
+ * wasm module; going through `moon_az_el` surfaces that as a thrown JS error.
6235
+ */
6236
+ export function moonElevationDeg(latitude_deg: number, longitude_deg: number, altitude_km: number, epoch_unix_us: bigint): number;
6237
+
6238
+ /**
6239
+ * Illuminated fraction of the Moon as seen from a ground site. Returns
6240
+ * `{ illuminatedFraction, phaseAngleDeg }` (0 = new, 1 = full). See [`sunAzEl`]
6241
+ * for the argument shapes. Delegates to
6242
+ * `sidereon_core::astro::bodies::moon_illumination`.
6243
+ */
6244
+ export function moonIllumination(latitude_deg: number, longitude_deg: number, altitude_km: number, epoch_unix_us: bigint): any;
6245
+
3549
6246
  /**
3550
6247
  * Narrow-lane code combination, metres.
3551
6248
  */
@@ -3556,16 +6253,101 @@ export function narrowLaneCode(p1_m: number, p2_m: number, f1_hz: number, f2_hz:
3556
6253
  */
3557
6254
  export function navMessageLabel(message: NavMessage): string;
3558
6255
 
6256
+ /**
6257
+ * Full NeQuick-G slant ionospheric group delay (positive metres) on
6258
+ * `frequencyHz`.
6259
+ *
6260
+ * The slant TEC from [`nequick_g_stec_tecu_js`] mapped to a group delay with the
6261
+ * dispersive `40.3e16 / f^2` relation. `eval` is a plain object; see the
6262
+ * `NequickGEval` TypeScript type. Delegates to
6263
+ * `sidereon_core::atmosphere::ionosphere::nequick_g_delay_m`. Throws a
6264
+ * `TypeError` for a malformed object and an `Error` for an out-of-domain input
6265
+ * or non-positive frequency.
6266
+ */
6267
+ export function nequickGDelayM(_eval: any, frequency_hz: number): number;
6268
+
6269
+ /**
6270
+ * Full NeQuick-G slant total electron content along the ray, in TECU.
6271
+ *
6272
+ * Unlike the compact broadcast-driven [`galileo_nequick_delay`], this evaluates
6273
+ * the complete three-dimensional NeQuick 2 electron-density profiler integrated
6274
+ * along the receiver-to-satellite ray with the reference adaptive
6275
+ * Gauss-Kronrod quadrature. `eval` is a plain object; see the `NequickGEval`
6276
+ * TypeScript type. Delegates to
6277
+ * `sidereon_core::atmosphere::ionosphere::nequick_g_stec_tecu`. Throws a
6278
+ * `TypeError` for a malformed object and an `Error` for an out-of-domain month,
6279
+ * UTC, latitude, or a geometrically invalid ray.
6280
+ */
6281
+ export function nequickGStecTecu(_eval: any): number;
6282
+
3559
6283
  /**
3560
6284
  * Equal-variance noise amplification of the ionosphere-free combination.
3561
6285
  */
3562
6286
  export function noiseAmplification(f1_hz: number, f2_hz: number): number;
3563
6287
 
6288
+ /**
6289
+ * Parameter covariance from a design (Jacobian) matrix via the Gauss-Newton
6290
+ * normal equations `varianceScale * (J^T J)^-1`, formed from the thin SVD of
6291
+ * `J` (not by inverting `J^T J`, so the condition number is not squared).
6292
+ *
6293
+ * `jacobian` is a flat row-major `(m, n)` `Float64Array` with `m >= n`;
6294
+ * `varianceScale` (`sigma^2`, non-negative) scales the bare cofactor (pass the
6295
+ * post-fit reduced chi-square for the fitted covariance, or `1.0` for
6296
+ * `(J^T J)^-1`). Returns the `n`-by-`n` covariance as a flat row-major
6297
+ * `Float64Array` of length `n * n`. Throws an `Error` for a rank-deficient
6298
+ * Jacobian. Delegates to
6299
+ * `sidereon_core::astro::math::least_squares::normal_covariance`.
6300
+ */
6301
+ export function normalCovariance(jacobian: Float64Array, m: number, n: number, variance_scale: number): Float64Array;
6302
+
6303
+ /**
6304
+ * Predict observables for one satellite from a broadcast ephemeris store.
6305
+ * Delegates to `sidereon_core::observables::predict`.
6306
+ */
6307
+ export function observablesBroadcast(broadcast: BroadcastEphemeris, satellite: string, receiver_ecef_m: Float64Array, t_rx_j2000_s: number, options: any): PredictedObservables;
6308
+
6309
+ /**
6310
+ * Predict observables for one satellite from an SP3 precise product. See
6311
+ * [`observablesBroadcast`] for the broadcast-ephemeris counterpart. Delegates
6312
+ * to `sidereon_core::observables::predict`.
6313
+ */
6314
+ export function observablesSp3(sp3: Sp3, satellite: string, receiver_ecef_m: Float64Array, t_rx_j2000_s: number, options: any): PredictedObservables;
6315
+
3564
6316
  /**
3565
6317
  * Stable lower-case label for an observation kind.
3566
6318
  */
3567
6319
  export function observationKindLabel(kind: ObservationKind): string;
3568
6320
 
6321
+ /**
6322
+ * Ocean tide loading displacement of an ITRF station, metres (ECEF).
6323
+ *
6324
+ * `stationEcefM` is a length-3 geocentric ECEF metre vector and the epoch is
6325
+ * the UTC `year`/`month`/`day` plus `fractionalHour`. `amplitudeM` and
6326
+ * `phaseDeg` are the station's BLQ coefficients as flat row-major
6327
+ * `(3, 11)` `Float64Array`s: component order radial / EW-west / NS-south, and
6328
+ * constituent order M2 S2 N2 K2 K1 O1 P1 Q1 Mf Mm Ssa. Returns the displacement
6329
+ * `[dx, dy, dz]`. Delegates to `sidereon_core::tides::ocean_tide_loading`.
6330
+ */
6331
+ export function oceanTideLoading(station_ecef_m: Float64Array, year: number, month: number, day: number, fractional_hour: number, amplitude_m: Float64Array, phase_deg: Float64Array): Float64Array;
6332
+
6333
+ /**
6334
+ * Orthometric height `H = h - N` (metres above mean sea level) from an
6335
+ * ellipsoidal height and a geodetic position in radians, using the built-in
6336
+ * grid's undulation. Delegates to
6337
+ * `sidereon_core::geoid::orthometric_height_m`.
6338
+ */
6339
+ export function orthometricHeightM(ellipsoidal_height_m: number, lat_rad: number, lon_rad: number): number;
6340
+
6341
+ /**
6342
+ * Parallactic angle (degrees) of a target at a station.
6343
+ *
6344
+ * `observerLatitudeDeg` is the observer geodetic latitude, `hourAngleDeg` the
6345
+ * local hour angle (positive west of the meridian), and `declinationDeg` the
6346
+ * target declination. The result is on `(-180, 180]`. Delegates to
6347
+ * `sidereon_core::astro::observation::parallactic_angle_deg`.
6348
+ */
6349
+ export function parallacticAngleDeg(observer_latitude_deg: number, hour_angle_deg: number, declination_deg: number): number;
6350
+
3569
6351
  /**
3570
6352
  * Parse CCSDS CDM KVN text. Throws an `Error` on a parse failure.
3571
6353
  */
@@ -3584,6 +6366,18 @@ export function parseCdmXml(text: string): Cdm;
3584
6366
  */
3585
6367
  export function parseNavcen(html: string): any;
3586
6368
 
6369
+ /**
6370
+ * Parse CCSDS OEM KVN text. The KVN reader is forgiving: malformed ephemeris
6371
+ * lines are skipped and counted in `skippedStates`. Throws an `Error` on a
6372
+ * structural failure.
6373
+ */
6374
+ export function parseOemKvn(text: string): Oem;
6375
+
6376
+ /**
6377
+ * Parse CCSDS OEM XML text. Throws an `Error` on a parse failure.
6378
+ */
6379
+ export function parseOemXml(text: string): Oem;
6380
+
3587
6381
  /**
3588
6382
  * Parse CCSDS/CelesTrak OMM JSON text. Throws an `Error` on a parse failure.
3589
6383
  */
@@ -3599,6 +6393,16 @@ export function parseOmmKvn(text: string): Omm;
3599
6393
  */
3600
6394
  export function parseOmmXml(text: string): Omm;
3601
6395
 
6396
+ /**
6397
+ * Parse CCSDS OPM KVN text. Throws an `Error` on a parse failure.
6398
+ */
6399
+ export function parseOpmKvn(text: string): Opm;
6400
+
6401
+ /**
6402
+ * Parse CCSDS OPM XML text. Throws an `Error` on a parse failure.
6403
+ */
6404
+ export function parseOpmXml(text: string): Opm;
6405
+
3602
6406
  /**
3603
6407
  * Strictly parse RINEX clock bytes into satellite clock-bias series. Throws a
3604
6408
  * `TypeError` on non-UTF-8 input and an `Error` on a malformed record.
@@ -3644,6 +6448,16 @@ export function parseRinexNavRecords(bytes: Uint8Array): BroadcastRecordJs[];
3644
6448
  */
3645
6449
  export function parseRinexObs(bytes: Uint8Array): RinexObs;
3646
6450
 
6451
+ /**
6452
+ * Parse a multi-record TLE file (CelesTrak / Space-Track style) into named,
6453
+ * initialized [`Tle`] instances. Handles bare 2-line sets, 3-line name+line1+line2
6454
+ * sets, and CelesTrak `0 NAME` markers; CRLF endings, blank lines, and
6455
+ * surrounding whitespace are tolerated. A record whose element set fails SGP4
6456
+ * initialization is skipped and counted in `skipped` rather than aborting the
6457
+ * whole file. `opsMode` is `"improved"` (default) or `"afspc"`.
6458
+ */
6459
+ export function parseTleFile(text: string, ops_mode_label?: string | null): ParsedTleFile;
6460
+
3647
6461
  /**
3648
6462
  * Sun-satellite-observer phase angle in degrees.
3649
6463
  */
@@ -3654,6 +6468,73 @@ export function phaseAngle(satellite_position_km: Float64Array, sun_position_km:
3654
6468
  */
3655
6469
  export function phaseMeters(phi_cycles: number, f_hz: number): number;
3656
6470
 
6471
+ /**
6472
+ * Precompute static PPP correction tables for a precise-orbit arc.
6473
+ *
6474
+ * `epochs` is an array of `PppCorrectionEpoch` objects, `receiverEcefM` is the
6475
+ * fixed receiver position (`Float64Array` of length 3, metres), and `options`
6476
+ * selects which corrections to compute: `solidEarthTide` / `phaseWindup`
6477
+ * booleans, plus optional `satelliteAntenna` (a `PppSatelliteAntennaOptions`),
6478
+ * `poleTide` (a `PoleTideOptions`, the IERS polar motion of the date), and
6479
+ * `oceanLoading` (an `OceanLoadingBlq`, the station's BLQ block). Returns a
6480
+ * `PppCorrections` whose fields are each keyed by the input epoch index. Throws a
6481
+ * `TypeError` on a malformed shape or an invalid satellite token, and an `Error`
6482
+ * on an invalid epoch or a tide/coverage failure.
6483
+ */
6484
+ export function pppCorrections(sp3: Sp3, epochs: any, receiver_ecef_m: Float64Array, options: any): any;
6485
+
6486
+ /**
6487
+ * Predict observables for many `(satellite, receiver, epoch)` requests from a
6488
+ * broadcast ephemeris store, serially. See [`predictBatchSp3`] for the argument
6489
+ * shapes. Delegates to the serial `sidereon_core::observables::predict_batch`.
6490
+ */
6491
+ export function predictBatchBroadcast(broadcast: BroadcastEphemeris, satellites: string[], receivers_ecef_m: Float64Array, epochs_j2000_s: Float64Array, options: any): PredictBatch;
6492
+
6493
+ /**
6494
+ * Predict observables for many `(satellite, receiver, epoch)` requests from an
6495
+ * SP3 precise product, serially.
6496
+ *
6497
+ * `satellites` is an array of satellite tokens, `receiversEcefM` a flat
6498
+ * row-major `(n, 3)` `Float64Array` of receiver ECEF positions (metres), and
6499
+ * `epochsJ2000S` a `Float64Array` of receive epochs (seconds since J2000); all
6500
+ * three are index-aligned and length `n`. Element `i` of the result corresponds
6501
+ * to request `i`. Delegates to the serial reference kernel
6502
+ * `sidereon_core::observables::predict_batch`; the binding never spawns the
6503
+ * rayon thread pool the parallel variant uses.
6504
+ */
6505
+ export function predictBatchSp3(sp3: Sp3, satellites: string[], receivers_ecef_m: Float64Array, epochs_j2000_s: Float64Array, options: any): PredictBatch;
6506
+
6507
+ /**
6508
+ * Prepare ionosphere-free single-frequency RTK arc inputs from a
6509
+ * dual-frequency arc and fixed wide-lane ambiguities.
6510
+ *
6511
+ * `epochs` is an array of `RtkDualFrequencyArcEpoch` objects, `wideLaneCycles`
6512
+ * is an id-keyed integer object, and `config` is an
6513
+ * `RtkIonosphereFreeArcConfig` object. Delegates to
6514
+ * `sidereon_core::rtk_filter::arc::prepare_ionosphere_free_rtk_arc`.
6515
+ */
6516
+ export function prepareIonosphereFreeRtkArc(epochs: any, wide_lane_cycles: any, config: any): any;
6517
+
6518
+ /**
6519
+ * Propagate a fleet of already-initialized [`Tle`]s over a shared epoch grid in
6520
+ * a single call: the batched form of [`Tle.propagate`].
6521
+ *
6522
+ * Element `(i, j)` of the result is `satellites[i]` propagated to
6523
+ * `epochsUnixUs[j]`, bit-for-bit identical to `satellites[i].propagate([
6524
+ * epochsUnixUs[j] ])` on its own; this is a thin wrapper over the engine's
6525
+ * serial batch kernel (the binding never spawns the rayon thread pool, since
6526
+ * wasm is single-threaded). Each `Tle` carries the opsmode it was constructed
6527
+ * with, so a deep-space / opsmode-sensitive object is propagated in its own
6528
+ * mode. The `Tle` instances are consumed by this call.
6529
+ *
6530
+ * `epochsUnixUs` is a `BigInt64Array` of unix-microsecond UTC epochs shared by
6531
+ * every satellite. The hot case for a constellation animation is a single epoch
6532
+ * (`epochCount == 1`), giving one TEME state per satellite, but any epoch count
6533
+ * is supported. An empty fleet or empty epoch grid yields empty arrays. Throws
6534
+ * an `Error` (naming the satellite index) if a satellite fails to propagate.
6535
+ */
6536
+ export function propagateBatch(satellites: Tle[], epochs_unix_us: BigInt64Array): FleetPropagation;
6537
+
3657
6538
  /**
3658
6539
  * Numerically propagate an ECI Cartesian state and sample it at a grid of
3659
6540
  * epochs.
@@ -3675,6 +6556,20 @@ export function pseudorangeDropReasonLabel(reason: PseudorangeDropReason): strin
3675
6556
  */
3676
6557
  export function pseudorangeVariance(elevation_deg: number, options: any): number;
3677
6558
 
6559
+ /**
6560
+ * Run standalone range RAIM/FDE over a linearized measurement set.
6561
+ *
6562
+ * `rows` is an array of `{ id, residualM, designRow, weight }` objects (each
6563
+ * `designRow` the measurement's design-matrix row, of length equal to the
6564
+ * estimated state dimension). `options` is an optional `{ pFa?, maxExclusions?,
6565
+ * minRedundancy? }` object (pass `undefined` for the core defaults). Returns the
6566
+ * protected state correction, covariance, global chi-square test, the excluded
6567
+ * ids, the per-measurement diagnostics, and the exclusion count. Delegates to
6568
+ * `sidereon_core::quality::raim_fde_design`. Throws a `TypeError` for malformed
6569
+ * input and an `Error` for a rank-deficient or otherwise rejected set.
6570
+ */
6571
+ export function raimFdeDesign(rows: any, options: any): any;
6572
+
3678
6573
  /**
3679
6574
  * Convert a pseudorange rate in metres per second to Doppler shift in hertz.
3680
6575
  */
@@ -3695,12 +6590,64 @@ export function rinexBandFrequencyHz(system: GnssSystem, band: string, glonass_c
3695
6590
  */
3696
6591
  export function rinexBandWavelengthM(system: GnssSystem, band: string, glonass_channel?: number | null): number | undefined;
3697
6592
 
6593
+ /**
6594
+ * Read the 12-bit RTCM message number from a message body.
6595
+ *
6596
+ * `body` is the bytes between the frame length word and CRC. Delegates to
6597
+ * `sidereon_core::rtcm::message_number`.
6598
+ */
6599
+ export function rtcmMessageNumber(body: Uint8Array): number;
6600
+
3698
6601
  /**
3699
6602
  * Transform a 3x3 RTN covariance (flat row-major length 9) to ECI for the given
3700
6603
  * orbit state. Returns a flat row-major length-9 `Float64Array`.
3701
6604
  */
3702
6605
  export function rtnToEciCovariance(covariance_rtn: Float64Array, position_km: Float64Array, velocity_km_s: Float64Array): Float64Array;
3703
6606
 
6607
+ /**
6608
+ * Convert an inertial Cartesian state to classical orbital elements.
6609
+ *
6610
+ * `r` is the ECI position (km), `v` the ECI velocity (km/s), and `mu` the
6611
+ * gravitational parameter (km^3/s^2). Returns a `ClassicalElements` object;
6612
+ * undefined primary angles and the inapplicable auxiliary angles are `NaN` per
6613
+ * the orbit type. Delegates to `sidereon_core::astro::elements::rv2coe`. Throws
6614
+ * a `TypeError` for a wrong-length vector and an `Error` for a degenerate or
6615
+ * non-finite state.
6616
+ */
6617
+ export function rv2coe(r: Float64Array, v: Float64Array, mu: number): any;
6618
+
6619
+ /**
6620
+ * Apparent visual magnitude of a sunlit body from a diffuse-sphere phase law.
6621
+ *
6622
+ * `rangeKm` and `referenceRangeKm` (both positive) are the observation range
6623
+ * and the reference range at which `standardMagnitude` is defined;
6624
+ * `phaseAngleDeg` is the solar phase angle (Sun-body-observer), clamped to
6625
+ * `[0, 180]`. Delegates to
6626
+ * `sidereon_core::astro::observation::satellite_visual_magnitude`.
6627
+ */
6628
+ export function satelliteVisualMagnitude(range_km: number, phase_angle_deg: number, standard_magnitude: number, reference_range_km: number): number;
6629
+
6630
+ /**
6631
+ * Screen a primary satellite against a secondary TLE catalog for threshold TCAs.
6632
+ *
6633
+ * `primaryLine1` / `primaryLine2` is the primary TLE; `secondaries` is an array
6634
+ * of `{ line1, line2 }`; `missDistanceThresholdKm` is the miss-distance cutoff.
6635
+ * Returns one `TcaScreeningHit` (`{ secondaryIndex, candidate }`) per local TCA
6636
+ * at or below the threshold, in catalog then time order. Delegates to
6637
+ * `sidereon_core::astro::tca::screen_tca_candidates_from_tle_catalog_serial`.
6638
+ */
6639
+ export function screenTcaCandidates(primary_line1: string, primary_line2: string, secondaries: any, window_start_unix_micros: bigint, window_end_unix_micros: bigint, miss_distance_threshold_km: number, options: any): any;
6640
+
6641
+ /**
6642
+ * Screen a primary against a secondary TLE catalog and evaluate collision
6643
+ * probability at each threshold TCA.
6644
+ *
6645
+ * Like `screenTcaCandidates`, plus `pcOptions`. Returns an array of
6646
+ * `TcaScreeningConjunctionHit` (`{ secondaryIndex, conjunction }`). Delegates to
6647
+ * `sidereon_core::astro::tca::screen_tca_conjunctions_from_tle_catalog_serial`.
6648
+ */
6649
+ export function screenTcaConjunctions(primary_line1: string, primary_line2: string, secondaries: any, window_start_unix_micros: bigint, window_end_unix_micros: bigint, miss_distance_threshold_km: number, pc_options: any, options: any): any;
6650
+
3704
6651
  /**
3705
6652
  * Select an IONEX product usable at `requestedEpochJ2000S`, degrading to a
3706
6653
  * diurnal-shifted prior product within `policy`.
@@ -3737,12 +6684,32 @@ export function selectSp3OverRange(products: Sp3[], start_epoch_j2000_s: number,
3737
6684
  */
3738
6685
  export function shadowFraction(satellite_position_km: Float64Array, sun_position_km: Float64Array): Float64Array;
3739
6686
 
6687
+ /**
6688
+ * Shapiro-Wilk normality test on a residual set.
6689
+ *
6690
+ * `x` is a `Float64Array` (at least three values). Returns `{ w, pValue }`,
6691
+ * Royston's AS R94 port that `scipy.stats.shapiro` uses; `w` is in `(0, 1]`
6692
+ * (closer to one is more Gaussian). Delegates to
6693
+ * `sidereon_core::quality::normality::shapiro_wilk`.
6694
+ */
6695
+ export function shapiroWilk(x: Float64Array): any;
6696
+
3740
6697
  /**
3741
6698
  * Build satellite-keyed pseudorange sigmas in metres from `{ satelliteId,
3742
6699
  * elevationDeg, cn0Dbhz? }` entries. Invalid entries are dropped by the core.
3743
6700
  */
3744
6701
  export function sigmas(entries: any, options: any): SatelliteVector;
3745
6702
 
6703
+ /**
6704
+ * Sample skewness of a residual set.
6705
+ *
6706
+ * `x` is a `Float64Array`. `bias` (default `true`) selects the Fisher-Pearson
6707
+ * coefficient `g1 = m3 / m2^(3/2)` (`scipy.stats.skew`); `false` applies the
6708
+ * sample correction (`scipy.stats.skew(bias=False)`, needs at least three
6709
+ * values). Delegates to `sidereon_core::quality::normality::skewness`.
6710
+ */
6711
+ export function skewness(x: Float64Array, bias?: boolean | null): number;
6712
+
3746
6713
  /**
3747
6714
  * Stable lower-case label for a slip reason.
3748
6715
  */
@@ -3763,6 +6730,65 @@ export function smoothIonoFreeCode(arc: any, options: any, hatch_window_cap?: nu
3763
6730
  */
3764
6731
  export function snrPostDb(cn0_dbhz: number, integration_time_s: number): number;
3765
6732
 
6733
+ /**
6734
+ * Solid-earth pole tide displacement of an ITRF station, metres (ECEF).
6735
+ *
6736
+ * `stationEcefM` is a length-3 geocentric ECEF metre vector and the epoch is
6737
+ * the UTC `year`/`month`/`day` plus `fractionalHour`. `xpArcsec` / `ypArcsec`
6738
+ * are the polar-motion coordinates in arcseconds. Returns the displacement
6739
+ * `[dx, dy, dz]`. Delegates to `sidereon_core::tides::solid_earth_pole_tide`.
6740
+ */
6741
+ export function solidEarthPoleTide(station_ecef_m: Float64Array, year: number, month: number, day: number, fractional_hour: number, xp_arcsec: number, yp_arcsec: number): Float64Array;
6742
+
6743
+ /**
6744
+ * Solid-earth tide displacement of an ITRF station, metres (ECEF).
6745
+ *
6746
+ * `stationEcefM`, `sunEcefM`, `moonEcefM` are length-3 geocentric ECEF metre
6747
+ * vectors. The epoch is the UTC `year`/`month`/`day` plus `fractionalHour`
6748
+ * (`hour + min/60 + sec/3600`, in `[0, 24)`). Returns the displacement
6749
+ * `[dx, dy, dz]`. Delegates to `sidereon_core::tides::solid_earth_tide`.
6750
+ */
6751
+ export function solidEarthTide(station_ecef_m: Float64Array, year: number, month: number, day: number, fractional_hour: number, sun_ecef_m: Float64Array, moon_ecef_m: Float64Array): Float64Array;
6752
+
6753
+ /**
6754
+ * Solve a sequence of moving-baseline RTK epochs.
6755
+ *
6756
+ * `config` is a plain object; see the `MovingBaselineConfig` TypeScript type.
6757
+ * Each epoch is solved independently against its own `basePositionM`; with
6758
+ * `warmStart` (default `true`) each solved baseline seeds the next epoch's
6759
+ * linearization point. Returns an array of `MovingBaselineEpochSolution`. Throws
6760
+ * a `TypeError` for malformed input and an `Error` if a solve fails (the message
6761
+ * names the failing epoch index). Delegates to
6762
+ * `sidereon_core::rtk_filter::moving_baseline::solve_moving_baseline`.
6763
+ */
6764
+ export function solveMovingBaseline(config: any): MovingBaselineSolution[];
6765
+
6766
+ /**
6767
+ * Solve a static integer-fixed PPP arc from raw epochs: SPP auto-init seed, the
6768
+ * float solve, then the LAMBDA integer fix and ambiguity-conditioned re-solve.
6769
+ *
6770
+ * `epochs`, `floatConfig`, and `fixedConfig` are the same plain objects the
6771
+ * float and fixed solves take; `options` is an optional `PppAutoInitOptions`
6772
+ * object. Delegates to
6773
+ * `sidereon_core::precise_positioning::auto_init::solve_ppp_auto_init_fixed`.
6774
+ * Throws a `TypeError` for malformed input and an `Error` if the solve fails.
6775
+ */
6776
+ export function solvePppAutoInitFixed(sp3: Sp3, epochs: any, options: any, float_config: any, fixed_config: any): PppFixedSolution;
6777
+
6778
+ /**
6779
+ * Solve a static multi-epoch float PPP arc from raw epochs, auto-initializing
6780
+ * the float state from the SPP seed.
6781
+ *
6782
+ * Unlike [`solvePppFloat`], the caller does not supply an initial state: the
6783
+ * driver seeds it (per-epoch SPP code solve, mean position, phase-minus-code
6784
+ * ambiguities) before the float solve. `epochs` and `config` are the same plain
6785
+ * objects [`solvePppFloat`] takes; `options` is an optional `PppAutoInitOptions`
6786
+ * object (pass `undefined` for the SPP-seeded defaults). Delegates to
6787
+ * `sidereon_core::precise_positioning::auto_init::solve_ppp_auto_init_float`.
6788
+ * Throws a `TypeError` for malformed input and an `Error` if the solve fails.
6789
+ */
6790
+ export function solvePppAutoInitFloat(sp3: Sp3, epochs: any, options: any, config: any): PppFloatSolution;
6791
+
3766
6792
  /**
3767
6793
  * Search integer ambiguities from a float PPP solution and re-solve fixed.
3768
6794
  *
@@ -3781,6 +6807,18 @@ export function solvePppFixed(sp3: Sp3, epochs: any, float_solution: PppFloatSol
3781
6807
  */
3782
6808
  export function solvePppFloat(sp3: Sp3, epochs: any, initial_state: any, config: any): PppFloatSolution;
3783
6809
 
6810
+ /**
6811
+ * Solve a sequential RTK baseline arc from raw rover+base epochs.
6812
+ *
6813
+ * `epochs` is an array of `RtkArcEpoch` objects and `config` an `RtkArcConfig`
6814
+ * object (see the TypeScript types). Returns `{ references, epochs, finalState }`:
6815
+ * one reported baseline/ambiguity solution per input epoch, the per-system
6816
+ * reference satellites selected once for the whole arc, and the final carried
6817
+ * filter state. Delegates to `sidereon_core::rtk_filter::arc::solve_rtk_arc`.
6818
+ * Throws a `TypeError` for malformed input and an `Error` if the solve fails.
6819
+ */
6820
+ export function solveRtkArc(epochs: any, config: any): any;
6821
+
3784
6822
  /**
3785
6823
  * Solve a static fixed RTK baseline with residual validation / FDE.
3786
6824
  *
@@ -3798,12 +6836,29 @@ export function solveRtkFixed(config: any): RtkFixedSolution;
3798
6836
  export function solveRtkFloat(config: any): RtkFloatSolution;
3799
6837
 
3800
6838
  /**
3801
- * Solve receiver ECEF velocity and clock drift from one epoch of observations.
3802
- * `observations` is an array of `{ satelliteId, value, carrierHz,
3803
- * satClockDriftSS? }`; `receiverEcefM` is a length-3 `Float64Array`.
6839
+ * Solve a static RTK arc with one batch float solution and one validated fixed
6840
+ * solution over the whole arc.
6841
+ *
6842
+ * `epochs` is an array of `RtkArcEpoch` objects and `config` a
6843
+ * `RtkStaticArcConfig` object. Delegates to
6844
+ * `sidereon_core::rtk_filter::arc::solve_static_rtk_arc`.
6845
+ */
6846
+ export function solveStaticRtkArc(epochs: any, config: any): any;
6847
+
6848
+ /**
6849
+ * Solve receiver velocity over an SP3 precise product. See
6850
+ * [`solveVelocityBroadcast`] for the broadcast-ephemeris counterpart.
3804
6851
  */
3805
6852
  export function solveVelocity(sp3: Sp3, observations: any, receiver_ecef_m: Float64Array, t_rx_j2000_s: number, options: any): VelocitySolution;
3806
6853
 
6854
+ /**
6855
+ * Solve receiver ECEF velocity and clock drift from one epoch of observations
6856
+ * over a broadcast ephemeris store. Identical to [`solveVelocity`] except the
6857
+ * satellite states come from broadcast records. Delegates to
6858
+ * `sidereon_core::velocity::solve`.
6859
+ */
6860
+ export function solveVelocityBroadcast(broadcast: BroadcastEphemeris, observations: any, receiver_ecef_m: Float64Array, t_rx_j2000_s: number, options: any): VelocitySolution;
6861
+
3807
6862
  /**
3808
6863
  * Solve a receiver position, preferring precise SP3 products and falling back to
3809
6864
  * broadcast ephemeris, reporting which source was used and how stale it is.
@@ -3817,11 +6872,48 @@ export function solveVelocity(sp3: Sp3, observations: any, receiver_ecef_m: Floa
3817
6872
  */
3818
6873
  export function solveWithFallback(precise: Sp3[], broadcast: BroadcastEphemeris, request: any, policy: any): SourcedSolution;
3819
6874
 
6875
+ /**
6876
+ * Continuous seconds since J2000 for a split Julian date.
6877
+ */
6878
+ export function splitJdToJ2000Seconds(jd_whole: number, jd_fraction: number): number;
6879
+
6880
+ /**
6881
+ * Sub-observer point (planetary central meridian) on a rotating body.
6882
+ *
6883
+ * `observerFromBody` is the observer position relative to the body center
6884
+ * (length-3 `Float64Array`) in an inertial (ICRF/J2000 equatorial) frame, and
6885
+ * `poleRaDeg` / `poleDecDeg` / `primeMeridianDeg` are the IAU WGCCRE pole right
6886
+ * ascension, declination, and prime-meridian angle. Returns the body-fixed
6887
+ * `{ latitudeDeg, longitudeDeg }` (planetocentric, longitude on `(-180, 180]`).
6888
+ * Delegates to `sidereon_core::astro::observation::sub_observer_point`.
6889
+ */
6890
+ export function subObserverPoint(observer_from_body: Float64Array, pole_ra_deg: number, pole_dec_deg: number, prime_meridian_deg: number): any;
6891
+
6892
+ /**
6893
+ * Sub-solar point: the geographic point where the Sun is at the zenith.
6894
+ *
6895
+ * `sunEcef` is the geocentric Sun position (length-3 `Float64Array`) in an
6896
+ * Earth-fixed (ITRS/ECEF) frame; only its direction matters. Returns
6897
+ * `{ latitudeDeg, longitudeDeg }` (geocentric, degrees). Delegates to
6898
+ * `sidereon_core::astro::observation::sub_solar_point`.
6899
+ */
6900
+ export function subSolarPoint(sun_ecef: Float64Array): any;
6901
+
3820
6902
  /**
3821
6903
  * Angle in degrees between satellite nadir and the Sun direction.
3822
6904
  */
3823
6905
  export function sunAngle(satellite_position_km: Float64Array, sun_position_km: Float64Array): Float64Array;
3824
6906
 
6907
+ /**
6908
+ * Topocentric azimuth/elevation/range of the Sun from a ground site.
6909
+ *
6910
+ * The station is geodetic (`latitudeDeg`, `longitudeDeg`, `altitudeKm`);
6911
+ * `epochUnixUs` is the UTC instant as unix microseconds. Returns
6912
+ * `{ azimuthDeg, elevationDeg, rangeKm }` (azimuth clockwise from north).
6913
+ * Delegates to `sidereon_core::astro::bodies::sun_az_el`.
6914
+ */
6915
+ export function sunAzEl(latitude_deg: number, longitude_deg: number, altitude_km: number, epoch_unix_us: bigint): any;
6916
+
3825
6917
  /**
3826
6918
  * Sun elevation in degrees above the satellite local horizontal plane.
3827
6919
  */
@@ -3839,6 +6931,15 @@ export function sunMoonEcef(epochs_unix_us: BigInt64Array): SunMoon;
3839
6931
  */
3840
6932
  export function sunMoonEci(epochs_unix_us: BigInt64Array): SunMoon;
3841
6933
 
6934
+ /**
6935
+ * TAI-UTC (cumulative leap seconds) in effect on a UTC calendar date.
6936
+ *
6937
+ * This is **not** the GNSS "GPS - UTC" offset; for the quantity a GPS receiver
6938
+ * applies use [`gpsUtcOffsetS`] (they differ by a constant 19 s). Delegates to
6939
+ * `sidereon_core::astro::time::scales::tai_utc_offset_s`.
6940
+ */
6941
+ export function taiUtcOffsetS(year: number, month: number, day: number): number;
6942
+
3842
6943
  /**
3843
6944
  * Transform a batch of TEME states to GCRS, each at its own epoch.
3844
6945
  *
@@ -3848,11 +6949,45 @@ export function sunMoonEci(epochs_unix_us: BigInt64Array): SunMoon;
3848
6949
  */
3849
6950
  export function temeToGcrs(position_km: Float64Array, velocity_km_s: Float64Array, epochs_unix_us: BigInt64Array, skyfield_compat?: boolean | null): FrameStates;
3850
6951
 
6952
+ /**
6953
+ * Latitude (degrees) of the day-night terminator at a query longitude.
6954
+ *
6955
+ * `subSolarLatitudeDeg` / `subSolarLongitudeDeg` are the sub-solar point (see
6956
+ * `subSolarPoint`); `longitudeDeg` is the query longitude. Delegates to
6957
+ * `sidereon_core::astro::observation::terminator_latitude_deg`.
6958
+ */
6959
+ export function terminatorLatitudeDeg(sub_solar_latitude_deg: number, sub_solar_longitude_deg: number, longitude_deg: number): number;
6960
+
3851
6961
  /**
3852
6962
  * Short uppercase identifier for a time scale, e.g. `"GPST"`.
3853
6963
  */
3854
6964
  export function timeScaleAbbrev(scale: TimeScale): string;
3855
6965
 
6966
+ /**
6967
+ * Leap-aware inter-system offset `to_reading - from_reading`, in seconds, at a
6968
+ * given UTC instant. Add the result to a `from`-scale reading to get the
6969
+ * `to`-scale reading.
6970
+ *
6971
+ * `utcJd` is the UTC Julian date of the instant; it is consulted only to
6972
+ * resolve the leap-second count when `from` or `to` is UTC-based
6973
+ * (`Utc`/`Glonasst`), and is ignored for purely atomic pairs. Throws a
6974
+ * `RangeError` for `Tdb` or a non-finite `utcJd` when a leap count is needed.
6975
+ */
6976
+ export function timescaleOffsetAtS(from: TimeScale, to: TimeScale, utc_jd: number): number;
6977
+
6978
+ /**
6979
+ * Fixed inter-system offset `to_reading - from_reading`, in seconds, for the
6980
+ * same physical instant. Add the result to a `from`-scale reading to get the
6981
+ * `to`-scale reading.
6982
+ *
6983
+ * Covers the atomic scales (TAI/TT/GPST/GST/QZSST/BDT), whose mutual offsets
6984
+ * are constants fixed by their ICDs. Throws a `RangeError` when either scale is
6985
+ * UTC-based (`Utc`/`Glonasst`): those carry leap seconds, so their offset is
6986
+ * epoch-dependent and needs [`timescaleOffsetAtS`], or for `Tdb` (no fixed
6987
+ * offset; resolve it through an `Instant`).
6988
+ */
6989
+ export function timescaleOffsetS(from: TimeScale, to: TimeScale): number;
6990
+
3856
6991
  /**
3857
6992
  * Export records as the compact mapping CSV (`prn,norad_cat_id,active,sp3_id`).
3858
6993
  *
@@ -3912,6 +7047,25 @@ export function validate(records: any): any;
3912
7047
  */
3913
7048
  export function validateAgainstSp3Ids(records: any, ids: any): any;
3914
7049
 
7050
+ /**
7051
+ * Satellites visible above `minElevationDeg` from `station` at a single instant,
7052
+ * from already-initialized [`Tle`]s: the opsmode-preserving constellation
7053
+ * snapshot.
7054
+ *
7055
+ * Each `Tle` in `satellites` carries the opsmode it was constructed with, so a
7056
+ * deep-space / opsmode-sensitive object is evaluated in its own mode (unlike the
7057
+ * element-based core path, which hardcodes AFSPC). `ids` supplies the identity
7058
+ * out-of-band: `ids[i]` (a catalog number, name, or anything) becomes the
7059
+ * `catalogNumber` of `satellites[i]`, so the two arrays must be the same length.
7060
+ * The `Tle` instances are consumed by this call.
7061
+ *
7062
+ * `epochUnixUs` is a unix-microsecond UTC `bigint`. Per-satellite propagation or
7063
+ * frame failures are skipped; the result is filtered by `minElevationDeg` and
7064
+ * sorted by elevation descending. Throws an `Error` on an invalid station,
7065
+ * elevation threshold, or `ids`/`satellites` length mismatch.
7066
+ */
7067
+ export function visibleFromSatellites(satellites: Tle[], ids: string[], station: GroundStation, epoch_unix_us: bigint, min_elevation_deg: number): VisibleSatellite[];
7068
+
3915
7069
  /**
3916
7070
  * Wavelength, metres, for frequency in Hz.
3917
7071
  */