@neilberkman/sidereon 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
  */
@@ -1027,79 +1406,234 @@ export class FdeSolution {
1027
1406
  }
1028
1407
 
1029
1408
  /**
1030
- * A batch of transformed states from [`temeToGcrs`]: flat row-major
1031
- * `positionKm` and `velocityKmS` `Float64Array`s, each length `3 * epochCount`.
1409
+ * One pass in a [`Constellation.passes`] result: the pass geometry plus the
1410
+ * fleet-order `satelliteIndex` of the satellite it belongs to (map that index to
1411
+ * your own per-satellite metadata).
1032
1412
  */
1033
- export class FrameStates {
1413
+ export class FleetPass {
1034
1414
  private constructor();
1035
1415
  free(): void;
1036
1416
  [Symbol.dispose](): void;
1037
1417
  /**
1038
- * Number of states in the batch.
1418
+ * AOS (acquisition of signal), unix microseconds.
1039
1419
  */
1040
- readonly epochCount: number;
1420
+ readonly aosUnixUs: bigint;
1041
1421
  /**
1042
- * Transformed positions, kilometres, flat row-major `(n, 3)`.
1422
+ * Culmination (peak elevation) time, unix microseconds.
1043
1423
  */
1044
- readonly positionKm: Float64Array;
1424
+ readonly culminationUnixUs: bigint;
1045
1425
  /**
1046
- * Transformed velocities, km/s, flat row-major `(n, 3)`.
1426
+ * LOS (loss of signal), unix microseconds.
1047
1427
  */
1048
- readonly velocityKmS: Float64Array;
1428
+ readonly losUnixUs: bigint;
1429
+ /**
1430
+ * Peak elevation during the pass, degrees.
1431
+ */
1432
+ readonly maxElevationDeg: number;
1433
+ /**
1434
+ * Fleet-order index of the satellite this pass belongs to.
1435
+ */
1436
+ readonly satelliteIndex: number;
1049
1437
  }
1050
1438
 
1051
1439
  /**
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.
1440
+ * TEME states from a batched fleet SGP4 propagation. Each array is flat
1441
+ * row-major with shape `(satelliteCount, epochCount, 3)`: satellite `i`'s arc
1442
+ * occupies the contiguous slice `[i * epochCount * 3 .. (i + 1) * epochCount *
1443
+ * 3]`, and within it epoch `j` is `[.. j * 3 + 3]`. Satellite `i`'s arc equals
1444
+ * the [`TlePropagation`] from `satellites[i].propagate(epochsUnixUs)`.
1054
1445
  */
1055
- export class GlonassRecordJs {
1446
+ export class FleetPropagation {
1056
1447
  private constructor();
1057
1448
  free(): void;
1058
1449
  [Symbol.dispose](): void;
1059
1450
  /**
1060
- * Lunisolar acceleration `[ax, ay, az]`, metres per second squared.
1061
- */
1062
- readonly accelerationMS2: Float64Array;
1063
- /**
1064
- * Broadcast clock bias, seconds.
1065
- */
1066
- readonly clockBiasS: number;
1067
- /**
1068
- * FDMA frequency-channel number.
1451
+ * Number of epochs each satellite was propagated to (the second axis).
1069
1452
  */
1070
- readonly freqChannel: number;
1453
+ readonly epochCount: number;
1071
1454
  /**
1072
- * Relative frequency offset.
1455
+ * TEME positions, km, flat row-major `(satelliteCount, epochCount, 3)`,
1456
+ * length `3 * satelliteCount * epochCount`.
1073
1457
  */
1074
- readonly gammaN: number;
1458
+ readonly positionKm: Float64Array;
1075
1459
  /**
1076
- * PZ-90.11 ECEF position `[x, y, z]`, metres.
1460
+ * Number of satellites in the fleet (the leading axis).
1077
1461
  */
1078
- readonly positionM: Float64Array;
1462
+ readonly satelliteCount: number;
1079
1463
  /**
1080
- * RINEX satellite token such as `"R10"`.
1464
+ * TEME velocities, km/s, flat row-major `(satelliteCount, epochCount, 3)`,
1465
+ * length `3 * satelliteCount * epochCount`.
1081
1466
  */
1082
- readonly satellite: string;
1467
+ readonly velocityKmS: Float64Array;
1468
+ }
1469
+
1470
+ /**
1471
+ * A forgiving RTCM 3 stream scanner: slides over a byte buffer, resynchronizes
1472
+ * on the next `0xD3` preamble whenever the length overruns or the CRC fails, and
1473
+ * yields only frames whose CRC verifies, exactly as a receiver locks onto a
1474
+ * serial feed.
1475
+ *
1476
+ * Wraps `sidereon_core::rtcm::FrameScanner`: construction runs the scan to
1477
+ * completion (the core iterator owns the scanning logic) and `next()` walks the
1478
+ * yielded frames.
1479
+ */
1480
+ export class FrameScanner {
1481
+ free(): void;
1482
+ [Symbol.dispose](): void;
1083
1483
  /**
1084
- * Satellite health; 0 is healthy.
1484
+ * Begin scanning `bytes` from the start.
1085
1485
  */
1086
- readonly svHealth: number;
1486
+ constructor(bytes: Uint8Array);
1087
1487
  /**
1088
- * Reference epoch, UTC seconds past J2000.
1488
+ * The next CRC-valid frame as `{ body, frameLen }` (`body` a `Uint8Array`,
1489
+ * the message body between the length word and the CRC), or `undefined` when
1490
+ * the scan is exhausted.
1089
1491
  */
1090
- readonly toeUtcJ2000S: number;
1492
+ next(): any;
1091
1493
  /**
1092
- * PZ-90.11 ECEF velocity `[vx, vy, vz]`, metres per second.
1494
+ * The total number of CRC-valid frames the scan found.
1093
1495
  */
1094
- readonly velocityMS: Float64Array;
1496
+ readonly length: number;
1095
1497
  }
1096
1498
 
1097
1499
  /**
1098
- * A GNSS constellation. The JS value matches the variant order below.
1500
+ * A batch of transformed states from [`temeToGcrs`]: flat row-major
1501
+ * `positionKm` and `velocityKmS` `Float64Array`s, each length `3 * epochCount`.
1099
1502
  */
1100
- export enum GnssSystem {
1503
+ export class FrameStates {
1504
+ private constructor();
1505
+ free(): void;
1506
+ [Symbol.dispose](): void;
1101
1507
  /**
1102
- * GPS, RINEX letter `G`.
1508
+ * Number of states in the batch.
1509
+ */
1510
+ readonly epochCount: number;
1511
+ /**
1512
+ * Transformed positions, kilometres, flat row-major `(n, 3)`.
1513
+ */
1514
+ readonly positionKm: Float64Array;
1515
+ /**
1516
+ * Transformed velocities, km/s, flat row-major `(n, 3)`.
1517
+ */
1518
+ readonly velocityKmS: Float64Array;
1519
+ }
1520
+
1521
+ /**
1522
+ * A regular latitude/longitude grid of geoid undulation samples with bilinear
1523
+ * interpolation, wrapping a real (loaded) geoid model.
1524
+ */
1525
+ export class GeoidGrid {
1526
+ free(): void;
1527
+ [Symbol.dispose](): void;
1528
+ /**
1529
+ * Parse a grid from the documented whitespace-delimited text format (a
1530
+ * six-field header `lat_min lon_min dlat dlon n_lat n_lon` followed by
1531
+ * `n_lat * n_lon` samples in metres). Throws an `Error` on a malformed
1532
+ * header or sample. Delegates to
1533
+ * `sidereon_core::geoid::GeoidGrid::from_text`.
1534
+ */
1535
+ static fromText(text: string): GeoidGrid;
1536
+ /**
1537
+ * Build a grid from its origin, spacing, dimensions, and row-major samples
1538
+ * (metres, latitude ascending outer, longitude ascending inner). Throws an
1539
+ * `Error` when a dimension is zero, the sample count is not `nLat * nLon`, a
1540
+ * spacing/origin is non-finite or a spacing is non-positive, or a sample is
1541
+ * non-finite. Delegates to `sidereon_core::geoid::GeoidGrid::new`.
1542
+ */
1543
+ constructor(lat_min_deg: number, lon_min_deg: number, dlat_deg: number, dlon_deg: number, n_lat: number, n_lon: number, values_m: Float64Array);
1544
+ /**
1545
+ * Bilinearly interpolated undulation `N` (metres) at a geodetic position in
1546
+ * degrees (latitude positive north, longitude positive east).
1547
+ */
1548
+ undulationDeg(lat_deg: number, lon_deg: number): number;
1549
+ /**
1550
+ * Bilinearly interpolated undulation `N` (metres) at a geodetic position in
1551
+ * radians (latitude positive north, longitude positive east).
1552
+ */
1553
+ undulationRad(lat_rad: number, lon_rad: number): number;
1554
+ }
1555
+
1556
+ /**
1557
+ * One GLONASS broadcast state-vector record. `toeUtcJ2000S` is UTC seconds past
1558
+ * J2000; position is PZ-90.11 ECEF metres, velocity m/s, acceleration m/s^2.
1559
+ */
1560
+ export class GlonassRecordJs {
1561
+ private constructor();
1562
+ free(): void;
1563
+ [Symbol.dispose](): void;
1564
+ /**
1565
+ * Lunisolar acceleration `[ax, ay, az]`, metres per second squared.
1566
+ */
1567
+ readonly accelerationMS2: Float64Array;
1568
+ /**
1569
+ * Broadcast clock bias, seconds.
1570
+ */
1571
+ readonly clockBiasS: number;
1572
+ /**
1573
+ * FDMA frequency-channel number.
1574
+ */
1575
+ readonly freqChannel: number;
1576
+ /**
1577
+ * Relative frequency offset.
1578
+ */
1579
+ readonly gammaN: number;
1580
+ /**
1581
+ * PZ-90.11 ECEF position `[x, y, z]`, metres.
1582
+ */
1583
+ readonly positionM: Float64Array;
1584
+ /**
1585
+ * RINEX satellite token such as `"R10"`.
1586
+ */
1587
+ readonly satellite: string;
1588
+ /**
1589
+ * Satellite health; 0 is healthy.
1590
+ */
1591
+ readonly svHealth: number;
1592
+ /**
1593
+ * Reference epoch, UTC seconds past J2000.
1594
+ */
1595
+ readonly toeUtcJ2000S: number;
1596
+ /**
1597
+ * PZ-90.11 ECEF velocity `[vx, vy, vz]`, metres per second.
1598
+ */
1599
+ readonly velocityMS: Float64Array;
1600
+ }
1601
+
1602
+ /**
1603
+ * One sampled rise/set/peak visibility pass, from `gnssPasses`.
1604
+ */
1605
+ export class GnssPass {
1606
+ private constructor();
1607
+ free(): void;
1608
+ [Symbol.dispose](): void;
1609
+ /**
1610
+ * Maximum sampled elevation in the pass, degrees.
1611
+ */
1612
+ readonly peakElevationDeg: number;
1613
+ /**
1614
+ * Zero-based sample index of the maximum sampled elevation.
1615
+ */
1616
+ readonly peakStepIndex: number;
1617
+ /**
1618
+ * Zero-based sample index of the first above-mask sample.
1619
+ */
1620
+ readonly riseStepIndex: number;
1621
+ /**
1622
+ * Satellite token, e.g. `"G05"`.
1623
+ */
1624
+ readonly satellite: string;
1625
+ /**
1626
+ * Zero-based sample index of the last above-mask sample.
1627
+ */
1628
+ readonly setStepIndex: number;
1629
+ }
1630
+
1631
+ /**
1632
+ * A GNSS constellation. The JS value matches the variant order below.
1633
+ */
1634
+ export enum GnssSystem {
1635
+ /**
1636
+ * GPS, RINEX letter `G`.
1103
1637
  */
1104
1638
  Gps = 0,
1105
1639
  /**
@@ -1128,6 +1662,45 @@ export enum GnssSystem {
1128
1662
  Sbas = 6,
1129
1663
  }
1130
1664
 
1665
+ /**
1666
+ * Per-epoch visible-satellite count over a sampled window, from
1667
+ * `gnssVisibilitySeries`.
1668
+ */
1669
+ export class GnssVisibilityCount {
1670
+ private constructor();
1671
+ free(): void;
1672
+ [Symbol.dispose](): void;
1673
+ /**
1674
+ * Number of satellites visible at this sample.
1675
+ */
1676
+ readonly nVisible: number;
1677
+ /**
1678
+ * Zero-based sample index from the window start.
1679
+ */
1680
+ readonly stepIndex: number;
1681
+ }
1682
+
1683
+ /**
1684
+ * One satellite above the elevation mask at a single epoch, from `gnssVisible`.
1685
+ */
1686
+ export class GnssVisibleSatellite {
1687
+ private constructor();
1688
+ free(): void;
1689
+ [Symbol.dispose](): void;
1690
+ /**
1691
+ * Topocentric azimuth in `[0, 360)`, degrees.
1692
+ */
1693
+ readonly azimuthDeg: number;
1694
+ /**
1695
+ * Topocentric elevation, degrees.
1696
+ */
1697
+ readonly elevationDeg: number;
1698
+ /**
1699
+ * Satellite token, e.g. `"G05"`.
1700
+ */
1701
+ readonly satellite: string;
1702
+ }
1703
+
1131
1704
  /**
1132
1705
  * A GNSS week number plus time-of-week, tagged by constellation.
1133
1706
  */
@@ -1177,6 +1750,34 @@ export class GroundStation {
1177
1750
  readonly longitudeDeg: number;
1178
1751
  }
1179
1752
 
1753
+ /**
1754
+ * Sub-satellite ground-track points from a batched [`Tle.groundTrack`] call.
1755
+ * Each array is a `Float64Array` of length `epochCount`, aligned to the input
1756
+ * epoch grid. WGS84 geodetic: latitude/longitude in degrees, ellipsoidal height
1757
+ * in kilometres.
1758
+ */
1759
+ export class GroundTrack {
1760
+ private constructor();
1761
+ free(): void;
1762
+ [Symbol.dispose](): void;
1763
+ /**
1764
+ * Ellipsoidal height above the WGS84 ellipsoid, kilometres.
1765
+ */
1766
+ readonly altKm: Float64Array;
1767
+ /**
1768
+ * Number of epochs evaluated.
1769
+ */
1770
+ readonly epochCount: number;
1771
+ /**
1772
+ * Geodetic latitude of the sub-satellite point, degrees north.
1773
+ */
1774
+ readonly latDeg: Float64Array;
1775
+ /**
1776
+ * Geodetic longitude of the sub-satellite point, degrees east in `[-180, 180]`.
1777
+ */
1778
+ readonly lonDeg: Float64Array;
1779
+ }
1780
+
1180
1781
  /**
1181
1782
  * A point in time, tagged UTC, with the precise time scales resolved.
1182
1783
  *
@@ -1276,6 +1877,49 @@ export class Instant {
1276
1877
  readonly ut1JdSplit: JulianDate;
1277
1878
  }
1278
1879
 
1880
+ /**
1881
+ * A determined orbit state: position and velocity at one epoch.
1882
+ */
1883
+ export class IodState {
1884
+ private constructor();
1885
+ free(): void;
1886
+ [Symbol.dispose](): void;
1887
+ /**
1888
+ * Position `[x, y, z]`, kilometres.
1889
+ */
1890
+ readonly positionKm: Float64Array;
1891
+ /**
1892
+ * Velocity `[vx, vy, vz]`, kilometres per second.
1893
+ */
1894
+ readonly velocityKmS: Float64Array;
1895
+ }
1896
+
1897
+ /**
1898
+ * A Gibbs / Herrick-Gibbs velocity solve: the velocity at the middle position
1899
+ * and the geometry diagnostics.
1900
+ */
1901
+ export class IodVelocity {
1902
+ private constructor();
1903
+ free(): void;
1904
+ [Symbol.dispose](): void;
1905
+ /**
1906
+ * Coplanarity angle of the three position vectors, radians.
1907
+ */
1908
+ readonly coplanarityRad: number;
1909
+ /**
1910
+ * Angle between the first and second position vectors, radians.
1911
+ */
1912
+ readonly theta12Rad: number;
1913
+ /**
1914
+ * Angle between the second and third position vectors, radians.
1915
+ */
1916
+ readonly theta23Rad: number;
1917
+ /**
1918
+ * Velocity at the middle position `[vx, vy, vz]`, kilometres per second.
1919
+ */
1920
+ readonly velocityKmS: Float64Array;
1921
+ }
1922
+
1279
1923
  /**
1280
1924
  * A parsed IONEX vertical-TEC product. Create with [`load_ionex`].
1281
1925
  */
@@ -1294,6 +1938,13 @@ export class Ionex {
1294
1938
  * a `RangeError` on non-finite input and an `Error` on out-of-range input.
1295
1939
  */
1296
1940
  slantDelay(lat_deg: number, lon_deg: number, azimuth_deg: number, elevation_deg: number, epoch_j2000_s: number, frequency_hz: number): number;
1941
+ /**
1942
+ * Serialize to standard IONEX text. Deterministic: the same product always
1943
+ * produces byte-identical text, and re-parsing the output yields an equal
1944
+ * product (the canonical node axes, geometry, exponent, map epochs, and
1945
+ * every TEC/RMS value).
1946
+ */
1947
+ toIonexString(): string;
1297
1948
  /**
1298
1949
  * Mean Earth radius used by the geometry, kilometres.
1299
1950
  */
@@ -1430,6 +2081,19 @@ export class JulianDate {
1430
2081
  private constructor();
1431
2082
  free(): void;
1432
2083
  [Symbol.dispose](): void;
2084
+ /**
2085
+ * Build the no-leap civil UTC two-part Julian date for calendar fields.
2086
+ *
2087
+ * Delegates to `sidereon_core::astro::time::model::Instant::from_utc_civil`:
2088
+ * `(year, month, day, hour, minute, second)` are marshalled through the
2089
+ * engine's `split_julian_date`, tagged UTC, with no leap second applied
2090
+ * (the civil convention the ionosphere / troposphere dispatchers consume).
2091
+ * This is distinct from the leap-aware `Instant`, whose TT/UT1/TDB scales
2092
+ * run the full UTC conversion. `second` may be fractional. Throws a
2093
+ * `RangeError` on an out-of-day field whose residual leaves the one-day
2094
+ * fraction window.
2095
+ */
2096
+ static fromUtcCivil(year: number, month: number, day: number, hour?: number | null, minute?: number | null, second?: number | null): JulianDate;
1433
2097
  /**
1434
2098
  * Residual day fraction relative to `whole`.
1435
2099
  */
@@ -1487,6 +2151,23 @@ export class KlobucharAlphaBetaJs {
1487
2151
  readonly beta: Float64Array;
1488
2152
  }
1489
2153
 
2154
+ /**
2155
+ * The two transfer velocity vectors of a Lambert solution.
2156
+ */
2157
+ export class LambertTransfer {
2158
+ private constructor();
2159
+ free(): void;
2160
+ [Symbol.dispose](): void;
2161
+ /**
2162
+ * Transfer velocity at `r2` (arrival) `[vx, vy, vz]`, km/s.
2163
+ */
2164
+ readonly arrivalVelocityKmS: Float64Array;
2165
+ /**
2166
+ * Transfer velocity at `r1` (departure) `[vx, vy, vz]`, km/s.
2167
+ */
2168
+ readonly departureVelocityKmS: Float64Array;
2169
+ }
2170
+
1490
2171
  /**
1491
2172
  * Provenance and coverage of the embedded IERS leap-second (TAI-UTC) table.
1492
2173
  */
@@ -1550,100 +2231,302 @@ export class LinkBudget {
1550
2231
  }
1551
2232
 
1552
2233
  /**
1553
- * Topocentric look angles from a batched arc, each a `Float64Array` of length
1554
- * `epochCount`.
2234
+ * Decoded LNAV clock and ephemeris parameters (engineering units). Integer
2235
+ * fields are recovered exactly; scaled fields are the transmitted integer times
2236
+ * the IS-GPS-200 LSB. `l2_p_data_flag` is encode-only and not recovered.
1555
2237
  */
1556
- export class LookAngles {
2238
+ export class LnavDecoded {
1557
2239
  private constructor();
1558
2240
  free(): void;
1559
2241
  [Symbol.dispose](): void;
1560
2242
  /**
1561
- * Azimuth, degrees clockwise from north.
2243
+ * Clock bias coefficient, seconds.
1562
2244
  */
1563
- readonly azimuthDeg: Float64Array;
2245
+ readonly af0: number;
1564
2246
  /**
1565
- * Elevation, degrees above the horizon.
2247
+ * Clock drift coefficient, seconds per second.
1566
2248
  */
1567
- readonly elevationDeg: Float64Array;
2249
+ readonly af1: number;
1568
2250
  /**
1569
- * Number of epochs evaluated.
2251
+ * Clock drift-rate coefficient, seconds per second squared.
1570
2252
  */
1571
- readonly epochCount: number;
2253
+ readonly af2: number;
1572
2254
  /**
1573
- * Slant range, kilometres.
2255
+ * Age of data offset.
1574
2256
  */
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;
2257
+ readonly aodo: number;
1585
2258
  /**
1586
- * Hydrostatic mapping factor (includes the height correction).
2259
+ * Cosine harmonic correction to inclination, radians.
1587
2260
  */
1588
- readonly dry: number;
2261
+ readonly cic: number;
1589
2262
  /**
1590
- * Wet mapping factor.
2263
+ * Sine harmonic correction to inclination, radians.
1591
2264
  */
1592
- readonly wet: number;
1593
- }
1594
-
1595
- /**
1596
- * Which supported RINEX NAV message a broadcast record carries.
1597
- */
1598
- export enum NavMessage {
2265
+ readonly cis: number;
1599
2266
  /**
1600
- * GPS legacy LNAV.
2267
+ * Cosine harmonic correction to orbit radius, metres.
1601
2268
  */
1602
- GpsLnav = 0,
2269
+ readonly crc: number;
1603
2270
  /**
1604
- * Galileo I/NAV.
2271
+ * Sine harmonic correction to orbit radius, metres.
1605
2272
  */
1606
- GalileoInav = 1,
2273
+ readonly crs: number;
1607
2274
  /**
1608
- * Galileo F/NAV.
2275
+ * Cosine harmonic correction to argument of latitude, radians.
1609
2276
  */
1610
- GalileoFnav = 2,
2277
+ readonly cuc: number;
1611
2278
  /**
1612
- * BeiDou D1.
2279
+ * Sine harmonic correction to argument of latitude, radians.
1613
2280
  */
1614
- BeidouD1 = 3,
2281
+ readonly cus: number;
1615
2282
  /**
1616
- * BeiDou D2.
2283
+ * Mean motion difference, radians per second.
1617
2284
  */
1618
- BeidouD2 = 4,
1619
- }
1620
-
1621
- /**
1622
- * One RINEX OBS epoch. Observation values are read through `RinexObs` methods.
1623
- */
1624
- export class ObsEpoch {
1625
- private constructor();
1626
- free(): void;
1627
- [Symbol.dispose](): void;
2285
+ readonly deltaN: number;
1628
2286
  /**
1629
- * Civil epoch in the file time scale.
2287
+ * Eccentricity.
1630
2288
  */
1631
- readonly epoch: ObsEpochTime;
2289
+ readonly eccentricity: number;
1632
2290
  /**
1633
- * RINEX epoch flag. `0` is a normal observation epoch.
2291
+ * Fit-interval flag.
1634
2292
  */
1635
- readonly flag: number;
2293
+ readonly fitIntervalFlag: number;
1636
2294
  /**
1637
- * Number of satellites present at this epoch.
2295
+ * Inclination at reference time, radians.
1638
2296
  */
1639
- readonly satelliteCount: number;
2297
+ readonly i0: number;
1640
2298
  /**
1641
- * Satellite tokens present at this epoch.
2299
+ * Rate of inclination, radians per second.
1642
2300
  */
1643
- readonly satellites: string[];
1644
- }
1645
-
1646
- /**
2301
+ readonly idot: number;
2302
+ /**
2303
+ * Issue of data, clock.
2304
+ */
2305
+ readonly iodc: number;
2306
+ /**
2307
+ * Issue of data, ephemeris.
2308
+ */
2309
+ readonly iode: number;
2310
+ /**
2311
+ * L2 code indicator.
2312
+ */
2313
+ readonly l2Code: number;
2314
+ /**
2315
+ * Mean anomaly at reference time, radians.
2316
+ */
2317
+ readonly m0: number;
2318
+ /**
2319
+ * Argument of perigee, radians.
2320
+ */
2321
+ readonly omega: number;
2322
+ /**
2323
+ * Longitude of ascending node at weekly epoch, radians.
2324
+ */
2325
+ readonly omega0: number;
2326
+ /**
2327
+ * Rate of right ascension, radians per second.
2328
+ */
2329
+ readonly omegaDot: number;
2330
+ /**
2331
+ * Square root of the semi-major axis, sqrt(metres).
2332
+ */
2333
+ readonly sqrtA: number;
2334
+ /**
2335
+ * SV health bits.
2336
+ */
2337
+ readonly svHealth: number;
2338
+ /**
2339
+ * Group delay differential, seconds.
2340
+ */
2341
+ readonly tgd: number;
2342
+ /**
2343
+ * Clock reference time, seconds.
2344
+ */
2345
+ readonly toc: number;
2346
+ /**
2347
+ * Ephemeris reference time, seconds.
2348
+ */
2349
+ readonly toe: number;
2350
+ /**
2351
+ * User range accuracy index.
2352
+ */
2353
+ readonly uraIndex: number;
2354
+ /**
2355
+ * GPS week number.
2356
+ */
2357
+ readonly weekNumber: number;
2358
+ }
2359
+
2360
+ /**
2361
+ * The three 300-bit LNAV subframes produced by [`lnavEncode`].
2362
+ */
2363
+ export class LnavSubframes {
2364
+ private constructor();
2365
+ free(): void;
2366
+ [Symbol.dispose](): void;
2367
+ /**
2368
+ * Subframe 1 (clock/health) as a 300-element `Uint8Array` of `0`/`1` bits.
2369
+ */
2370
+ readonly subframe1: Uint8Array;
2371
+ /**
2372
+ * Subframe 2 (ephemeris part 1) as a 300-element `Uint8Array`.
2373
+ */
2374
+ readonly subframe2: Uint8Array;
2375
+ /**
2376
+ * Subframe 3 (ephemeris part 2) as a 300-element `Uint8Array`.
2377
+ */
2378
+ readonly subframe3: Uint8Array;
2379
+ }
2380
+
2381
+ /**
2382
+ * Topocentric look angles from a batched arc, each a `Float64Array` of length
2383
+ * `epochCount`.
2384
+ */
2385
+ export class LookAngles {
2386
+ private constructor();
2387
+ free(): void;
2388
+ [Symbol.dispose](): void;
2389
+ /**
2390
+ * Azimuth, degrees clockwise from north.
2391
+ */
2392
+ readonly azimuthDeg: Float64Array;
2393
+ /**
2394
+ * Elevation, degrees above the horizon.
2395
+ */
2396
+ readonly elevationDeg: Float64Array;
2397
+ /**
2398
+ * Number of epochs evaluated.
2399
+ */
2400
+ readonly epochCount: number;
2401
+ /**
2402
+ * Slant range, kilometres.
2403
+ */
2404
+ readonly rangeKm: Float64Array;
2405
+ }
2406
+
2407
+ /**
2408
+ * Niell hydrostatic and wet mapping factors, dimensionless.
2409
+ */
2410
+ export class MappingFactors {
2411
+ private constructor();
2412
+ free(): void;
2413
+ [Symbol.dispose](): void;
2414
+ /**
2415
+ * Hydrostatic mapping factor (includes the height correction).
2416
+ */
2417
+ readonly dry: number;
2418
+ /**
2419
+ * Wet mapping factor.
2420
+ */
2421
+ readonly wet: number;
2422
+ }
2423
+
2424
+ /**
2425
+ * One solved moving-baseline epoch.
2426
+ */
2427
+ export class MovingBaselineSolution {
2428
+ private constructor();
2429
+ free(): void;
2430
+ [Symbol.dispose](): void;
2431
+ /**
2432
+ * Base receiver ECEF position (metres) used for this epoch, `[x, y, z]`.
2433
+ */
2434
+ readonly basePositionM: Float64Array;
2435
+ /**
2436
+ * Euclidean baseline length, metres.
2437
+ */
2438
+ readonly baselineLengthM: number;
2439
+ /**
2440
+ * Baseline vector `rover - base` (metres) in ECEF, `[dx, dy, dz]`. The
2441
+ * integer-fixed baseline when `status` is `"Fixed"`, else the float baseline.
2442
+ */
2443
+ readonly baselineM: Float64Array;
2444
+ /**
2445
+ * The float baseline this epoch reduced through, `[dx, dy, dz]`, metres.
2446
+ */
2447
+ readonly floatBaselineM: Float64Array;
2448
+ /**
2449
+ * Whether the float baseline solve converged.
2450
+ */
2451
+ readonly floatConverged: boolean;
2452
+ /**
2453
+ * Integer ambiguity verdict for this epoch: `"Fixed"` or `"Float"`.
2454
+ */
2455
+ readonly status: string;
2456
+ }
2457
+
2458
+ /**
2459
+ * A named entry from a parsed TLE file: the satellite's name line (empty for a
2460
+ * bare 2-line set) paired with its initialized [`Tle`].
2461
+ */
2462
+ export class NamedTle {
2463
+ private constructor();
2464
+ free(): void;
2465
+ [Symbol.dispose](): void;
2466
+ /**
2467
+ * The satellite name from the preceding name line, with any CelesTrak `0 `
2468
+ * marker stripped. Empty string for a bare 2-line element set.
2469
+ */
2470
+ readonly name: string;
2471
+ /**
2472
+ * The initialized two-line element set. Call `.propagate()` /
2473
+ * `.lookAngles()` / `.findPasses()` on it directly.
2474
+ */
2475
+ readonly tle: Tle;
2476
+ }
2477
+
2478
+ /**
2479
+ * Which supported RINEX NAV message a broadcast record carries.
2480
+ */
2481
+ export enum NavMessage {
2482
+ /**
2483
+ * GPS legacy LNAV.
2484
+ */
2485
+ GpsLnav = 0,
2486
+ /**
2487
+ * Galileo I/NAV.
2488
+ */
2489
+ GalileoInav = 1,
2490
+ /**
2491
+ * Galileo F/NAV.
2492
+ */
2493
+ GalileoFnav = 2,
2494
+ /**
2495
+ * BeiDou D1.
2496
+ */
2497
+ BeidouD1 = 3,
2498
+ /**
2499
+ * BeiDou D2.
2500
+ */
2501
+ BeidouD2 = 4,
2502
+ }
2503
+
2504
+ /**
2505
+ * One RINEX OBS epoch. Observation values are read through `RinexObs` methods.
2506
+ */
2507
+ export class ObsEpoch {
2508
+ private constructor();
2509
+ free(): void;
2510
+ [Symbol.dispose](): void;
2511
+ /**
2512
+ * Civil epoch in the file time scale.
2513
+ */
2514
+ readonly epoch: ObsEpochTime;
2515
+ /**
2516
+ * RINEX epoch flag. `0` is a normal observation epoch.
2517
+ */
2518
+ readonly flag: number;
2519
+ /**
2520
+ * Number of satellites present at this epoch.
2521
+ */
2522
+ readonly satelliteCount: number;
2523
+ /**
2524
+ * Satellite tokens present at this epoch.
2525
+ */
2526
+ readonly satellites: string[];
2527
+ }
2528
+
2529
+ /**
1647
2530
  * Civil epoch from a RINEX observation file, in the file time scale.
1648
2531
  */
1649
2532
  export class ObsEpochTime {
@@ -1837,118 +2720,305 @@ export class ObservationValueSeries {
1837
2720
  }
1838
2721
 
1839
2722
  /**
1840
- * A canonical, format-agnostic CCSDS Orbit Mean-Elements Message.
2723
+ * A canonical, format-agnostic CCSDS Orbit Ephemeris Message parsed from KVN or
2724
+ * XML.
1841
2725
  */
1842
- export class Omm {
2726
+ export class Oem {
1843
2727
  free(): void;
1844
2728
  [Symbol.dispose](): void;
1845
2729
  /**
1846
- * Build an OMM. The eight leading arguments are required; `meta` carries the
1847
- * optional fields (`ccsdsOmmVers`, `creationDate`, ... `bstar`,
1848
- * `meanMotionDot`, `meanMotionDdot`).
1849
- */
1850
- constructor(epoch: OmmEpoch, mean_motion: number, eccentricity: number, inclination_deg: number, ra_of_asc_node_deg: number, arg_of_pericenter_deg: number, mean_anomaly_deg: number, norad_cat_id: number, meta: any);
1851
- /**
1852
- * Encode this OMM to CCSDS/CelesTrak JSON text.
2730
+ * Build an OEM from one or more segments. `meta` carries the optional header
2731
+ * fields (`ccsdsOemVers`, `creationDate`, `originator`).
1853
2732
  */
1854
- toJsonString(): string;
2733
+ constructor(segments: OemSegment[], meta: any);
1855
2734
  /**
1856
- * Encode this OMM to CCSDS OMM KVN text.
2735
+ * Encode this OEM to CCSDS OEM KVN text.
1857
2736
  */
1858
2737
  toKvnString(): string;
1859
2738
  /**
1860
- * Encode this OMM to CCSDS OMM XML text.
2739
+ * Encode this OEM to CCSDS OEM XML text.
1861
2740
  */
1862
2741
  toXmlString(): string;
1863
2742
  /**
1864
- * Argument of pericenter, degrees.
2743
+ * CCSDS OEM version string.
1865
2744
  */
1866
- readonly argOfPericenterDeg: number;
2745
+ readonly ccsdsOemVers: string;
1867
2746
  /**
1868
- * B* drag term.
2747
+ * Creation date.
1869
2748
  */
1870
- readonly bstar: number;
2749
+ readonly creationDate: string | undefined;
1871
2750
  /**
1872
- * CCSDS OMM version string.
2751
+ * Originator.
1873
2752
  */
1874
- readonly ccsdsOmmVers: string;
2753
+ readonly originator: string | undefined;
1875
2754
  /**
1876
- * Center name.
2755
+ * Number of segments.
1877
2756
  */
1878
- readonly centerName: string | undefined;
2757
+ readonly segmentCount: number;
1879
2758
  /**
1880
- * Classification type.
2759
+ * Metadata/data segments in message order.
1881
2760
  */
1882
- readonly classificationType: string;
2761
+ readonly segments: OemSegment[];
1883
2762
  /**
1884
- * Creation date.
2763
+ * Forgiving-parse count of ephemeris data lines skipped as malformed (KVN
2764
+ * only; 0 for a constructed or XML-parsed message).
1885
2765
  */
1886
- readonly creationDate: string | undefined;
2766
+ readonly skippedStates: number;
2767
+ }
2768
+
2769
+ /**
2770
+ * One OEM covariance block.
2771
+ */
2772
+ export class OemCovariance {
2773
+ free(): void;
2774
+ [Symbol.dispose](): void;
1887
2775
  /**
1888
- * Eccentricity.
2776
+ * Build an OEM covariance block. `matrix` is a length-36 row-major
2777
+ * `Float64Array` for the `[r, v]` state; it must be finite, symmetric, and
2778
+ * positive semidefinite. `covRefFrame` is the optional frame label.
1889
2779
  */
1890
- readonly eccentricity: number;
2780
+ constructor(epoch: string, matrix: Float64Array, cov_ref_frame?: string | null);
1891
2781
  /**
1892
- * Element set number.
2782
+ * Covariance reference-frame label, or `undefined`.
1893
2783
  */
1894
- readonly elementSetNo: number;
2784
+ readonly covRefFrame: string | undefined;
1895
2785
  /**
1896
- * SGP4 ephemeris type.
2786
+ * Epoch text.
1897
2787
  */
1898
- readonly ephemerisType: number;
2788
+ readonly epoch: string;
1899
2789
  /**
1900
- * The epoch.
2790
+ * The 6x6 state covariance as a length-36 row-major `Float64Array`.
1901
2791
  */
1902
- readonly epoch: OmmEpoch;
2792
+ readonly matrix: Float64Array;
2793
+ }
2794
+
2795
+ /**
2796
+ * OEM segment metadata: object identity, frame, time system, and span.
2797
+ */
2798
+ export class OemMetadata {
2799
+ free(): void;
2800
+ [Symbol.dispose](): void;
1903
2801
  /**
1904
- * Inclination, degrees.
2802
+ * Build OEM segment metadata. The seven leading arguments are required;
2803
+ * `meta` carries the optional fields (`useableStartTime`, `useableStopTime`,
2804
+ * `interpolation`, `interpolationDegree`).
1905
2805
  */
1906
- readonly inclinationDeg: number;
2806
+ constructor(object_name: string, object_id: string, center_name: string, ref_frame: string, time_system: string, start_time: string, stop_time: string, meta: any);
1907
2807
  /**
1908
- * Mean anomaly, degrees.
2808
+ * Center name.
1909
2809
  */
1910
- readonly meanAnomalyDeg: number;
2810
+ readonly centerName: string;
1911
2811
  /**
1912
- * Mean-element theory.
2812
+ * Interpolation method label, or `undefined`.
1913
2813
  */
1914
- readonly meanElementTheory: string | undefined;
2814
+ readonly interpolation: string | undefined;
1915
2815
  /**
1916
- * Mean motion, rev/day.
2816
+ * Interpolation polynomial degree, or `undefined`.
1917
2817
  */
1918
- readonly meanMotion: number;
2818
+ readonly interpolationDegree: number | undefined;
1919
2819
  /**
1920
- * Second derivative of mean motion.
2820
+ * Object id (COSPAR international designator).
1921
2821
  */
1922
- readonly meanMotionDdot: number;
2822
+ readonly objectId: string;
1923
2823
  /**
1924
- * First derivative of mean motion.
2824
+ * Object name.
1925
2825
  */
1926
- readonly meanMotionDot: number;
2826
+ readonly objectName: string;
1927
2827
  /**
1928
- * NORAD catalog number.
2828
+ * Reference frame.
1929
2829
  */
1930
- readonly noradCatId: number;
2830
+ readonly refFrame: string;
1931
2831
  /**
1932
- * Object id.
2832
+ * Segment start time text.
1933
2833
  */
1934
- readonly objectId: string | undefined;
2834
+ readonly startTime: string;
1935
2835
  /**
1936
- * Object name.
2836
+ * Segment stop time text.
1937
2837
  */
1938
- readonly objectName: string | undefined;
2838
+ readonly stopTime: string;
1939
2839
  /**
1940
- * Originator.
2840
+ * Time system.
1941
2841
  */
1942
- readonly originator: string | undefined;
2842
+ readonly timeSystem: string;
1943
2843
  /**
1944
- * Right ascension of the ascending node, degrees.
2844
+ * Useable start time text, or `undefined`.
1945
2845
  */
1946
- readonly raOfAscNodeDeg: number;
2846
+ readonly useableStartTime: string | undefined;
1947
2847
  /**
1948
- * Reference frame.
2848
+ * Useable stop time text, or `undefined`.
1949
2849
  */
1950
- readonly refFrame: string | undefined;
1951
- /**
2850
+ readonly useableStopTime: string | undefined;
2851
+ }
2852
+
2853
+ /**
2854
+ * One OEM metadata/data segment.
2855
+ */
2856
+ export class OemSegment {
2857
+ free(): void;
2858
+ [Symbol.dispose](): void;
2859
+ /**
2860
+ * Build an OEM segment from its metadata, state samples, and (possibly
2861
+ * empty) covariance blocks.
2862
+ */
2863
+ constructor(metadata: OemMetadata, states: OemState[], covariances: OemCovariance[]);
2864
+ /**
2865
+ * Covariance blocks in segment order.
2866
+ */
2867
+ readonly covariances: OemCovariance[];
2868
+ /**
2869
+ * Segment metadata.
2870
+ */
2871
+ readonly metadata: OemMetadata;
2872
+ /**
2873
+ * State samples in segment order.
2874
+ */
2875
+ readonly states: OemState[];
2876
+ }
2877
+
2878
+ /**
2879
+ * One OEM Cartesian state sample.
2880
+ */
2881
+ export class OemState {
2882
+ free(): void;
2883
+ [Symbol.dispose](): void;
2884
+ /**
2885
+ * Build an OEM state sample. `epoch` is carried as text; `positionKm` and
2886
+ * `velocityKmS` are length-3 `Float64Array`s. `accelerationKmS2` is an
2887
+ * optional length-3 `Float64Array` (pass `undefined` for a position/velocity
2888
+ * sample).
2889
+ */
2890
+ constructor(epoch: string, position_km: Float64Array, velocity_km_s: Float64Array, acceleration_km_s2?: Float64Array | null);
2891
+ /**
2892
+ * Acceleration vector, km/s^2, length-3 `Float64Array`, or `undefined`.
2893
+ */
2894
+ readonly accelerationKmS2: Float64Array | undefined;
2895
+ /**
2896
+ * Epoch text.
2897
+ */
2898
+ readonly epoch: string;
2899
+ /**
2900
+ * Position vector, kilometres, length-3 `Float64Array`.
2901
+ */
2902
+ readonly positionKm: Float64Array;
2903
+ /**
2904
+ * Velocity vector, km/s, length-3 `Float64Array`.
2905
+ */
2906
+ readonly velocityKmS: Float64Array;
2907
+ }
2908
+
2909
+ /**
2910
+ * A canonical, format-agnostic CCSDS Orbit Mean-Elements Message.
2911
+ */
2912
+ export class Omm {
2913
+ free(): void;
2914
+ [Symbol.dispose](): void;
2915
+ /**
2916
+ * Build an OMM. The eight leading arguments are required; `meta` carries the
2917
+ * optional fields (`ccsdsOmmVers`, `creationDate`, ... `bstar`,
2918
+ * `meanMotionDot`, `meanMotionDdot`).
2919
+ */
2920
+ constructor(epoch: OmmEpoch, mean_motion: number, eccentricity: number, inclination_deg: number, ra_of_asc_node_deg: number, arg_of_pericenter_deg: number, mean_anomaly_deg: number, norad_cat_id: number, meta: any);
2921
+ /**
2922
+ * Encode this OMM to CCSDS/CelesTrak JSON text.
2923
+ */
2924
+ toJsonString(): string;
2925
+ /**
2926
+ * Encode this OMM to CCSDS OMM KVN text.
2927
+ */
2928
+ toKvnString(): string;
2929
+ /**
2930
+ * Encode this OMM to CCSDS OMM XML text.
2931
+ */
2932
+ toXmlString(): string;
2933
+ /**
2934
+ * Argument of pericenter, degrees.
2935
+ */
2936
+ readonly argOfPericenterDeg: number;
2937
+ /**
2938
+ * B* drag term.
2939
+ */
2940
+ readonly bstar: number;
2941
+ /**
2942
+ * CCSDS OMM version string.
2943
+ */
2944
+ readonly ccsdsOmmVers: string;
2945
+ /**
2946
+ * Center name.
2947
+ */
2948
+ readonly centerName: string | undefined;
2949
+ /**
2950
+ * Classification type.
2951
+ */
2952
+ readonly classificationType: string;
2953
+ /**
2954
+ * Creation date.
2955
+ */
2956
+ readonly creationDate: string | undefined;
2957
+ /**
2958
+ * Eccentricity.
2959
+ */
2960
+ readonly eccentricity: number;
2961
+ /**
2962
+ * Element set number.
2963
+ */
2964
+ readonly elementSetNo: number;
2965
+ /**
2966
+ * SGP4 ephemeris type.
2967
+ */
2968
+ readonly ephemerisType: number;
2969
+ /**
2970
+ * The epoch.
2971
+ */
2972
+ readonly epoch: OmmEpoch;
2973
+ /**
2974
+ * Inclination, degrees.
2975
+ */
2976
+ readonly inclinationDeg: number;
2977
+ /**
2978
+ * Mean anomaly, degrees.
2979
+ */
2980
+ readonly meanAnomalyDeg: number;
2981
+ /**
2982
+ * Mean-element theory.
2983
+ */
2984
+ readonly meanElementTheory: string | undefined;
2985
+ /**
2986
+ * Mean motion, rev/day.
2987
+ */
2988
+ readonly meanMotion: number;
2989
+ /**
2990
+ * Second derivative of mean motion.
2991
+ */
2992
+ readonly meanMotionDdot: number;
2993
+ /**
2994
+ * First derivative of mean motion.
2995
+ */
2996
+ readonly meanMotionDot: number;
2997
+ /**
2998
+ * NORAD catalog number.
2999
+ */
3000
+ readonly noradCatId: number;
3001
+ /**
3002
+ * Object id.
3003
+ */
3004
+ readonly objectId: string | undefined;
3005
+ /**
3006
+ * Object name.
3007
+ */
3008
+ readonly objectName: string | undefined;
3009
+ /**
3010
+ * Originator.
3011
+ */
3012
+ readonly originator: string | undefined;
3013
+ /**
3014
+ * Right ascension of the ascending node, degrees.
3015
+ */
3016
+ readonly raOfAscNodeDeg: number;
3017
+ /**
3018
+ * Reference frame.
3019
+ */
3020
+ readonly refFrame: string | undefined;
3021
+ /**
1952
3022
  * Revolution number at epoch.
1953
3023
  */
1954
3024
  readonly revAtEpoch: bigint;
@@ -2003,6 +3073,359 @@ export class OmmEpoch {
2003
3073
  readonly year: number;
2004
3074
  }
2005
3075
 
3076
+ /**
3077
+ * A canonical, format-agnostic CCSDS Orbit Parameter Message parsed from KVN or
3078
+ * XML.
3079
+ */
3080
+ export class Opm {
3081
+ free(): void;
3082
+ [Symbol.dispose](): void;
3083
+ /**
3084
+ * Build an OPM from its blocks. `keplerian`, `spacecraft`, and `covariance`
3085
+ * are optional (pass `undefined`); `maneuvers` is an array (possibly empty).
3086
+ * `meta` carries the optional header fields (`ccsdsOpmVers`, `creationDate`,
3087
+ * `originator`).
3088
+ */
3089
+ constructor(metadata: OpmMetadata, state: OpmState, keplerian: OpmKeplerian | null | undefined, spacecraft: OpmSpacecraft | null | undefined, covariance: OpmCovariance | null | undefined, maneuvers: OpmManeuver[], meta: any);
3090
+ /**
3091
+ * Encode this OPM to CCSDS OPM KVN text.
3092
+ */
3093
+ toKvnString(): string;
3094
+ /**
3095
+ * Encode this OPM to CCSDS OPM XML text.
3096
+ */
3097
+ toXmlString(): string;
3098
+ /**
3099
+ * CCSDS OPM version string.
3100
+ */
3101
+ readonly ccsdsOpmVers: string;
3102
+ /**
3103
+ * Covariance block, or `undefined`.
3104
+ */
3105
+ readonly covariance: OpmCovariance | undefined;
3106
+ /**
3107
+ * Creation date.
3108
+ */
3109
+ readonly creationDate: string | undefined;
3110
+ /**
3111
+ * Keplerian-elements block, or `undefined`.
3112
+ */
3113
+ readonly keplerian: OpmKeplerian | undefined;
3114
+ /**
3115
+ * Maneuver blocks in message order.
3116
+ */
3117
+ readonly maneuvers: OpmManeuver[];
3118
+ /**
3119
+ * Metadata block.
3120
+ */
3121
+ readonly metadata: OpmMetadata;
3122
+ /**
3123
+ * Originator.
3124
+ */
3125
+ readonly originator: string | undefined;
3126
+ /**
3127
+ * Spacecraft-parameters block, or `undefined`.
3128
+ */
3129
+ readonly spacecraft: OpmSpacecraft | undefined;
3130
+ /**
3131
+ * Cartesian state vector.
3132
+ */
3133
+ readonly state: OpmState;
3134
+ }
3135
+
3136
+ /**
3137
+ * Optional OPM 6x6 state covariance.
3138
+ */
3139
+ export class OpmCovariance {
3140
+ free(): void;
3141
+ [Symbol.dispose](): void;
3142
+ /**
3143
+ * Build the covariance block. `matrix` is a length-36 row-major
3144
+ * `Float64Array` for the `[r, v]` state; it must be finite, symmetric, and
3145
+ * positive semidefinite. `covRefFrame` is the optional frame label.
3146
+ */
3147
+ constructor(matrix: Float64Array, cov_ref_frame?: string | null);
3148
+ /**
3149
+ * Covariance reference-frame label, or `undefined`.
3150
+ */
3151
+ readonly covRefFrame: string | undefined;
3152
+ /**
3153
+ * The 6x6 state covariance as a length-36 row-major `Float64Array`.
3154
+ */
3155
+ readonly matrix: Float64Array;
3156
+ }
3157
+
3158
+ /**
3159
+ * Optional OPM Keplerian-elements block.
3160
+ */
3161
+ export class OpmKeplerian {
3162
+ free(): void;
3163
+ [Symbol.dispose](): void;
3164
+ /**
3165
+ * Build the Keplerian block. Supply exactly one of `trueAnomalyDeg` or
3166
+ * `meanAnomalyDeg`; throws a `TypeError` if neither or both are given.
3167
+ */
3168
+ 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);
3169
+ /**
3170
+ * Argument of pericenter, degrees.
3171
+ */
3172
+ readonly argOfPericenterDeg: number;
3173
+ /**
3174
+ * Eccentricity.
3175
+ */
3176
+ readonly eccentricity: number;
3177
+ /**
3178
+ * Gravitational parameter, km^3/s^2.
3179
+ */
3180
+ readonly gmKm3S2: number;
3181
+ /**
3182
+ * Inclination, degrees.
3183
+ */
3184
+ readonly inclinationDeg: number;
3185
+ /**
3186
+ * Mean anomaly, degrees, or `undefined` when a true anomaly was supplied.
3187
+ */
3188
+ readonly meanAnomalyDeg: number | undefined;
3189
+ /**
3190
+ * Right ascension of the ascending node, degrees.
3191
+ */
3192
+ readonly raOfAscNodeDeg: number;
3193
+ /**
3194
+ * Semi-major axis, kilometres.
3195
+ */
3196
+ readonly semiMajorAxisKm: number;
3197
+ /**
3198
+ * True anomaly, degrees, or `undefined` when a mean anomaly was supplied.
3199
+ */
3200
+ readonly trueAnomalyDeg: number | undefined;
3201
+ }
3202
+
3203
+ /**
3204
+ * One OPM maneuver block. Every field is mandatory in CCSDS 502.0-B when a
3205
+ * maneuver is present.
3206
+ */
3207
+ export class OpmManeuver {
3208
+ free(): void;
3209
+ [Symbol.dispose](): void;
3210
+ /**
3211
+ * Build a maneuver block. `dvKmS` is a length-3 `Float64Array` of the
3212
+ * delta-v in km/s.
3213
+ */
3214
+ constructor(epoch_ignition: string, duration_s: number, delta_mass_kg: number, ref_frame: string, dv_km_s: Float64Array);
3215
+ /**
3216
+ * Change in mass, kilograms.
3217
+ */
3218
+ readonly deltaMassKg: number;
3219
+ /**
3220
+ * Maneuver duration, seconds.
3221
+ */
3222
+ readonly durationS: number;
3223
+ /**
3224
+ * Delta-v vector, km/s, length-3 `Float64Array`.
3225
+ */
3226
+ readonly dvKmS: Float64Array;
3227
+ /**
3228
+ * Ignition epoch text.
3229
+ */
3230
+ readonly epochIgnition: string;
3231
+ /**
3232
+ * Maneuver reference frame.
3233
+ */
3234
+ readonly refFrame: string;
3235
+ }
3236
+
3237
+ /**
3238
+ * OPM metadata block: object identity, center, reference frame, and time system.
3239
+ */
3240
+ export class OpmMetadata {
3241
+ free(): void;
3242
+ [Symbol.dispose](): void;
3243
+ /**
3244
+ * Build the OPM metadata block. Every field is mandatory in CCSDS 502.0-B.
3245
+ */
3246
+ constructor(object_name: string, object_id: string, center_name: string, ref_frame: string, time_system: string);
3247
+ /**
3248
+ * Center name.
3249
+ */
3250
+ readonly centerName: string;
3251
+ /**
3252
+ * Object id (COSPAR international designator).
3253
+ */
3254
+ readonly objectId: string;
3255
+ /**
3256
+ * Object name.
3257
+ */
3258
+ readonly objectName: string;
3259
+ /**
3260
+ * Reference frame.
3261
+ */
3262
+ readonly refFrame: string;
3263
+ /**
3264
+ * Time system.
3265
+ */
3266
+ readonly timeSystem: string;
3267
+ }
3268
+
3269
+ /**
3270
+ * Optional OPM spacecraft-parameters block. Every sub-field is individually
3271
+ * optional.
3272
+ */
3273
+ export class OpmSpacecraft {
3274
+ free(): void;
3275
+ [Symbol.dispose](): void;
3276
+ /**
3277
+ * Build the spacecraft-parameters block. Pass `undefined` for absent fields.
3278
+ */
3279
+ 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);
3280
+ /**
3281
+ * Drag area, square metres.
3282
+ */
3283
+ readonly dragAreaM2: number | undefined;
3284
+ /**
3285
+ * Drag coefficient.
3286
+ */
3287
+ readonly dragCoeff: number | undefined;
3288
+ /**
3289
+ * Mass, kilograms.
3290
+ */
3291
+ readonly massKg: number | undefined;
3292
+ /**
3293
+ * Solar-radiation-pressure area, square metres.
3294
+ */
3295
+ readonly solarRadAreaM2: number | undefined;
3296
+ /**
3297
+ * Solar-radiation-pressure coefficient.
3298
+ */
3299
+ readonly solarRadCoeff: number | undefined;
3300
+ }
3301
+
3302
+ /**
3303
+ * OPM Cartesian state vector at the message epoch.
3304
+ */
3305
+ export class OpmState {
3306
+ free(): void;
3307
+ [Symbol.dispose](): void;
3308
+ /**
3309
+ * Build the OPM state. `epoch` is carried as text; `positionKm` and
3310
+ * `velocityKmS` are length-3 `Float64Array`s in kilometres and km/s.
3311
+ */
3312
+ constructor(epoch: string, position_km: Float64Array, velocity_km_s: Float64Array);
3313
+ /**
3314
+ * Epoch text.
3315
+ */
3316
+ readonly epoch: string;
3317
+ /**
3318
+ * Position vector, kilometres, length-3 `Float64Array`.
3319
+ */
3320
+ readonly positionKm: Float64Array;
3321
+ /**
3322
+ * Velocity vector, km/s, length-3 `Float64Array`.
3323
+ */
3324
+ readonly velocityKmS: Float64Array;
3325
+ }
3326
+
3327
+ /**
3328
+ * The result of [`parseTleFile`]: the satellites that parsed, plus a count of
3329
+ * complete records that were skipped because SGP4 initialization failed.
3330
+ */
3331
+ export class ParsedTleFile {
3332
+ private constructor();
3333
+ free(): void;
3334
+ [Symbol.dispose](): void;
3335
+ /**
3336
+ * Number of satellites that parsed (length of `satellites`).
3337
+ */
3338
+ readonly count: number;
3339
+ /**
3340
+ * The successfully parsed satellites, in file order, each as a `{ name, tle }`.
3341
+ */
3342
+ readonly satellites: NamedTle[];
3343
+ /**
3344
+ * How many complete `(line 1, line 2)` records were found but skipped
3345
+ * because their element set failed SGP4 initialization.
3346
+ */
3347
+ readonly skipped: number;
3348
+ }
3349
+
3350
+ /**
3351
+ * A long span represented by contiguous independently-fitted reduced-orbit
3352
+ * segments. Carries the fitted segments and the time scale they were fitted in;
3353
+ * evaluate and drift queries reuse that scale.
3354
+ */
3355
+ export class PiecewiseOrbit {
3356
+ private constructor();
3357
+ free(): void;
3358
+ [Symbol.dispose](): void;
3359
+ /**
3360
+ * Evaluate the piecewise model against `truth` ECEF samples, flagging the
3361
+ * first epoch whose error exceeds `thresholdM`. Truth samples outside the
3362
+ * model span are skipped. Delegates to
3363
+ * `sidereon_core::orbit::piecewise_drift`.
3364
+ */
3365
+ drift(truth: any, threshold_m: number): ReducedOrbitDrift;
3366
+ /**
3367
+ * Sample an SP3 product and evaluate this piecewise model against those
3368
+ * positions. Delegates to
3369
+ * `sidereon_core::orbit::drift_piecewise_reduced_orbit_source`.
3370
+ */
3371
+ driftSp3(sp3: Sp3, satellite: string, options: any): ReducedOrbitDrift;
3372
+ /**
3373
+ * Sample a TLE/SGP4 source in UTC and evaluate this piecewise model against
3374
+ * those positions. Delegates to
3375
+ * `sidereon_core::orbit::drift_piecewise_reduced_orbit_source`.
3376
+ */
3377
+ driftTle(tle: Tle, options: any): ReducedOrbitDrift;
3378
+ /**
3379
+ * Evaluate the piecewise model position at `query` in `frame` (`"ecef"` or
3380
+ * `"gcrs"`). Delegates to `sidereon_core::orbit::piecewise_position`.
3381
+ */
3382
+ position(query: any, frame: string): Float64Array;
3383
+ /**
3384
+ * Evaluate the piecewise model position and velocity at `query` in `frame`.
3385
+ * Delegates to `sidereon_core::orbit::piecewise_position_velocity`.
3386
+ */
3387
+ positionVelocity(query: any, frame: string): ReducedOrbitState;
3388
+ /**
3389
+ * Zero-based index of the segment covering `query`. Delegates to
3390
+ * `sidereon_core::orbit::select_piecewise_segment`. Throws an `Error` when
3391
+ * the epoch is outside coverage.
3392
+ */
3393
+ segmentIndexAt(query: any): number;
3394
+ /**
3395
+ * Model label, `"circular_secular"` or `"eccentric_secular"`.
3396
+ */
3397
+ readonly model: string;
3398
+ /**
3399
+ * Number of contiguous fitted segments.
3400
+ */
3401
+ readonly segmentCount: number;
3402
+ /**
3403
+ * Rounded segment length used to tile the requested window, seconds.
3404
+ */
3405
+ readonly segmentSeconds: bigint;
3406
+ }
3407
+
3408
+ /**
3409
+ * Source-backed piecewise reduced-orbit fit result.
3410
+ */
3411
+ export class PiecewiseOrbitSourceFit {
3412
+ private constructor();
3413
+ free(): void;
3414
+ [Symbol.dispose](): void;
3415
+ /**
3416
+ * The fitted piecewise reduced-orbit model.
3417
+ */
3418
+ readonly orbit: PiecewiseOrbit;
3419
+ /**
3420
+ * Number of samples requested from the source.
3421
+ */
3422
+ readonly requestedSamples: number;
3423
+ /**
3424
+ * Number of source samples used by all fitted segments.
3425
+ */
3426
+ readonly usedSamples: number;
3427
+ }
3428
+
2006
3429
  /**
2007
3430
  * Static integer-fixed PPP solution.
2008
3431
  */
@@ -2077,6 +3500,60 @@ export class PppFloatSolution {
2077
3500
  readonly ztdResidualM: number | undefined;
2078
3501
  }
2079
3502
 
3503
+ /**
3504
+ * Predicted GNSS observables for one satellite at one receive epoch. Every
3505
+ * field is computed by `sidereon_core::observables::predict`.
3506
+ */
3507
+ export class PredictedObservables {
3508
+ private constructor();
3509
+ free(): void;
3510
+ [Symbol.dispose](): void;
3511
+ /**
3512
+ * Topocentric azimuth in `[0, 360)`, degrees.
3513
+ */
3514
+ readonly azimuthDeg: number;
3515
+ /**
3516
+ * Doppler shift at the option carrier frequency, hertz.
3517
+ */
3518
+ readonly dopplerHz: number;
3519
+ /**
3520
+ * Topocentric elevation, degrees.
3521
+ */
3522
+ readonly elevationDeg: number;
3523
+ /**
3524
+ * Geometric range after optional Sagnac rotation, metres.
3525
+ */
3526
+ readonly geometricRangeM: number;
3527
+ /**
3528
+ * Receiver-to-satellite line-of-sight unit vector in ECEF, `[x, y, z]`.
3529
+ */
3530
+ readonly losUnit: Float64Array;
3531
+ /**
3532
+ * Range-rate line-of-sight projection, metres per second.
3533
+ */
3534
+ readonly rangeRateMS: number;
3535
+ /**
3536
+ * Satellite clock offset at transmit time, seconds, or `undefined`.
3537
+ */
3538
+ readonly satClockS: number | undefined;
3539
+ /**
3540
+ * Sagnac-rotated satellite ECEF position, metres, `[x, y, z]`.
3541
+ */
3542
+ readonly satPosEcefM: Float64Array;
3543
+ /**
3544
+ * Sagnac-rotated satellite ECEF velocity, metres per second, `[vx, vy, vz]`.
3545
+ */
3546
+ readonly satVelocityMS: Float64Array;
3547
+ /**
3548
+ * Transmit-time offset from receive time, rounded to microseconds.
3549
+ */
3550
+ readonly transmitOffsetUs: bigint;
3551
+ /**
3552
+ * Transmit time as seconds since J2000.
3553
+ */
3554
+ readonly transmitTimeJ2000S: number;
3555
+ }
3556
+
2080
3557
  /**
2081
3558
  * Reason a satellite was dropped from paired pseudorange combination.
2082
3559
  */
@@ -2100,57 +3577,187 @@ export enum PseudorangeDropReason {
2100
3577
  }
2101
3578
 
2102
3579
  /**
2103
- * Flattened pseudorange rows from one RINEX OBS epoch. `satellites` is
2104
- * row-aligned with `rangesM`; ranges are metres.
3580
+ * Flattened pseudorange rows from one RINEX OBS epoch. `satellites` is
3581
+ * row-aligned with `rangesM`; ranges are metres.
3582
+ */
3583
+ export class PseudorangeSeries {
3584
+ private constructor();
3585
+ free(): void;
3586
+ [Symbol.dispose](): void;
3587
+ /**
3588
+ * Number of rows.
3589
+ */
3590
+ readonly length: number;
3591
+ /**
3592
+ * Pseudorange values, metres, as a `Float64Array`.
3593
+ */
3594
+ readonly rangesM: Float64Array;
3595
+ /**
3596
+ * Satellite tokens, row-aligned with `rangesM`.
3597
+ */
3598
+ readonly satellites: string[];
3599
+ }
3600
+
3601
+ /**
3602
+ * RAIM weighting mode: either unit weights or per-satellite inverse-variance
3603
+ * weights (missing satellites default to unit weight).
3604
+ */
3605
+ export class RaimWeights {
3606
+ private constructor();
3607
+ free(): void;
3608
+ [Symbol.dispose](): void;
3609
+ /**
3610
+ * Per-satellite inverse-variance weights. `weights` must be positive and
3611
+ * finite and the same length as `satelliteIds`. Throws a `TypeError` on a
3612
+ * length mismatch and a `RangeError` on a non-positive weight.
3613
+ */
3614
+ static bySatellite(satellite_ids: string[], weights: Float64Array): RaimWeights;
3615
+ /**
3616
+ * Unit weights, equivalent to sigma = 1 m for every satellite.
3617
+ */
3618
+ static unit(): RaimWeights;
3619
+ /**
3620
+ * True when all satellites use unit weight.
3621
+ */
3622
+ readonly isUnit: boolean;
3623
+ /**
3624
+ * Satellite tokens for per-satellite weights, sorted by token.
3625
+ */
3626
+ readonly satelliteIds: string[];
3627
+ /**
3628
+ * Inverse-variance weights as a `Float64Array`, sorted by satellite token.
3629
+ */
3630
+ readonly weights: Float64Array;
3631
+ }
3632
+
3633
+ /**
3634
+ * A fitted compact reduced-orbit model. Carries the fitted elements and the
3635
+ * time scale they were fitted in; evaluate and drift queries reuse that scale.
3636
+ */
3637
+ export class ReducedOrbit {
3638
+ private constructor();
3639
+ free(): void;
3640
+ [Symbol.dispose](): void;
3641
+ /**
3642
+ * Evaluate the model against `truth` ECEF samples, flagging the first epoch
3643
+ * whose error exceeds `thresholdM`. Delegates to
3644
+ * `sidereon_core::orbit::drift`.
3645
+ */
3646
+ drift(truth: any, threshold_m: number): ReducedOrbitDrift;
3647
+ /**
3648
+ * Sample an SP3 product and evaluate this model against those positions.
3649
+ * Delegates to `sidereon_core::orbit::drift_reduced_orbit_source`.
3650
+ */
3651
+ driftSp3(sp3: Sp3, satellite: string, options: any): ReducedOrbitDrift;
3652
+ /**
3653
+ * Sample a TLE/SGP4 source in UTC and evaluate this model against those
3654
+ * positions. Delegates to
3655
+ * `sidereon_core::orbit::drift_reduced_orbit_source`.
3656
+ */
3657
+ driftTle(tle: Tle, options: any): ReducedOrbitDrift;
3658
+ /**
3659
+ * Evaluate the model position at `query` in `frame` (`"ecef"` or
3660
+ * `"gcrs"`). Delegates to `sidereon_core::orbit::position`.
3661
+ */
3662
+ position(query: any, frame: string): Float64Array;
3663
+ /**
3664
+ * Evaluate the model position and velocity at `query` in `frame`.
3665
+ * Delegates to `sidereon_core::orbit::position_velocity`.
3666
+ */
3667
+ positionVelocity(query: any, frame: string): ReducedOrbitState;
3668
+ /**
3669
+ * Fitted mean elements as a `Float64Array`:
3670
+ * `[a_m, e, i, raan, raanRate, raanRateJ2, argLat, n]` for the circular
3671
+ * model, with `[h, k, argPerigee]` appended for the eccentric model.
3672
+ */
3673
+ readonly elements: Float64Array;
3674
+ /**
3675
+ * Fit residual maximum over the samples, metres.
3676
+ */
3677
+ readonly maxM: number;
3678
+ /**
3679
+ * Model label, `"circular_secular"` or `"eccentric_secular"`.
3680
+ */
3681
+ readonly model: string;
3682
+ /**
3683
+ * Number of samples used in the fit.
3684
+ */
3685
+ readonly nSamples: number;
3686
+ /**
3687
+ * Fit residual RMS over the samples, metres.
3688
+ */
3689
+ readonly rmsM: number;
3690
+ }
3691
+
3692
+ /**
3693
+ * Model-vs-truth drift report from `drift`.
3694
+ */
3695
+ export class ReducedOrbitDrift {
3696
+ private constructor();
3697
+ free(): void;
3698
+ [Symbol.dispose](): void;
3699
+ /**
3700
+ * Per-epoch position error magnitudes, metres, in input order.
3701
+ */
3702
+ readonly errorsM: Float64Array;
3703
+ /**
3704
+ * Maximum error over the horizon, metres.
3705
+ */
3706
+ readonly maxM: number;
3707
+ /**
3708
+ * Number of samples requested from the source or supplied by the caller.
3709
+ */
3710
+ readonly requestedSamples: number;
3711
+ /**
3712
+ * Root-mean-square error over the horizon, metres.
3713
+ */
3714
+ readonly rmsM: number;
3715
+ /**
3716
+ * Index of the first epoch whose error exceeds the threshold, or `-1`.
3717
+ */
3718
+ readonly thresholdIndex: bigint;
3719
+ /**
3720
+ * Number of samples evaluated in the drift report.
3721
+ */
3722
+ readonly usedSamples: number;
3723
+ }
3724
+
3725
+ /**
3726
+ * Source-backed reduced-orbit fit result.
2105
3727
  */
2106
- export class PseudorangeSeries {
3728
+ export class ReducedOrbitSourceFit {
2107
3729
  private constructor();
2108
3730
  free(): void;
2109
3731
  [Symbol.dispose](): void;
2110
3732
  /**
2111
- * Number of rows.
3733
+ * The fitted reduced-orbit model.
2112
3734
  */
2113
- readonly length: number;
3735
+ readonly orbit: ReducedOrbit;
2114
3736
  /**
2115
- * Pseudorange values, metres, as a `Float64Array`.
3737
+ * Number of samples requested from the source.
2116
3738
  */
2117
- readonly rangesM: Float64Array;
3739
+ readonly requestedSamples: number;
2118
3740
  /**
2119
- * Satellite tokens, row-aligned with `rangesM`.
3741
+ * Number of source samples used by the fit.
2120
3742
  */
2121
- readonly satellites: string[];
3743
+ readonly usedSamples: number;
2122
3744
  }
2123
3745
 
2124
3746
  /**
2125
- * RAIM weighting mode: either unit weights or per-satellite inverse-variance
2126
- * weights (missing satellites default to unit weight).
3747
+ * Receiver model position and velocity from `positionVelocity`.
2127
3748
  */
2128
- export class RaimWeights {
3749
+ export class ReducedOrbitState {
2129
3750
  private constructor();
2130
3751
  free(): void;
2131
3752
  [Symbol.dispose](): void;
2132
3753
  /**
2133
- * Per-satellite inverse-variance weights. `weights` must be positive and
2134
- * finite and the same length as `satelliteIds`. Throws a `TypeError` on a
2135
- * length mismatch and a `RangeError` on a non-positive weight.
2136
- */
2137
- static bySatellite(satellite_ids: string[], weights: Float64Array): RaimWeights;
2138
- /**
2139
- * Unit weights, equivalent to sigma = 1 m for every satellite.
2140
- */
2141
- static unit(): RaimWeights;
2142
- /**
2143
- * True when all satellites use unit weight.
2144
- */
2145
- readonly isUnit: boolean;
2146
- /**
2147
- * Satellite tokens for per-satellite weights, sorted by token.
3754
+ * Model position `[x, y, z]`, metres.
2148
3755
  */
2149
- readonly satelliteIds: string[];
3756
+ readonly positionM: Float64Array;
2150
3757
  /**
2151
- * Inverse-variance weights as a `Float64Array`, sorted by satellite token.
3758
+ * Model velocity `[vx, vy, vz]`, metres per second.
2152
3759
  */
2153
- readonly weights: Float64Array;
3760
+ readonly velocityMS: Float64Array;
2154
3761
  }
2155
3762
 
2156
3763
  /**
@@ -2174,6 +3781,12 @@ export class RinexClock {
2174
3781
  * One satellite's clock series, or `undefined` if the satellite is absent.
2175
3782
  */
2176
3783
  seriesFor(satellite_id: string): ClockSeries | undefined;
3784
+ /**
3785
+ * Serialize to standard RINEX clock text. Deterministic: the same product
3786
+ * always produces byte-identical text, and re-parsing the output reproduces
3787
+ * the same time scale and per-satellite bias series.
3788
+ */
3789
+ toRinexString(): string;
2177
3790
  /**
2178
3791
  * Total number of parsed satellite clock samples.
2179
3792
  */
@@ -2219,6 +3832,12 @@ export class RinexObs {
2219
3832
  * Extract single-frequency pseudoranges for one epoch.
2220
3833
  */
2221
3834
  pseudoranges(epoch_index: number, policy?: SignalPolicy | null): PseudorangeSeries;
3835
+ /**
3836
+ * Serialize to standard RINEX 3 observation text. Deterministic: the same
3837
+ * product always produces byte-identical text, and re-parsing the output
3838
+ * reproduces the same header and epochs.
3839
+ */
3840
+ toRinexString(): string;
2222
3841
  /**
2223
3842
  * Number of parsed epoch records.
2224
3843
  */
@@ -2456,6 +4075,21 @@ export class Sp3 {
2456
4075
  private constructor();
2457
4076
  free(): void;
2458
4077
  [Symbol.dispose](): void;
4078
+ /**
4079
+ * Return a copy of `other` with its clocks shifted onto this product's
4080
+ * clock datum. Epochs without an offset estimate are left unchanged.
4081
+ * Delegates to `sidereon_core::ephemeris::align_clock_reference`.
4082
+ */
4083
+ alignClockReference(other: Sp3, min_common?: number | null): Sp3;
4084
+ /**
4085
+ * Estimate `other`'s per-epoch common clock offset relative to this product.
4086
+ *
4087
+ * The result is one row per matched epoch with enough common clocked
4088
+ * satellites. Subtract `offsetS` from `other` clocks to put them on this
4089
+ * product's clock datum. Delegates to
4090
+ * `sidereon_core::ephemeris::clock_reference_offset`.
4091
+ */
4092
+ clockReferenceOffset(other: Sp3, min_common?: number | null): Sp3ClockReferenceOffset[];
2459
4093
  /**
2460
4094
  * Compute DGNSS pseudorange corrections from a surveyed base station.
2461
4095
  *
@@ -2502,6 +4136,16 @@ export class Sp3 {
2502
4136
  * a `TypeError` for malformed input and an `Error` if the solve fails.
2503
4137
  */
2504
4138
  solveSpp(request: any): SppSolution;
4139
+ /**
4140
+ * Solve a batch of independent SPP epochs against this ephemeris in one call.
4141
+ *
4142
+ * `epochs` is an array of SPP request objects (the `SppRequest` shape) and
4143
+ * `options` the shared `{ withGeodetic?, maxPdop?, coarseSearchSeeds? }`
4144
+ * applied to every epoch. Returns an `SppBatchSolution` whose per-epoch
4145
+ * results are index-aligned to `epochs`; each epoch independently converged
4146
+ * or failed. Delegates to the serial reference batch kernel.
4147
+ */
4148
+ solveSppBatch(epochs: any, options: any): SppBatchSolution;
2505
4149
  /**
2506
4150
  * The exact parsed state of `satellite` at record `epochIndex` (no
2507
4151
  * interpolation). Throws a `RangeError` past the last epoch and a
@@ -2523,6 +4167,74 @@ export class Sp3 {
2523
4167
  readonly satellites: string[];
2524
4168
  }
2525
4169
 
4170
+ /**
4171
+ * Per-(epoch, satellite) agreement statistics for one accepted merged cell:
4172
+ * how tightly the consensus sources clustered about the combined value.
4173
+ */
4174
+ export class Sp3AgreementMetric {
4175
+ private constructor();
4176
+ free(): void;
4177
+ [Symbol.dispose](): void;
4178
+ /**
4179
+ * Largest absolute clock deviation from the combined clock, seconds;
4180
+ * `undefined` when the cell carries no clock.
4181
+ */
4182
+ readonly clockMaxS: number | undefined;
4183
+ /**
4184
+ * Number of sources in the accepted clock consensus (0 when the cell
4185
+ * carries no clock).
4186
+ */
4187
+ readonly clockMembers: number;
4188
+ /**
4189
+ * RMS of the consensus members' deviation from the combined clock, seconds;
4190
+ * `undefined` when the cell carries no clock.
4191
+ */
4192
+ readonly clockRmsS: number | undefined;
4193
+ /**
4194
+ * Cell epoch as seconds since J2000 in the product time scale.
4195
+ */
4196
+ readonly epochJ2000Seconds: number;
4197
+ /**
4198
+ * Largest 3D distance of any consensus member from the combined position,
4199
+ * metres.
4200
+ */
4201
+ readonly positionMaxM: number;
4202
+ /**
4203
+ * Number of sources in the accepted position consensus (>= 1).
4204
+ */
4205
+ readonly positionMembers: number;
4206
+ /**
4207
+ * RMS of the consensus members' 3D distance from the combined position,
4208
+ * metres (zero for a single-source cell).
4209
+ */
4210
+ readonly positionRmsM: number;
4211
+ /**
4212
+ * Satellite token, e.g. `"G01"`.
4213
+ */
4214
+ readonly satellite: string;
4215
+ }
4216
+
4217
+ /**
4218
+ * One epoch's common clock offset between two SP3 products.
4219
+ */
4220
+ export class Sp3ClockReferenceOffset {
4221
+ private constructor();
4222
+ free(): void;
4223
+ [Symbol.dispose](): void;
4224
+ /**
4225
+ * Matched epoch as seconds since J2000 in the product time scale.
4226
+ */
4227
+ readonly epochJ2000Seconds: number;
4228
+ /**
4229
+ * `other - reference` clock datum, seconds.
4230
+ */
4231
+ readonly offsetS: number;
4232
+ /**
4233
+ * Number of satellites used in the median offset estimate.
4234
+ */
4235
+ readonly satellites: number;
4236
+ }
4237
+
2526
4238
  /**
2527
4239
  * A batch of interpolated SP3 states.
2528
4240
  */
@@ -2574,6 +4286,13 @@ export class Sp3MergeReport {
2574
4286
  private constructor();
2575
4287
  free(): void;
2576
4288
  [Symbol.dispose](): void;
4289
+ /**
4290
+ * Per-(epoch, satellite) agreement statistics for every accepted cell, in
4291
+ * output (epoch, then satellite) order — one entry per cell written to the
4292
+ * merged product.
4293
+ */
4294
+ readonly agreement: Sp3AgreementMetric[];
4295
+ readonly agreementCount: number;
2577
4296
  readonly positionOutlierCount: number;
2578
4297
  /**
2579
4298
  * Cells where an accepted consensus rejected source outliers.
@@ -2672,6 +4391,29 @@ export class Sp3State {
2672
4391
  readonly velocityMS: Float64Array | undefined;
2673
4392
  }
2674
4393
 
4394
+ /**
4395
+ * Canonical quiet-Sun space-weather indices for NRLMSISE-00, mirrored from the
4396
+ * core so a JS caller can pass moderate-activity defaults to [`atmosphereDensity`]
4397
+ * without re-deriving the magic numbers.
4398
+ */
4399
+ export class SpaceWeatherDefaults {
4400
+ private constructor();
4401
+ free(): void;
4402
+ [Symbol.dispose](): void;
4403
+ /**
4404
+ * Daily magnetic Ap index.
4405
+ */
4406
+ readonly ap: number;
4407
+ /**
4408
+ * Daily F10.7 solar radio flux.
4409
+ */
4410
+ readonly f107: number;
4411
+ /**
4412
+ * 81-day centred F10.7 average.
4413
+ */
4414
+ readonly f107a: number;
4415
+ }
4416
+
2675
4417
  /**
2676
4418
  * A parsed in-memory JPL/NAIF SPK kernel.
2677
4419
  *
@@ -2790,6 +4532,38 @@ export class SpkState {
2790
4532
  readonly velocityKmS: Float64Array | undefined;
2791
4533
  }
2792
4534
 
4535
+ /**
4536
+ * The per-epoch results of a batch SPP solve, index-aligned to the input epochs.
4537
+ * Each epoch independently either converged to a solution or failed; query an
4538
+ * epoch with [`SppBatchSolution.isOk`] / [`SppBatchSolution.solution`] /
4539
+ * [`SppBatchSolution.error`].
4540
+ */
4541
+ export class SppBatchSolution {
4542
+ private constructor();
4543
+ free(): void;
4544
+ [Symbol.dispose](): void;
4545
+ /**
4546
+ * The solve-failure message for epoch `index`, or `undefined` when the epoch
4547
+ * converged. Throws a `RangeError` for an out-of-range index.
4548
+ */
4549
+ error(index: number): string | undefined;
4550
+ /**
4551
+ * Whether epoch `index` converged to a solution. Throws a `RangeError` for
4552
+ * an out-of-range index.
4553
+ */
4554
+ isOk(index: number): boolean;
4555
+ /**
4556
+ * The solution for epoch `index`. Throws a `RangeError` for an out-of-range
4557
+ * index and an `Error` carrying that epoch's solve-failure message when the
4558
+ * epoch did not converge (check [`SppBatchSolution.isOk`] first).
4559
+ */
4560
+ solution(index: number): SppSolution;
4561
+ /**
4562
+ * Number of epochs in the batch (equals the input epoch count).
4563
+ */
4564
+ readonly count: number;
4565
+ }
4566
+
2793
4567
  /**
2794
4568
  * The result of an SPP solve.
2795
4569
  */
@@ -2797,6 +4571,12 @@ export class SppSolution {
2797
4571
  private constructor();
2798
4572
  free(): void;
2799
4573
  [Symbol.dispose](): void;
4574
+ /**
4575
+ * Dilution-of-precision scalars (GDOP/PDOP/HDOP/VDOP/TDOP) from the
4576
+ * converged geometry, or `undefined` when the converged geometry is
4577
+ * rank-deficient. The same `Dop` produced by [`gnssDop`](crate::gnss_dop).
4578
+ */
4579
+ readonly dop: Dop | undefined;
2800
4580
  /**
2801
4581
  * `[latRad, lonRad, heightM]` as a `Float64Array` if the solve was asked
2802
4582
  * for geodetic output, otherwise `undefined`.
@@ -2814,6 +4594,13 @@ export class SppSolution {
2814
4594
  * Receiver clock bias, seconds.
2815
4595
  */
2816
4596
  readonly rxClockS: number;
4597
+ /**
4598
+ * Per-constellation time (clock) DOP as a `{ system, tdop }[]`, one entry
4599
+ * per GNSS in the solve in ascending system order (the same order as the
4600
+ * per-system clocks). The first entry's `tdop` equals the reference clock's
4601
+ * `dop.tdop`. Empty when the converged geometry is rank-deficient.
4602
+ */
4603
+ readonly systemTdops: any;
2817
4604
  /**
2818
4605
  * Satellite tokens used in the accepted solution, ascending.
2819
4606
  */
@@ -2893,6 +4680,14 @@ export enum TimeScale {
2893
4680
  * BeiDou Time.
2894
4681
  */
2895
4682
  Bdt = 6,
4683
+ /**
4684
+ * GLONASS system time (UTC(SU)-based, leap-second carrying).
4685
+ */
4686
+ Glonasst = 7,
4687
+ /**
4688
+ * QZSS system time (steered to GPST).
4689
+ */
4690
+ Qzsst = 8,
2896
4691
  }
2897
4692
 
2898
4693
  /**
@@ -2908,6 +4703,14 @@ export class Tle {
2908
4703
  * an end at or before the start.
2909
4704
  */
2910
4705
  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[];
4706
+ /**
4707
+ * Sub-satellite (ground-track) WGS84 geodetic points over a `BigInt64Array`
4708
+ * of unix-microsecond epochs. For each epoch the satellite is propagated to
4709
+ * TEME and reduced TEME->GCRS->ECEF->geodetic by the engine's own transforms,
4710
+ * honoring this `Tle`'s opsmode. Throws an `Error` on propagation or frame
4711
+ * failure.
4712
+ */
4713
+ groundTrack(epochs_unix_us: BigInt64Array): GroundTrack;
2911
4714
  /**
2912
4715
  * Topocentric azimuth/elevation/range from `station` over a
2913
4716
  * `BigInt64Array` of unix-microsecond epochs. Throws an `Error` on failure.
@@ -3132,6 +4935,38 @@ export class VisibilitySeries {
3132
4935
  readonly visible: Uint8Array;
3133
4936
  }
3134
4937
 
4938
+ /**
4939
+ * One satellite visible above the elevation mask at a single instant, from
4940
+ * [`visibleFromSatellites`].
4941
+ */
4942
+ export class VisibleSatellite {
4943
+ private constructor();
4944
+ free(): void;
4945
+ [Symbol.dispose](): void;
4946
+ /**
4947
+ * Topocentric azimuth, degrees clockwise from north.
4948
+ */
4949
+ readonly azimuthDeg: number;
4950
+ /**
4951
+ * The caller-supplied identity (the `ids[i]` paired with this satellite):
4952
+ * a NORAD catalog number, a name, or whatever the caller chose.
4953
+ */
4954
+ readonly catalogNumber: string;
4955
+ /**
4956
+ * Topocentric elevation, degrees above the horizon.
4957
+ */
4958
+ readonly elevationDeg: number;
4959
+ /**
4960
+ * TEME position of the satellite at the instant, km, as a length-3
4961
+ * `Float64Array` `[x, y, z]`.
4962
+ */
4963
+ readonly positionKm: Float64Array;
4964
+ /**
4965
+ * Slant range from the ground station, kilometres.
4966
+ */
4967
+ readonly rangeKm: number;
4968
+ }
4969
+
3135
4970
  /**
3136
4971
  * WGS84 receiver geodetic coordinates (radians, metres) for DOP.
3137
4972
  */
@@ -3180,6 +5015,40 @@ export class ZenithDelay {
3180
5015
  */
3181
5016
  export function acquire(samples: Float64Array, prn: bigint, options: any): AcquisitionResult;
3182
5017
 
5018
+ /**
5019
+ * Evaluate NRLMSISE-00 neutral-atmosphere density and temperature.
5020
+ *
5021
+ * `latDeg` / `lonDeg` are geodetic degrees, `altKm` geodetic altitude in
5022
+ * kilometres, `year` / `doy` the UT year and day-of-year (1-366), `sec` the
5023
+ * seconds-in-day, and `f107` / `f107a` / `ap` the space-weather indices (daily
5024
+ * F10.7, 81-day centred F10.7 average, and daily magnetic Ap). The local solar
5025
+ * time is derived in the core (`sec/3600 + lonDeg/15`). Delegates to
5026
+ * `sidereon_core::astro::atmosphere::nrlmsise00_with_lst` with `lst = None`, so
5027
+ * the core derives the solar time under its default flags.
5028
+ */
5029
+ 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;
5030
+
5031
+ /**
5032
+ * The canonical quiet-Sun space-weather defaults for NRLMSISE-00. Delegates to
5033
+ * `sidereon_core::astro::atmosphere::{DEFAULT_F107, DEFAULT_F107A, DEFAULT_AP}`.
5034
+ */
5035
+ export function atmosphereSpaceWeatherDefaults(): SpaceWeatherDefaults;
5036
+
5037
+ /**
5038
+ * Resolve integer ambiguities with a bounded lattice search.
5039
+ *
5040
+ * `floatCycles` and `covariance` match [`lambdaIlsSearch`]. `radius` is the
5041
+ * per-ambiguity integer search half-width (the lattice spans `radius` integers
5042
+ * either side of each rounded float), `candidateLimit` caps the number of
5043
+ * lattice points evaluated before the search aborts, and `ratioThreshold` is the
5044
+ * ratio-test acceptance threshold. Correct in the weakly-correlated regime and a
5045
+ * drop-in match for `lambdaIlsSearch` there; on strongly-correlated geometry
5046
+ * prefer `lambdaIlsSearch`. Returns an `IlsResult`. Throws a `TypeError` on a
5047
+ * malformed shape, a `RangeError` on a non-finite or out-of-domain input, and an
5048
+ * `Error` on a singular covariance or a lattice that exceeds `candidateLimit`.
5049
+ */
5050
+ export function boundedIlsSearch(float_cycles: Float64Array, covariance: any, radius: number, candidate_limit: number, ratio_threshold: number): any;
5051
+
3183
5052
  /**
3184
5053
  * One wrapping GPS C/A chip at a zero-based index.
3185
5054
  */
@@ -3205,11 +5074,28 @@ export function carrierFrequencyHz(system: GnssSystem, band: CarrierBand): numbe
3205
5074
  */
3206
5075
  export function changed(diff: any): boolean;
3207
5076
 
5077
+ /**
5078
+ * Continuous seconds since J2000 for a civil instant.
5079
+ */
5080
+ export function civilToJ2000Seconds(year: number, month: number, day: number, hour: number, minute: number, second: number): number;
5081
+
3208
5082
  /**
3209
5083
  * Carrier-to-noise-density ratio, dB-Hz. `otherLossesDb` defaults to 0.
3210
5084
  */
3211
5085
  export function cn0(eirp_dbw: number, fspl_db: number, receiver_gt_dbk: number, other_losses_db?: number | null): number;
3212
5086
 
5087
+ /**
5088
+ * Convert classical orbital elements to an inertial Cartesian state.
5089
+ *
5090
+ * `coe` is a `ClassicalElements` object (see `rv2coe`); only `p`, `ecc`,
5091
+ * `incl`, `raan`, `argp`, and `nu` are required for an ordinary orbit, with
5092
+ * `orbitType` and the auxiliary angles defaulting so the six primary elements
5093
+ * suffice. `mu` is the gravitational parameter (km^3/s^2). Returns
5094
+ * `{ positionKm, velocityKmS }`, each a length-3 `Float64Array`. Delegates to
5095
+ * `sidereon_core::astro::elements::coe2rv`.
5096
+ */
5097
+ export function coe2rv(coe: any, mu: number): any;
5098
+
3213
5099
  /**
3214
5100
  * Coherent integration loss from residual frequency error.
3215
5101
  */
@@ -3245,6 +5131,13 @@ export function covarianceIsPositiveSemidefinite(covariance_km2: Float64Array):
3245
5131
  */
3246
5132
  export function covarianceIsSymmetric(covariance_km2: Float64Array): boolean;
3247
5133
 
5134
+ /**
5135
+ * Build a look-angle coverage grid for `satellites` and `stations` at the
5136
+ * `epochUnixUs` (Unix microseconds) epoch. Each cell is the per-pair look angle
5137
+ * from `sidereon_core::astro::coverage::look_angles_batch`.
5138
+ */
5139
+ export function coverageLookAngles(satellites: Tle[], stations: GroundStation[], epoch_unix_us: bigint): CoverageGrid;
5140
+
3248
5141
  /**
3249
5142
  * Decode Compact RINEX (Hatanaka) bytes into plain RINEX OBS text. Throws a
3250
5143
  * `TypeError` on non-UTF-8 input and an `Error` on a decode failure.
@@ -3258,11 +5151,46 @@ export function decodeCrinex(bytes: Uint8Array): string;
3258
5151
  */
3259
5152
  export function decodeCrinexLines(bytes: Uint8Array): string[];
3260
5153
 
5154
+ /**
5155
+ * Decode every CRC-valid RTCM 3 frame in a byte buffer into the message IR.
5156
+ *
5157
+ * Frames whose CRC fails, or whose body cannot be decoded, are skipped and the
5158
+ * scan resynchronizes on the next preamble. Returns an array of message objects,
5159
+ * each tagged with a `type` discriminant (`"msm"`, `"stationCoordinates"`,
5160
+ * `"antennaDescriptor"`, `"gpsEphemeris"`, `"glonassEphemeris"`,
5161
+ * `"unsupported"`). Delegates to `sidereon_core::rtcm::decode_messages`.
5162
+ */
5163
+ export function decodeRtcm(bytes: Uint8Array): any;
5164
+
5165
+ /**
5166
+ * Decode the single RTCM 3 frame that begins at the start of `bytes`.
5167
+ *
5168
+ * Returns the decoded message object plus the total `frameLen` consumed
5169
+ * (preamble, length word, body, CRC). Throws an `Error` if the preamble is
5170
+ * missing, the buffer is shorter than the declared frame, or the CRC does not
5171
+ * match. Delegates to `sidereon_core::rtcm::decode_frame` +
5172
+ * `sidereon_core::rtcm::Message::decode`.
5173
+ */
5174
+ export function decodeRtcmFrame(bytes: Uint8Array): any;
5175
+
5176
+ /**
5177
+ * Decode a single RTCM 3 message body without the transport frame.
5178
+ *
5179
+ * `body` is the bytes between the frame length word and CRC. Delegates to
5180
+ * `sidereon_core::rtcm::Message::decode`.
5181
+ */
5182
+ export function decodeRtcmMessage(body: Uint8Array): any;
5183
+
3261
5184
  /**
3262
5185
  * Standard dual-frequency ionosphere-free carrier pair for a constellation.
3263
5186
  */
3264
5187
  export function defaultPair(system: GnssSystem): CarrierPair | undefined;
3265
5188
 
5189
+ /**
5190
+ * Single-frequency carrier used by the SPP ionosphere-scaling policy.
5191
+ */
5192
+ export function defaultSppFrequencyHz(system: GnssSystem): number | undefined;
5193
+
3266
5194
  /**
3267
5195
  * Detect cycle slips on a time-ordered single-satellite carrier-phase arc.
3268
5196
  * `arc` is an array of `{ phi1Cycles?, phi2Cycles?, p1M?, p2M?, lli1?, lli2?,
@@ -3281,59 +5209,211 @@ export function detectCycleSlips(arc: any, options: any): SlipResult[];
3281
5209
  export function dgnssApply(rover_observations: any, corrections: any): AppliedCorrections;
3282
5210
 
3283
5211
  /**
3284
- * Compare two catalog snapshots by `(system, prn)` identity.
5212
+ * Compare two catalog snapshots by `(system, prn)` identity.
5213
+ *
5214
+ * `previous` and `current` are each a `Record[]`. Returns a `Diff` of added,
5215
+ * removed, and per-field changes on held PRNs.
5216
+ */
5217
+ export function diff(previous: any, current: any): any;
5218
+
5219
+ /**
5220
+ * Parabolic-dish antenna gain, dBi.
5221
+ */
5222
+ export function dishGain(diameter_m: number, frequency_hz: number, efficiency: number): number;
5223
+
5224
+ /**
5225
+ * Range rate and dimensionless Doppler ratio from a GCRS state.
5226
+ *
5227
+ * `gcrsPositionKm` and `gcrsVelocityKmS` are length-3 `Float64Array`s (km and
5228
+ * km/s). The station is geodetic `stationLatDeg` / `stationLonDeg` (degrees) at
5229
+ * `stationAltKm` (km). The receive epoch is the UTC civil time
5230
+ * `year`/`month`/`day`/`hour`/`minute`/`second`. Returns `[rangeRateKmS,
5231
+ * dopplerRatio]`. Delegates to
5232
+ * `sidereon_core::astro::doppler::range_rate_and_ratio`.
5233
+ */
5234
+ 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;
5235
+
5236
+ /**
5237
+ * Range rate, Doppler ratio, and carrier Doppler shift from a GCRS state.
5238
+ *
5239
+ * Same geometry and epoch inputs as [`dopplerRangeRate`], plus the transmit
5240
+ * `frequencyHz` whose shift is reported. Delegates to
5241
+ * `sidereon_core::astro::doppler::doppler_shift`.
5242
+ */
5243
+ 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;
5244
+
5245
+ /**
5246
+ * Convert a Doppler shift in hertz to pseudorange rate in metres per second.
5247
+ */
5248
+ export function dopplerToRangeRate(doppler_hz: number, carrier_hz: number): number;
5249
+
5250
+ /**
5251
+ * Angular radius in degrees of Earth as seen from each satellite position.
5252
+ */
5253
+ export function earthAngularRadius(satellite_position_km: Float64Array): Float64Array;
5254
+
5255
+ /**
5256
+ * Convert a batch of ITRS (ECEF) positions to geodetic coordinates.
5257
+ *
5258
+ * `positionKm` is a flat row-major `(n, 3)` `Float64Array` in kilometres.
5259
+ * Returns a flat `(n, 3)` `Float64Array` whose columns are
5260
+ * `[latitudeDeg, longitudeDeg, altitudeKm]` (WGS84). Time-independent.
5261
+ */
5262
+ export function ecefToGeodetic(position_km: Float64Array): Float64Array;
5263
+
5264
+ /**
5265
+ * Eclipse status for satellite and Sun position batches, km. Returns a
5266
+ * `string[]` of `"sunlit"` / `"penumbra"` / `"umbra"`.
5267
+ */
5268
+ export function eclipseStatus(satellite_position_km: Float64Array, sun_position_km: Float64Array): string[];
5269
+
5270
+ /**
5271
+ * Effective isotropic radiated power, dBW.
5272
+ */
5273
+ export function eirp(tx_power_dbm: number, tx_antenna_gain_dbi: number): number;
5274
+
5275
+ /**
5276
+ * Ellipsoidal height `h = H + N` (metres above the WGS84 ellipsoid) from an
5277
+ * orthometric height and a geodetic position in radians, using the built-in
5278
+ * grid's undulation. Delegates to
5279
+ * `sidereon_core::geoid::ellipsoidal_height_m`.
5280
+ */
5281
+ export function ellipsoidalHeightM(orthometric_height_m: number, lat_rad: number, lon_rad: number): number;
5282
+
5283
+ /**
5284
+ * Encode plain RINEX observation text into a Compact RINEX (Hatanaka) stream,
5285
+ * the inverse of [`decodeCrinex`]. RINEX 2 is emitted as CRINEX 1.0 and RINEX 3
5286
+ * as CRINEX 3.0, selected from the embedded `RINEX VERSION / TYPE` header. The
5287
+ * output is the canonical all-reset compression form, so it round-trips
5288
+ * (`decodeCrinex(encodeCrinex(rinex)) == rinex`) but is not byte-identical to an
5289
+ * arbitrary `RNX2CRX` stream. Throws an `Error` on malformed input. Delegates to
5290
+ * `sidereon_core::rinex::crinex::encode_crinex`.
5291
+ */
5292
+ export function encodeCrinex(rinex_text: string): string;
5293
+
5294
+ /**
5295
+ * Encode a constructed RTCM message into a message body (without the transport
5296
+ * frame).
5297
+ *
5298
+ * `message` is a `type`-tagged plain object of the same shape [`decodeRtcm`]
5299
+ * returns (`"stationCoordinates"`, `"antennaDescriptor"`, `"gpsEphemeris"`,
5300
+ * `"glonassEphemeris"`, `"msm"`, `"unsupported"`), carrying the raw transmitted
5301
+ * field integers (large fields as `bigint`). Returns the encoded body as a
5302
+ * `Uint8Array`. Delegates to `sidereon_core::rtcm::Message::encode`. Throws a
5303
+ * `TypeError` for a malformed object or unknown type.
5304
+ */
5305
+ export function encodeRtcm(message: any): Uint8Array;
5306
+
5307
+ /**
5308
+ * Encode a constructed RTCM message and wrap it in a fresh RTCM transport frame
5309
+ * (preamble, length word, body, CRC).
5310
+ *
5311
+ * `message` has the same shape [`encodeRtcm`] takes. Returns the framed bytes as
5312
+ * a `Uint8Array`, ready to feed back to [`decodeRtcmFrame`] / [`decodeRtcm`].
5313
+ * Delegates to `sidereon_core::rtcm::Message::to_frame`. Throws a `TypeError`
5314
+ * for a malformed object and an `Error` if the encoded body exceeds the frame
5315
+ * length limit.
5316
+ */
5317
+ export function encodeRtcmFrame(message: any): Uint8Array;
5318
+
5319
+ /**
5320
+ * Build the encounter frame from two position/velocity states (each a length-3
5321
+ * `Float64Array`).
5322
+ */
5323
+ export function encounterFrame(position1_km: Float64Array, velocity1_km_s: Float64Array, position2_km: Float64Array, velocity2_km_s: Float64Array): EncounterFrame;
5324
+
5325
+ /**
5326
+ * Project a 3x3 ECI covariance into the encounter B-plane `(x, z)`. Returns a
5327
+ * flat row-major length-4 (2-by-2) `Float64Array`.
5328
+ */
5329
+ export function encounterPlaneCovariance(frame: EncounterFrame, covariance_km2: Float64Array): Float64Array;
5330
+
5331
+ /**
5332
+ * Find local TCA candidates between two satellites over a UTC window.
3285
5333
  *
3286
- * `previous` and `current` are each a `Record[]`. Returns a `Diff` of added,
3287
- * removed, and per-field changes on held PRNs.
5334
+ * `primaryLine1` / `primaryLine2` and `secondaryLine1` / `secondaryLine2` are
5335
+ * the TLE line pairs; `windowStartUnixMicros` / `windowEndUnixMicros` are the
5336
+ * window bounds as unix-microsecond UTC stamps (`bigint`); `options` is an
5337
+ * optional `TcaFinderOptions` object. Returns an array of `TcaCandidate`
5338
+ * objects. Delegates to
5339
+ * `sidereon_core::astro::tca::find_tca_candidates_from_tles`.
3288
5340
  */
3289
- export function diff(previous: any, current: any): any;
5341
+ 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;
3290
5342
 
3291
5343
  /**
3292
- * Parabolic-dish antenna gain, dBi.
5344
+ * Find local TCA candidates between two satellites and evaluate collision
5345
+ * probability at each.
5346
+ *
5347
+ * Like `findTcaCandidates`, plus `pcOptions` (a `TcaPcOptions` object with the
5348
+ * hard-body radius, Pc method, and optional per-object covariances). Returns an
5349
+ * array of `TcaConjunction` objects. Delegates to
5350
+ * `sidereon_core::astro::tca::find_tca_conjunctions_from_tles`.
3293
5351
  */
3294
- export function dishGain(diameter_m: number, frequency_hz: number, efficiency: number): number;
5352
+ 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;
3295
5353
 
3296
5354
  /**
3297
- * Convert a Doppler shift in hertz to pseudorange rate in metres per second.
5355
+ * Fit a piecewise reduced-orbit model: tile `[t0, t1]` into segments of
5356
+ * `segmentSeconds` and fit each independently.
5357
+ *
5358
+ * `samples` is an array of `{ epoch, xM, yM, zM }` (ECEF metres), `scale` the
5359
+ * time scale the epochs are expressed in, and `model` is `"circular_secular"`
5360
+ * or `"eccentric_secular"`. `t0` / `t1` are `{ year, month, day, hour, minute,
5361
+ * second }` calendar epochs in that scale. Delegates to
5362
+ * `sidereon_core::orbit::fit_piecewise`.
3298
5363
  */
3299
- export function dopplerToRangeRate(doppler_hz: number, carrier_hz: number): number;
5364
+ export function fitPiecewiseReducedOrbit(samples: any, scale: TimeScale, model: string, t0: any, t1: any, segment_seconds: number): PiecewiseOrbit;
3300
5365
 
3301
5366
  /**
3302
- * Angular radius in degrees of Earth as seen from each satellite position.
5367
+ * Sample an SP3 product and fit a piecewise reduced orbit.
5368
+ *
5369
+ * `options` is `{ t0, t1, cadenceS, model, segmentSeconds }`. Epochs are
5370
+ * interpreted in the SP3 product time scale. Delegates to
5371
+ * `sidereon_core::orbit::fit_piecewise_reduced_orbit_source`.
3303
5372
  */
3304
- export function earthAngularRadius(satellite_position_km: Float64Array): Float64Array;
5373
+ export function fitPiecewiseReducedOrbitSp3(sp3: Sp3, satellite: string, options: any): PiecewiseOrbitSourceFit;
3305
5374
 
3306
5375
  /**
3307
- * Convert a batch of ITRS (ECEF) positions to geodetic coordinates.
5376
+ * Sample a TLE/SGP4 source in UTC and fit a piecewise reduced orbit.
3308
5377
  *
3309
- * `positionKm` is a flat row-major `(n, 3)` `Float64Array` in kilometres.
3310
- * Returns a flat `(n, 3)` `Float64Array` whose columns are
3311
- * `[latitudeDeg, longitudeDeg, altitudeKm]` (WGS84). Time-independent.
5378
+ * `options` is `{ t0, t1, cadenceS, model, segmentSeconds }`. Delegates to
5379
+ * `sidereon_core::orbit::fit_piecewise_reduced_orbit_source`.
3312
5380
  */
3313
- export function ecefToGeodetic(position_km: Float64Array): Float64Array;
5381
+ export function fitPiecewiseReducedOrbitTle(tle: Tle, options: any): PiecewiseOrbitSourceFit;
3314
5382
 
3315
5383
  /**
3316
- * Eclipse status for satellite and Sun position batches, km. Returns a
3317
- * `string[]` of `"sunlit"` / `"penumbra"` / `"umbra"`.
5384
+ * Fit a reduced-orbit model to ECEF position samples.
5385
+ *
5386
+ * `samples` is an array of `{ epoch, xM, yM, zM }` (ECEF metres), `scale` the
5387
+ * time scale the epochs are expressed in, and `model` is `"circular_secular"`
5388
+ * or `"eccentric_secular"`. Delegates to `sidereon_core::orbit::fit_with_model`.
3318
5389
  */
3319
- export function eclipseStatus(satellite_position_km: Float64Array, sun_position_km: Float64Array): string[];
5390
+ export function fitReducedOrbit(samples: any, scale: TimeScale, model: string): ReducedOrbit;
3320
5391
 
3321
5392
  /**
3322
- * Effective isotropic radiated power, dBW.
5393
+ * Sample an SP3 product and fit a reduced orbit.
5394
+ *
5395
+ * `options` is `{ t0, t1, cadenceS, model }`. Epochs are interpreted in the
5396
+ * SP3 product time scale. Delegates to
5397
+ * `sidereon_core::orbit::fit_reduced_orbit_source`.
3323
5398
  */
3324
- export function eirp(tx_power_dbm: number, tx_antenna_gain_dbi: number): number;
5399
+ export function fitReducedOrbitSp3(sp3: Sp3, satellite: string, options: any): ReducedOrbitSourceFit;
3325
5400
 
3326
5401
  /**
3327
- * Build the encounter frame from two position/velocity states (each a length-3
3328
- * `Float64Array`).
5402
+ * Sample a TLE/SGP4 source in UTC and fit a reduced orbit.
5403
+ *
5404
+ * `options` is `{ t0, t1, cadenceS, model }`. Delegates to
5405
+ * `sidereon_core::orbit::fit_reduced_orbit_source`.
3329
5406
  */
3330
- export function encounterFrame(position1_km: Float64Array, velocity1_km_s: Float64Array, position2_km: Float64Array, velocity2_km_s: Float64Array): EncounterFrame;
5407
+ export function fitReducedOrbitTle(tle: Tle, options: any): ReducedOrbitSourceFit;
3331
5408
 
3332
5409
  /**
3333
- * Project a 3x3 ECI covariance into the encounter B-plane `(x, z)`. Returns a
3334
- * flat row-major length-4 (2-by-2) `Float64Array`.
5410
+ * Fix Melbourne-Wubbena wide-lane ambiguities over a dual-frequency RTK arc.
5411
+ *
5412
+ * `epochs` is an array of `RtkDualFrequencyArcEpoch` objects and `config` a
5413
+ * `RtkWideLaneArcConfig` object. Delegates to
5414
+ * `sidereon_core::rtk_filter::arc::fix_wide_lane_rtk_arc`.
3335
5415
  */
3336
- export function encounterPlaneCovariance(frame: EncounterFrame, covariance_km2: Float64Array): Float64Array;
5416
+ export function fixWideLaneRtkArc(epochs: any, config: any): any;
3337
5417
 
3338
5418
  /**
3339
5419
  * J2 oblateness gravitational acceleration in km/s^2.
@@ -3357,19 +5437,53 @@ export function forceJ2Acceleration(position_km: Float64Array, velocity_km_s: Fl
3357
5437
  export function forceTwoBodyAcceleration(position_km: Float64Array, velocity_km_s: Float64Array): Float64Array;
3358
5438
 
3359
5439
  /**
3360
- * Build GPS identity records from CelesTrak `gps-ops` OMM JSON-array text.
5440
+ * Build constellation identity records from a CelesTrak OMM JSON-array text.
5441
+ *
5442
+ * `system` is the constellation label (`"gps"`, `"glonass"`, `"galileo"`,
5443
+ * `"beidou"`, `"qzss"`); it dispatches the per-system `OBJECT_NAME` identity
5444
+ * adapter and defaults to `"gps"`. Parses the CelesTrak JSON array into OMM
5445
+ * records (skipping array elements that are not parseable OMM objects), then
5446
+ * derives normalized `Record` rows sorted by `(system, prn)`. Returns a
5447
+ * `Record[]`. Throws an `Error` on a JSON parse failure or a CelesTrak object
5448
+ * name with no PRN resolvable for `system`.
5449
+ */
5450
+ export function fromCelestrakJson(json: string, system?: string | null): any;
5451
+
5452
+ /**
5453
+ * Build constellation identity records from a CelesTrak OMM JSON-array text,
5454
+ * skipping (rather than throwing on) entries that do not resolve.
3361
5455
  *
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.
5456
+ * The lenient sibling of [`fromCelestrakJson`]: feed it a raw combined CelesTrak
5457
+ * `gnss` feed and it returns `{ records, skipped }` `records` is the `Record[]`
5458
+ * for `system` (the same shape `fromCelestrakJson` returns, sorted by
5459
+ * `(system, prn)`), and `skipped` is a `SkippedOmm[]` of the entries whose
5460
+ * `OBJECT_NAME` did not resolve to a PRN for `system` (another constellation's
5461
+ * satellite in the combined feed, or a freshly launched satellite not yet in the
5462
+ * published slot/SVID table), each carrying its `{ objectName?, noradId }` so the
5463
+ * caller can triage. `system` defaults to `"gps"`. Throws an `Error` only on a
5464
+ * JSON parse failure.
3365
5465
  */
3366
- export function fromCelestrakJson(json: string): any;
5466
+ export function fromCelestrakJsonLenient(json: string, system?: string | null): any;
3367
5467
 
3368
5468
  /**
3369
5469
  * Free-space path loss, dB, for range in km and frequency in MHz.
3370
5470
  */
3371
5471
  export function fspl(distance_km: number, frequency_mhz: number): number;
3372
5472
 
5473
+ /**
5474
+ * Galileo NeQuick-G single-frequency ionospheric group delay (positive metres).
5475
+ *
5476
+ * `ai0`/`ai1`/`ai2` are the three Galileo broadcast NeQuick-G coefficients.
5477
+ * `latDeg`/`lonDeg` are the receiver geodetic coordinates, `azimuthDeg` /
5478
+ * `elevationDeg` the satellite topocentric angles (degrees). The receive epoch
5479
+ * is the UTC civil time `year`/`month`/`day`/`hour`/`minute`/`second`, taken in
5480
+ * Galileo System Time. `frequencyHz` is the reporting carrier. Delegates to
5481
+ * `sidereon_core::atmosphere::ionosphere::ionosphere_delay` with
5482
+ * `IonoModel::GalileoNequickG`, which dispatches to the Galileo arm. Throws an
5483
+ * `Error` on an out-of-domain input.
5484
+ */
5485
+ 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;
5486
+
3373
5487
  /**
3374
5488
  * Ionosphere-free coefficient `gamma = f1^2 / (f1^2 - f2^2)`.
3375
5489
  */
@@ -3390,11 +5504,31 @@ export function gcrsToItrs(position_km: Float64Array, epochs_unix_us: BigInt64Ar
3390
5504
  */
3391
5505
  export function geodeticToEcef(geodetic: Float64Array): Float64Array;
3392
5506
 
5507
+ /**
5508
+ * Geoid undulation `N` (metres above the WGS84 ellipsoid) at a geodetic
5509
+ * position in radians, from the COARSE built-in global grid. Latitude is
5510
+ * positive north, longitude positive east. Delegates to
5511
+ * `sidereon_core::geoid::geoid_undulation`.
5512
+ */
5513
+ export function geoidUndulation(lat_rad: number, lon_rad: number): number;
5514
+
3393
5515
  /**
3394
5516
  * Geometry-free phase combination `L_GF = L1 - L2`, metres.
3395
5517
  */
3396
5518
  export function geometryFree(l1_m: number, l2_m: number): number;
3397
5519
 
5520
+ /**
5521
+ * GLONASS FDMA L1/L2 frequency-channel number (`k`, in `-7..=6`) for an
5522
+ * orbital slot, from the published IGS/MCC slot-channel table. Returns `null`
5523
+ * for a slot with no tabulated channel.
5524
+ */
5525
+ export function glonassFdmaChannel(slot: number): number | undefined;
5526
+
5527
+ /**
5528
+ * GLONASS G1 FDMA carrier frequency in hertz for channel `k`.
5529
+ */
5530
+ export function glonassG1FrequencyHz(channel: number): number;
5531
+
3398
5532
  /**
3399
5533
  * GNSS dilution of precision from ECEF line-of-sight unit rows and weights.
3400
5534
  *
@@ -3403,6 +5537,16 @@ export function geometryFree(l1_m: number, l2_m: number): number;
3403
5537
  */
3404
5538
  export function gnssDop(line_of_sight: Float64Array, weights: Float64Array, receiver: Wgs84Geodetic): Dop;
3405
5539
 
5540
+ /**
5541
+ * Compute exact GNSS DOP at a single epoch from an SP3 precise product.
5542
+ *
5543
+ * `stationEcefM` is an ECEF metre vector (length 3); `j2000Seconds` the receive
5544
+ * time as continuous seconds since J2000 in the SP3 product time scale.
5545
+ * `options` is `{ satellites?, elevationMaskDeg?=5, systems?, weighting?="unit",
5546
+ * lightTime?=false }`. Delegates to `sidereon_core::geometry::dop_at_epoch`.
5547
+ */
5548
+ export function gnssDopAtEpoch(sp3: Sp3, station_ecef_m: Float64Array, j2000_seconds: number, options: any): DopGeometry;
5549
+
3406
5550
  /**
3407
5551
  * Sample SP3-derived GNSS DOP over a J2000 epoch grid.
3408
5552
  *
@@ -3413,6 +5557,26 @@ export function gnssDop(line_of_sight: Float64Array, weights: Float64Array, rece
3413
5557
  */
3414
5558
  export function gnssDopSeries(sp3: Sp3, station_ecef_m: Float64Array, j2000_seconds: Float64Array, options: any): DopSeries;
3415
5559
 
5560
+ /**
5561
+ * Sample exact GNSS DOP over an inclusive uniform window `[startJ2000S,
5562
+ * endJ2000S]` at `stepSeconds` spacing, skipping singular or underdetermined
5563
+ * samples. `options` is the same shape as [`gnssDopAtEpoch`]. Delegates to
5564
+ * `sidereon_core::geometry::dop_series`.
5565
+ */
5566
+ export function gnssDopSeriesWindow(sp3: Sp3, station_ecef_m: Float64Array, start_j2000_s: number, end_j2000_s: number, step_seconds: number, options: any): DopSeriesSample[];
5567
+
5568
+ /**
5569
+ * Sampled visibility passes over `[startJ2000S, endJ2000S]` at `stepSeconds`
5570
+ * spacing. Delegates to `sidereon_core::geometry::passes`.
5571
+ */
5572
+ export function gnssPasses(sp3: Sp3, station_ecef_m: Float64Array, start_j2000_s: number, end_j2000_s: number, step_seconds: number, options: any): GnssPass[];
5573
+
5574
+ /**
5575
+ * Render the canonical SP3/RINEX satellite token for a constellation + PRN
5576
+ * (`("gps", 7)` -> `"G07"`, `("glonass", 13)` -> `"R13"`).
5577
+ */
5578
+ export function gnssSp3Id(system: string, prn: number): string;
5579
+
3416
5580
  /**
3417
5581
  * Stable lower-case display label for a constellation, e.g. `"gps"`.
3418
5582
  */
@@ -3423,6 +5587,51 @@ export function gnssSystemLabel(system: GnssSystem): string;
3423
5587
  */
3424
5588
  export function gnssSystemLetter(system: GnssSystem): string;
3425
5589
 
5590
+ /**
5591
+ * Visible-satellite counts over `[startJ2000S, endJ2000S]` sampled every
5592
+ * `stepSeconds`. Delegates to `sidereon_core::geometry::visibility_series`.
5593
+ */
5594
+ export function gnssVisibilitySeries(sp3: Sp3, station_ecef_m: Float64Array, start_j2000_s: number, end_j2000_s: number, step_seconds: number, options: any): GnssVisibilityCount[];
5595
+
5596
+ /**
5597
+ * Satellites visible above the elevation mask from an SP3 product at one
5598
+ * receive epoch. `stationEcefM` is a length-3 `Float64Array` (ECEF metres),
5599
+ * `j2000Seconds` the receive time as continuous seconds since J2000.
5600
+ * Delegates to `sidereon_core::geometry::visible`.
5601
+ */
5602
+ export function gnssVisible(sp3: Sp3, station_ecef_m: Float64Array, j2000_seconds: number, options: any): GnssVisibleSatellite[];
5603
+
5604
+ /**
5605
+ * Gauss angles-only orbit determination.
5606
+ *
5607
+ * `decl` and `rtasc` are length-3 declination / right-ascension
5608
+ * `Float64Array`s (radians), `jd` and `jdf` length-3 split Julian dates (whole
5609
+ * part and fraction, days), and `rseci` a flat row-major `(3, 3)`
5610
+ * `Float64Array` of observer-site ECI positions (km), one row per epoch.
5611
+ * Returns the orbit state at the middle observation. Delegates to
5612
+ * `sidereon_core::astro::iod::gauss_angles`.
5613
+ */
5614
+ export function iodGaussAngles(decl: Float64Array, rtasc: Float64Array, jd: Float64Array, jdf: Float64Array, rseci: Float64Array): IodState;
5615
+
5616
+ /**
5617
+ * Gibbs three-position velocity solve.
5618
+ *
5619
+ * `r1`, `r2`, `r3` are length-3 coplanar geocentric position `Float64Array`s
5620
+ * (km). Returns the velocity at `r2` plus the inter-vector and coplanarity
5621
+ * angles. Delegates to `sidereon_core::astro::iod::gibbs`.
5622
+ */
5623
+ export function iodGibbs(r1: Float64Array, r2: Float64Array, r3: Float64Array): IodVelocity;
5624
+
5625
+ /**
5626
+ * Herrick-Gibbs three-position velocity solve.
5627
+ *
5628
+ * `r1`, `r2`, `r3` are length-3 closely-spaced geocentric position
5629
+ * `Float64Array`s (km) and `jd1`/`jd2`/`jd3` their Julian-date epochs (days).
5630
+ * Returns the velocity at `r2` plus the inter-vector and coplanarity angles.
5631
+ * Delegates to `sidereon_core::astro::iod::hgibbs`.
5632
+ */
5633
+ export function iodHerrickGibbs(r1: Float64Array, r2: Float64Array, r3: Float64Array, jd1: number, jd2: number, jd3: number): IodVelocity;
5634
+
3426
5635
  /**
3427
5636
  * Ionosphere-free code or meter-valued phase combination, metres.
3428
5637
  */
@@ -3456,6 +5665,54 @@ export function isValid(validation: any): boolean;
3456
5665
  */
3457
5666
  export function itrsToGcrs(position_km: Float64Array, epochs_unix_us: BigInt64Array): Float64Array;
3458
5667
 
5668
+ /**
5669
+ * Civil calendar fields from whole seconds since J2000.
5670
+ */
5671
+ export function j2000SecondsToCivil(seconds: bigint): CivilDateTime;
5672
+
5673
+ /**
5674
+ * GPS broadcast Klobuchar ionospheric group delay in the model's native units
5675
+ * (positive metres).
5676
+ *
5677
+ * `alpha` and `beta` are the eight transmitted GPS Klobuchar coefficients, each
5678
+ * a length-4 `Float64Array` (`a0..a3`, `b0..b3`). Receiver latitude/longitude
5679
+ * and satellite azimuth/elevation are degrees (latitude positive north,
5680
+ * longitude positive east, azimuth clockwise from north). `tGpsS` is the GPS
5681
+ * second-of-day in `[0, 86400)`. `frequencyHz` is the carrier the dispersive
5682
+ * delay is reported on; the model evaluates the L1 delay and scales it by the
5683
+ * dispersive `(f_l1 / f)^2` factor. Delegates to
5684
+ * `sidereon_core::atmosphere::ionosphere::klobuchar_native`. Throws an `Error`
5685
+ * on an out-of-domain coefficient, angle, time, or frequency.
5686
+ */
5687
+ 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;
5688
+
5689
+ /**
5690
+ * Resolve integer ambiguities with the LAMBDA method (RTKLIB `lambda()` port).
5691
+ *
5692
+ * `floatCycles` is the real-valued ambiguity vector (`Float64Array`),
5693
+ * `covariance` is its `n x n` covariance as a row-major `number[][]`, and
5694
+ * `ratioThreshold` is the ratio-test acceptance threshold (RTKLIB's default is
5695
+ * `3.0`). Finds the true integer-least-squares optimum and runner-up for any
5696
+ * positive-definite covariance — no search box, no combinatorial blow-up.
5697
+ * Returns an `IlsResult`. Throws a `TypeError` on a malformed shape, a
5698
+ * `RangeError` on a non-finite or out-of-domain input, and an `Error` on a
5699
+ * singular covariance or a non-converging search.
5700
+ */
5701
+ export function lambdaIlsSearch(float_cycles: Float64Array, covariance: any, ratio_threshold: number): any;
5702
+
5703
+ /**
5704
+ * Solve Lambert's problem with Battin's method.
5705
+ *
5706
+ * `r1`, `r2` are length-3 position `Float64Array`s (km) and `dtsec` the time of
5707
+ * flight (seconds). `v1` (length-3, km/s) is only consulted for the degenerate
5708
+ * 180-degree transfer where the transfer-plane normal is otherwise undefined.
5709
+ * `directionOfMotion` is `"short"` or `"long"`, `directionOfEnergy` is `"low"`
5710
+ * or `"high"`, and `nrev` is the number of complete revolutions. Returns the
5711
+ * departure and arrival transfer velocities. Delegates to
5712
+ * `sidereon_core::astro::lambert::battin`.
5713
+ */
5714
+ export function lambertBattin(r1: Float64Array, r2: Float64Array, v1: Float64Array, dtsec: number, direction_of_motion_label: string, direction_of_energy_label: string, nrev: number): LambertTransfer;
5715
+
3459
5716
  /**
3460
5717
  * Provenance and coverage of the embedded leap-second (TAI-UTC) table.
3461
5718
  */
@@ -3472,6 +5729,62 @@ export function leapSeconds(year: number, month: number, day: number): number;
3472
5729
  */
3473
5730
  export function leapSecondsBatch(dates: Int32Array): Float64Array;
3474
5731
 
5732
+ /**
5733
+ * Decode LNAV subframes 1-3 back into engineering-unit parameters.
5734
+ *
5735
+ * Each subframe is a 300-bit `Uint8Array` of `0`/`1`. Parity is verified on all
5736
+ * 30 words first; a failure throws an `Error`. Delegates to
5737
+ * `sidereon_core::navigation::lnav::decode`.
5738
+ */
5739
+ export function lnavDecode(sf1: Uint8Array, sf2: Uint8Array, sf3: Uint8Array): LnavDecoded;
5740
+
5741
+ /**
5742
+ * Encode clock and ephemeris parameters into LNAV subframes 1-3.
5743
+ *
5744
+ * `params` is the engineering-unit parameter object and `options` the optional
5745
+ * TLM/HOW object (omitted fields default to `0`). Returns the three 300-bit
5746
+ * subframes. Throws an `Error` on an out-of-range field. Delegates to
5747
+ * `sidereon_core::navigation::lnav::encode`.
5748
+ */
5749
+ export function lnavEncode(params: any, options: any): LnavSubframes;
5750
+
5751
+ /**
5752
+ * The six parity bits `[D25..D30]` of a word from its 24 source data bits.
5753
+ *
5754
+ * `data24` is the 24 source data bits (most significant first, before the
5755
+ * `D30*` complementation). `d29Prev` / `d30Prev` are the previous word's two
5756
+ * trailing parity bits. Delegates to `sidereon_core::navigation::lnav::parity`.
5757
+ */
5758
+ export function lnavParity(data24: Uint8Array, d29_prev: number, d30_prev: number): Uint8Array;
5759
+
5760
+ /**
5761
+ * Verify the parity of a single 30-bit word.
5762
+ *
5763
+ * `word30` is the 30-bit word as transmitted (data bits possibly complemented
5764
+ * by `D30*`, then 6 received parity bits). `d29Prev` / `d30Prev` are the
5765
+ * previous word's trailing parity bits. Delegates to
5766
+ * `sidereon_core::navigation::lnav::parity_valid`.
5767
+ */
5768
+ export function lnavParityValid(word30: Uint8Array, d29_prev: number, d30_prev: number): boolean;
5769
+
5770
+ /**
5771
+ * Subframe ID from a hand-over word or a full subframe.
5772
+ *
5773
+ * `bits` is a 30-bit HOW word or a 300-bit subframe. Returns the 3-bit subframe
5774
+ * ID, or `undefined` for any other length. Delegates to
5775
+ * `sidereon_core::navigation::lnav::subframe_id`.
5776
+ */
5777
+ export function lnavSubframeId(bits: Uint8Array): bigint | undefined;
5778
+
5779
+ /**
5780
+ * Time-of-week count from a hand-over word or a full subframe.
5781
+ *
5782
+ * `bits` is a 30-bit HOW word or a 300-bit subframe (whose word 2 is the HOW),
5783
+ * as a `Uint8Array` of `0`/`1`. Returns the 17-bit TOW count, or `undefined`
5784
+ * for any other length. Delegates to `sidereon_core::navigation::lnav::tow`.
5785
+ */
5786
+ export function lnavTow(bits: Uint8Array): bigint | undefined;
5787
+
3475
5788
  /**
3476
5789
  * Parse an ANTEX 1.4 antenna product from in-memory bytes (a `Uint8Array`).
3477
5790
  * Throws an `Error` on a parse failure or non-UTF-8 input.
@@ -3556,16 +5869,86 @@ export function narrowLaneCode(p1_m: number, p2_m: number, f1_hz: number, f2_hz:
3556
5869
  */
3557
5870
  export function navMessageLabel(message: NavMessage): string;
3558
5871
 
5872
+ /**
5873
+ * Full NeQuick-G slant ionospheric group delay (positive metres) on
5874
+ * `frequencyHz`.
5875
+ *
5876
+ * The slant TEC from [`nequick_g_stec_tecu_js`] mapped to a group delay with the
5877
+ * dispersive `40.3e16 / f^2` relation. `eval` is a plain object; see the
5878
+ * `NequickGEval` TypeScript type. Delegates to
5879
+ * `sidereon_core::atmosphere::ionosphere::nequick_g_delay_m`. Throws a
5880
+ * `TypeError` for a malformed object and an `Error` for an out-of-domain input
5881
+ * or non-positive frequency.
5882
+ */
5883
+ export function nequickGDelayM(_eval: any, frequency_hz: number): number;
5884
+
5885
+ /**
5886
+ * Full NeQuick-G slant total electron content along the ray, in TECU.
5887
+ *
5888
+ * Unlike the compact broadcast-driven [`galileo_nequick_delay`], this evaluates
5889
+ * the complete three-dimensional NeQuick 2 electron-density profiler integrated
5890
+ * along the receiver-to-satellite ray with the reference adaptive
5891
+ * Gauss-Kronrod quadrature. `eval` is a plain object; see the `NequickGEval`
5892
+ * TypeScript type. Delegates to
5893
+ * `sidereon_core::atmosphere::ionosphere::nequick_g_stec_tecu`. Throws a
5894
+ * `TypeError` for a malformed object and an `Error` for an out-of-domain month,
5895
+ * UTC, latitude, or a geometrically invalid ray.
5896
+ */
5897
+ export function nequickGStecTecu(_eval: any): number;
5898
+
3559
5899
  /**
3560
5900
  * Equal-variance noise amplification of the ionosphere-free combination.
3561
5901
  */
3562
5902
  export function noiseAmplification(f1_hz: number, f2_hz: number): number;
3563
5903
 
5904
+ /**
5905
+ * Predict observables for one satellite from a broadcast ephemeris store.
5906
+ * Delegates to `sidereon_core::observables::predict`.
5907
+ */
5908
+ export function observablesBroadcast(broadcast: BroadcastEphemeris, satellite: string, receiver_ecef_m: Float64Array, t_rx_j2000_s: number, options: any): PredictedObservables;
5909
+
5910
+ /**
5911
+ * Predict observables for one satellite from an SP3 precise product. See
5912
+ * [`observablesBroadcast`] for the broadcast-ephemeris counterpart. Delegates
5913
+ * to `sidereon_core::observables::predict`.
5914
+ */
5915
+ export function observablesSp3(sp3: Sp3, satellite: string, receiver_ecef_m: Float64Array, t_rx_j2000_s: number, options: any): PredictedObservables;
5916
+
3564
5917
  /**
3565
5918
  * Stable lower-case label for an observation kind.
3566
5919
  */
3567
5920
  export function observationKindLabel(kind: ObservationKind): string;
3568
5921
 
5922
+ /**
5923
+ * Ocean tide loading displacement of an ITRF station, metres (ECEF).
5924
+ *
5925
+ * `stationEcefM` is a length-3 geocentric ECEF metre vector and the epoch is
5926
+ * the UTC `year`/`month`/`day` plus `fractionalHour`. `amplitudeM` and
5927
+ * `phaseDeg` are the station's BLQ coefficients as flat row-major
5928
+ * `(3, 11)` `Float64Array`s: component order radial / EW-west / NS-south, and
5929
+ * constituent order M2 S2 N2 K2 K1 O1 P1 Q1 Mf Mm Ssa. Returns the displacement
5930
+ * `[dx, dy, dz]`. Delegates to `sidereon_core::tides::ocean_tide_loading`.
5931
+ */
5932
+ export function oceanTideLoading(station_ecef_m: Float64Array, year: number, month: number, day: number, fractional_hour: number, amplitude_m: Float64Array, phase_deg: Float64Array): Float64Array;
5933
+
5934
+ /**
5935
+ * Orthometric height `H = h - N` (metres above mean sea level) from an
5936
+ * ellipsoidal height and a geodetic position in radians, using the built-in
5937
+ * grid's undulation. Delegates to
5938
+ * `sidereon_core::geoid::orthometric_height_m`.
5939
+ */
5940
+ export function orthometricHeightM(ellipsoidal_height_m: number, lat_rad: number, lon_rad: number): number;
5941
+
5942
+ /**
5943
+ * Parallactic angle (degrees) of a target at a station.
5944
+ *
5945
+ * `observerLatitudeDeg` is the observer geodetic latitude, `hourAngleDeg` the
5946
+ * local hour angle (positive west of the meridian), and `declinationDeg` the
5947
+ * target declination. The result is on `(-180, 180]`. Delegates to
5948
+ * `sidereon_core::astro::observation::parallactic_angle_deg`.
5949
+ */
5950
+ export function parallacticAngleDeg(observer_latitude_deg: number, hour_angle_deg: number, declination_deg: number): number;
5951
+
3569
5952
  /**
3570
5953
  * Parse CCSDS CDM KVN text. Throws an `Error` on a parse failure.
3571
5954
  */
@@ -3584,6 +5967,18 @@ export function parseCdmXml(text: string): Cdm;
3584
5967
  */
3585
5968
  export function parseNavcen(html: string): any;
3586
5969
 
5970
+ /**
5971
+ * Parse CCSDS OEM KVN text. The KVN reader is forgiving: malformed ephemeris
5972
+ * lines are skipped and counted in `skippedStates`. Throws an `Error` on a
5973
+ * structural failure.
5974
+ */
5975
+ export function parseOemKvn(text: string): Oem;
5976
+
5977
+ /**
5978
+ * Parse CCSDS OEM XML text. Throws an `Error` on a parse failure.
5979
+ */
5980
+ export function parseOemXml(text: string): Oem;
5981
+
3587
5982
  /**
3588
5983
  * Parse CCSDS/CelesTrak OMM JSON text. Throws an `Error` on a parse failure.
3589
5984
  */
@@ -3599,6 +5994,16 @@ export function parseOmmKvn(text: string): Omm;
3599
5994
  */
3600
5995
  export function parseOmmXml(text: string): Omm;
3601
5996
 
5997
+ /**
5998
+ * Parse CCSDS OPM KVN text. Throws an `Error` on a parse failure.
5999
+ */
6000
+ export function parseOpmKvn(text: string): Opm;
6001
+
6002
+ /**
6003
+ * Parse CCSDS OPM XML text. Throws an `Error` on a parse failure.
6004
+ */
6005
+ export function parseOpmXml(text: string): Opm;
6006
+
3602
6007
  /**
3603
6008
  * Strictly parse RINEX clock bytes into satellite clock-bias series. Throws a
3604
6009
  * `TypeError` on non-UTF-8 input and an `Error` on a malformed record.
@@ -3644,6 +6049,16 @@ export function parseRinexNavRecords(bytes: Uint8Array): BroadcastRecordJs[];
3644
6049
  */
3645
6050
  export function parseRinexObs(bytes: Uint8Array): RinexObs;
3646
6051
 
6052
+ /**
6053
+ * Parse a multi-record TLE file (CelesTrak / Space-Track style) into named,
6054
+ * initialized [`Tle`] instances. Handles bare 2-line sets, 3-line name+line1+line2
6055
+ * sets, and CelesTrak `0 NAME` markers; CRLF endings, blank lines, and
6056
+ * surrounding whitespace are tolerated. A record whose element set fails SGP4
6057
+ * initialization is skipped and counted in `skipped` rather than aborting the
6058
+ * whole file. `opsMode` is `"improved"` (default) or `"afspc"`.
6059
+ */
6060
+ export function parseTleFile(text: string, ops_mode_label?: string | null): ParsedTleFile;
6061
+
3647
6062
  /**
3648
6063
  * Sun-satellite-observer phase angle in degrees.
3649
6064
  */
@@ -3654,6 +6069,52 @@ export function phaseAngle(satellite_position_km: Float64Array, sun_position_km:
3654
6069
  */
3655
6070
  export function phaseMeters(phi_cycles: number, f_hz: number): number;
3656
6071
 
6072
+ /**
6073
+ * Precompute static PPP correction tables for a precise-orbit arc.
6074
+ *
6075
+ * `epochs` is an array of `PppCorrectionEpoch` objects, `receiverEcefM` is the
6076
+ * fixed receiver position (`Float64Array` of length 3, metres), and `options`
6077
+ * selects which corrections to compute: `solidEarthTide` / `phaseWindup`
6078
+ * booleans, plus optional `satelliteAntenna` (a `PppSatelliteAntennaOptions`),
6079
+ * `poleTide` (a `PoleTideOptions`, the IERS polar motion of the date), and
6080
+ * `oceanLoading` (an `OceanLoadingBlq`, the station's BLQ block). Returns a
6081
+ * `PppCorrections` whose fields are each keyed by the input epoch index. Throws a
6082
+ * `TypeError` on a malformed shape or an invalid satellite token, and an `Error`
6083
+ * on an invalid epoch or a tide/coverage failure.
6084
+ */
6085
+ export function pppCorrections(sp3: Sp3, epochs: any, receiver_ecef_m: Float64Array, options: any): any;
6086
+
6087
+ /**
6088
+ * Prepare ionosphere-free single-frequency RTK arc inputs from a
6089
+ * dual-frequency arc and fixed wide-lane ambiguities.
6090
+ *
6091
+ * `epochs` is an array of `RtkDualFrequencyArcEpoch` objects, `wideLaneCycles`
6092
+ * is an id-keyed integer object, and `config` is an
6093
+ * `RtkIonosphereFreeArcConfig` object. Delegates to
6094
+ * `sidereon_core::rtk_filter::arc::prepare_ionosphere_free_rtk_arc`.
6095
+ */
6096
+ export function prepareIonosphereFreeRtkArc(epochs: any, wide_lane_cycles: any, config: any): any;
6097
+
6098
+ /**
6099
+ * Propagate a fleet of already-initialized [`Tle`]s over a shared epoch grid in
6100
+ * a single call: the batched form of [`Tle.propagate`].
6101
+ *
6102
+ * Element `(i, j)` of the result is `satellites[i]` propagated to
6103
+ * `epochsUnixUs[j]`, bit-for-bit identical to `satellites[i].propagate([
6104
+ * epochsUnixUs[j] ])` on its own; this is a thin wrapper over the engine's
6105
+ * serial batch kernel (the binding never spawns the rayon thread pool, since
6106
+ * wasm is single-threaded). Each `Tle` carries the opsmode it was constructed
6107
+ * with, so a deep-space / opsmode-sensitive object is propagated in its own
6108
+ * mode. The `Tle` instances are consumed by this call.
6109
+ *
6110
+ * `epochsUnixUs` is a `BigInt64Array` of unix-microsecond UTC epochs shared by
6111
+ * every satellite. The hot case for a constellation animation is a single epoch
6112
+ * (`epochCount == 1`), giving one TEME state per satellite, but any epoch count
6113
+ * is supported. An empty fleet or empty epoch grid yields empty arrays. Throws
6114
+ * an `Error` (naming the satellite index) if a satellite fails to propagate.
6115
+ */
6116
+ export function propagateBatch(satellites: Tle[], epochs_unix_us: BigInt64Array): FleetPropagation;
6117
+
3657
6118
  /**
3658
6119
  * Numerically propagate an ECI Cartesian state and sample it at a grid of
3659
6120
  * epochs.
@@ -3675,6 +6136,20 @@ export function pseudorangeDropReasonLabel(reason: PseudorangeDropReason): strin
3675
6136
  */
3676
6137
  export function pseudorangeVariance(elevation_deg: number, options: any): number;
3677
6138
 
6139
+ /**
6140
+ * Run standalone range RAIM/FDE over a linearized measurement set.
6141
+ *
6142
+ * `rows` is an array of `{ id, residualM, designRow, weight }` objects (each
6143
+ * `designRow` the measurement's design-matrix row, of length equal to the
6144
+ * estimated state dimension). `options` is an optional `{ pFa?, maxExclusions?,
6145
+ * minRedundancy? }` object (pass `undefined` for the core defaults). Returns the
6146
+ * protected state correction, covariance, global chi-square test, the excluded
6147
+ * ids, the per-measurement diagnostics, and the exclusion count. Delegates to
6148
+ * `sidereon_core::quality::raim_fde_design`. Throws a `TypeError` for malformed
6149
+ * input and an `Error` for a rank-deficient or otherwise rejected set.
6150
+ */
6151
+ export function raimFdeDesign(rows: any, options: any): any;
6152
+
3678
6153
  /**
3679
6154
  * Convert a pseudorange rate in metres per second to Doppler shift in hertz.
3680
6155
  */
@@ -3695,12 +6170,64 @@ export function rinexBandFrequencyHz(system: GnssSystem, band: string, glonass_c
3695
6170
  */
3696
6171
  export function rinexBandWavelengthM(system: GnssSystem, band: string, glonass_channel?: number | null): number | undefined;
3697
6172
 
6173
+ /**
6174
+ * Read the 12-bit RTCM message number from a message body.
6175
+ *
6176
+ * `body` is the bytes between the frame length word and CRC. Delegates to
6177
+ * `sidereon_core::rtcm::message_number`.
6178
+ */
6179
+ export function rtcmMessageNumber(body: Uint8Array): number;
6180
+
3698
6181
  /**
3699
6182
  * Transform a 3x3 RTN covariance (flat row-major length 9) to ECI for the given
3700
6183
  * orbit state. Returns a flat row-major length-9 `Float64Array`.
3701
6184
  */
3702
6185
  export function rtnToEciCovariance(covariance_rtn: Float64Array, position_km: Float64Array, velocity_km_s: Float64Array): Float64Array;
3703
6186
 
6187
+ /**
6188
+ * Convert an inertial Cartesian state to classical orbital elements.
6189
+ *
6190
+ * `r` is the ECI position (km), `v` the ECI velocity (km/s), and `mu` the
6191
+ * gravitational parameter (km^3/s^2). Returns a `ClassicalElements` object;
6192
+ * undefined primary angles and the inapplicable auxiliary angles are `NaN` per
6193
+ * the orbit type. Delegates to `sidereon_core::astro::elements::rv2coe`. Throws
6194
+ * a `TypeError` for a wrong-length vector and an `Error` for a degenerate or
6195
+ * non-finite state.
6196
+ */
6197
+ export function rv2coe(r: Float64Array, v: Float64Array, mu: number): any;
6198
+
6199
+ /**
6200
+ * Apparent visual magnitude of a sunlit body from a diffuse-sphere phase law.
6201
+ *
6202
+ * `rangeKm` and `referenceRangeKm` (both positive) are the observation range
6203
+ * and the reference range at which `standardMagnitude` is defined;
6204
+ * `phaseAngleDeg` is the solar phase angle (Sun-body-observer), clamped to
6205
+ * `[0, 180]`. Delegates to
6206
+ * `sidereon_core::astro::observation::satellite_visual_magnitude`.
6207
+ */
6208
+ export function satelliteVisualMagnitude(range_km: number, phase_angle_deg: number, standard_magnitude: number, reference_range_km: number): number;
6209
+
6210
+ /**
6211
+ * Screen a primary satellite against a secondary TLE catalog for threshold TCAs.
6212
+ *
6213
+ * `primaryLine1` / `primaryLine2` is the primary TLE; `secondaries` is an array
6214
+ * of `{ line1, line2 }`; `missDistanceThresholdKm` is the miss-distance cutoff.
6215
+ * Returns one `TcaScreeningHit` (`{ secondaryIndex, candidate }`) per local TCA
6216
+ * at or below the threshold, in catalog then time order. Delegates to
6217
+ * `sidereon_core::astro::tca::screen_tca_candidates_from_tle_catalog_serial`.
6218
+ */
6219
+ 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;
6220
+
6221
+ /**
6222
+ * Screen a primary against a secondary TLE catalog and evaluate collision
6223
+ * probability at each threshold TCA.
6224
+ *
6225
+ * Like `screenTcaCandidates`, plus `pcOptions`. Returns an array of
6226
+ * `TcaScreeningConjunctionHit` (`{ secondaryIndex, conjunction }`). Delegates to
6227
+ * `sidereon_core::astro::tca::screen_tca_conjunctions_from_tle_catalog_serial`.
6228
+ */
6229
+ 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;
6230
+
3704
6231
  /**
3705
6232
  * Select an IONEX product usable at `requestedEpochJ2000S`, degrading to a
3706
6233
  * diurnal-shifted prior product within `policy`.
@@ -3763,6 +6290,65 @@ export function smoothIonoFreeCode(arc: any, options: any, hatch_window_cap?: nu
3763
6290
  */
3764
6291
  export function snrPostDb(cn0_dbhz: number, integration_time_s: number): number;
3765
6292
 
6293
+ /**
6294
+ * Solid-earth pole tide displacement of an ITRF station, metres (ECEF).
6295
+ *
6296
+ * `stationEcefM` is a length-3 geocentric ECEF metre vector and the epoch is
6297
+ * the UTC `year`/`month`/`day` plus `fractionalHour`. `xpArcsec` / `ypArcsec`
6298
+ * are the polar-motion coordinates in arcseconds. Returns the displacement
6299
+ * `[dx, dy, dz]`. Delegates to `sidereon_core::tides::solid_earth_pole_tide`.
6300
+ */
6301
+ export function solidEarthPoleTide(station_ecef_m: Float64Array, year: number, month: number, day: number, fractional_hour: number, xp_arcsec: number, yp_arcsec: number): Float64Array;
6302
+
6303
+ /**
6304
+ * Solid-earth tide displacement of an ITRF station, metres (ECEF).
6305
+ *
6306
+ * `stationEcefM`, `sunEcefM`, `moonEcefM` are length-3 geocentric ECEF metre
6307
+ * vectors. The epoch is the UTC `year`/`month`/`day` plus `fractionalHour`
6308
+ * (`hour + min/60 + sec/3600`, in `[0, 24)`). Returns the displacement
6309
+ * `[dx, dy, dz]`. Delegates to `sidereon_core::tides::solid_earth_tide`.
6310
+ */
6311
+ 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;
6312
+
6313
+ /**
6314
+ * Solve a sequence of moving-baseline RTK epochs.
6315
+ *
6316
+ * `config` is a plain object; see the `MovingBaselineConfig` TypeScript type.
6317
+ * Each epoch is solved independently against its own `basePositionM`; with
6318
+ * `warmStart` (default `true`) each solved baseline seeds the next epoch's
6319
+ * linearization point. Returns an array of `MovingBaselineEpochSolution`. Throws
6320
+ * a `TypeError` for malformed input and an `Error` if a solve fails (the message
6321
+ * names the failing epoch index). Delegates to
6322
+ * `sidereon_core::rtk_filter::moving_baseline::solve_moving_baseline`.
6323
+ */
6324
+ export function solveMovingBaseline(config: any): MovingBaselineSolution[];
6325
+
6326
+ /**
6327
+ * Solve a static integer-fixed PPP arc from raw epochs: SPP auto-init seed, the
6328
+ * float solve, then the LAMBDA integer fix and ambiguity-conditioned re-solve.
6329
+ *
6330
+ * `epochs`, `floatConfig`, and `fixedConfig` are the same plain objects the
6331
+ * float and fixed solves take; `options` is an optional `PppAutoInitOptions`
6332
+ * object. Delegates to
6333
+ * `sidereon_core::precise_positioning::auto_init::solve_ppp_auto_init_fixed`.
6334
+ * Throws a `TypeError` for malformed input and an `Error` if the solve fails.
6335
+ */
6336
+ export function solvePppAutoInitFixed(sp3: Sp3, epochs: any, options: any, float_config: any, fixed_config: any): PppFixedSolution;
6337
+
6338
+ /**
6339
+ * Solve a static multi-epoch float PPP arc from raw epochs, auto-initializing
6340
+ * the float state from the SPP seed.
6341
+ *
6342
+ * Unlike [`solvePppFloat`], the caller does not supply an initial state: the
6343
+ * driver seeds it (per-epoch SPP code solve, mean position, phase-minus-code
6344
+ * ambiguities) before the float solve. `epochs` and `config` are the same plain
6345
+ * objects [`solvePppFloat`] takes; `options` is an optional `PppAutoInitOptions`
6346
+ * object (pass `undefined` for the SPP-seeded defaults). Delegates to
6347
+ * `sidereon_core::precise_positioning::auto_init::solve_ppp_auto_init_float`.
6348
+ * Throws a `TypeError` for malformed input and an `Error` if the solve fails.
6349
+ */
6350
+ export function solvePppAutoInitFloat(sp3: Sp3, epochs: any, options: any, config: any): PppFloatSolution;
6351
+
3766
6352
  /**
3767
6353
  * Search integer ambiguities from a float PPP solution and re-solve fixed.
3768
6354
  *
@@ -3781,6 +6367,18 @@ export function solvePppFixed(sp3: Sp3, epochs: any, float_solution: PppFloatSol
3781
6367
  */
3782
6368
  export function solvePppFloat(sp3: Sp3, epochs: any, initial_state: any, config: any): PppFloatSolution;
3783
6369
 
6370
+ /**
6371
+ * Solve a sequential RTK baseline arc from raw rover+base epochs.
6372
+ *
6373
+ * `epochs` is an array of `RtkArcEpoch` objects and `config` an `RtkArcConfig`
6374
+ * object (see the TypeScript types). Returns `{ references, epochs, finalState }`:
6375
+ * one reported baseline/ambiguity solution per input epoch, the per-system
6376
+ * reference satellites selected once for the whole arc, and the final carried
6377
+ * filter state. Delegates to `sidereon_core::rtk_filter::arc::solve_rtk_arc`.
6378
+ * Throws a `TypeError` for malformed input and an `Error` if the solve fails.
6379
+ */
6380
+ export function solveRtkArc(epochs: any, config: any): any;
6381
+
3784
6382
  /**
3785
6383
  * Solve a static fixed RTK baseline with residual validation / FDE.
3786
6384
  *
@@ -3798,12 +6396,29 @@ export function solveRtkFixed(config: any): RtkFixedSolution;
3798
6396
  export function solveRtkFloat(config: any): RtkFloatSolution;
3799
6397
 
3800
6398
  /**
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`.
6399
+ * Solve a static RTK arc with one batch float solution and one validated fixed
6400
+ * solution over the whole arc.
6401
+ *
6402
+ * `epochs` is an array of `RtkArcEpoch` objects and `config` a
6403
+ * `RtkStaticArcConfig` object. Delegates to
6404
+ * `sidereon_core::rtk_filter::arc::solve_static_rtk_arc`.
6405
+ */
6406
+ export function solveStaticRtkArc(epochs: any, config: any): any;
6407
+
6408
+ /**
6409
+ * Solve receiver velocity over an SP3 precise product. See
6410
+ * [`solveVelocityBroadcast`] for the broadcast-ephemeris counterpart.
3804
6411
  */
3805
6412
  export function solveVelocity(sp3: Sp3, observations: any, receiver_ecef_m: Float64Array, t_rx_j2000_s: number, options: any): VelocitySolution;
3806
6413
 
6414
+ /**
6415
+ * Solve receiver ECEF velocity and clock drift from one epoch of observations
6416
+ * over a broadcast ephemeris store. Identical to [`solveVelocity`] except the
6417
+ * satellite states come from broadcast records. Delegates to
6418
+ * `sidereon_core::velocity::solve`.
6419
+ */
6420
+ export function solveVelocityBroadcast(broadcast: BroadcastEphemeris, observations: any, receiver_ecef_m: Float64Array, t_rx_j2000_s: number, options: any): VelocitySolution;
6421
+
3807
6422
  /**
3808
6423
  * Solve a receiver position, preferring precise SP3 products and falling back to
3809
6424
  * broadcast ephemeris, reporting which source was used and how stale it is.
@@ -3817,6 +6432,33 @@ export function solveVelocity(sp3: Sp3, observations: any, receiver_ecef_m: Floa
3817
6432
  */
3818
6433
  export function solveWithFallback(precise: Sp3[], broadcast: BroadcastEphemeris, request: any, policy: any): SourcedSolution;
3819
6434
 
6435
+ /**
6436
+ * Continuous seconds since J2000 for a split Julian date.
6437
+ */
6438
+ export function splitJdToJ2000Seconds(jd_whole: number, jd_fraction: number): number;
6439
+
6440
+ /**
6441
+ * Sub-observer point (planetary central meridian) on a rotating body.
6442
+ *
6443
+ * `observerFromBody` is the observer position relative to the body center
6444
+ * (length-3 `Float64Array`) in an inertial (ICRF/J2000 equatorial) frame, and
6445
+ * `poleRaDeg` / `poleDecDeg` / `primeMeridianDeg` are the IAU WGCCRE pole right
6446
+ * ascension, declination, and prime-meridian angle. Returns the body-fixed
6447
+ * `{ latitudeDeg, longitudeDeg }` (planetocentric, longitude on `(-180, 180]`).
6448
+ * Delegates to `sidereon_core::astro::observation::sub_observer_point`.
6449
+ */
6450
+ export function subObserverPoint(observer_from_body: Float64Array, pole_ra_deg: number, pole_dec_deg: number, prime_meridian_deg: number): any;
6451
+
6452
+ /**
6453
+ * Sub-solar point: the geographic point where the Sun is at the zenith.
6454
+ *
6455
+ * `sunEcef` is the geocentric Sun position (length-3 `Float64Array`) in an
6456
+ * Earth-fixed (ITRS/ECEF) frame; only its direction matters. Returns
6457
+ * `{ latitudeDeg, longitudeDeg }` (geocentric, degrees). Delegates to
6458
+ * `sidereon_core::astro::observation::sub_solar_point`.
6459
+ */
6460
+ export function subSolarPoint(sun_ecef: Float64Array): any;
6461
+
3820
6462
  /**
3821
6463
  * Angle in degrees between satellite nadir and the Sun direction.
3822
6464
  */
@@ -3848,11 +6490,45 @@ export function sunMoonEci(epochs_unix_us: BigInt64Array): SunMoon;
3848
6490
  */
3849
6491
  export function temeToGcrs(position_km: Float64Array, velocity_km_s: Float64Array, epochs_unix_us: BigInt64Array, skyfield_compat?: boolean | null): FrameStates;
3850
6492
 
6493
+ /**
6494
+ * Latitude (degrees) of the day-night terminator at a query longitude.
6495
+ *
6496
+ * `subSolarLatitudeDeg` / `subSolarLongitudeDeg` are the sub-solar point (see
6497
+ * `subSolarPoint`); `longitudeDeg` is the query longitude. Delegates to
6498
+ * `sidereon_core::astro::observation::terminator_latitude_deg`.
6499
+ */
6500
+ export function terminatorLatitudeDeg(sub_solar_latitude_deg: number, sub_solar_longitude_deg: number, longitude_deg: number): number;
6501
+
3851
6502
  /**
3852
6503
  * Short uppercase identifier for a time scale, e.g. `"GPST"`.
3853
6504
  */
3854
6505
  export function timeScaleAbbrev(scale: TimeScale): string;
3855
6506
 
6507
+ /**
6508
+ * Leap-aware inter-system offset `to_reading - from_reading`, in seconds, at a
6509
+ * given UTC instant. Add the result to a `from`-scale reading to get the
6510
+ * `to`-scale reading.
6511
+ *
6512
+ * `utcJd` is the UTC Julian date of the instant; it is consulted only to
6513
+ * resolve the leap-second count when `from` or `to` is UTC-based
6514
+ * (`Utc`/`Glonasst`), and is ignored for purely atomic pairs. Throws a
6515
+ * `RangeError` for `Tdb` or a non-finite `utcJd` when a leap count is needed.
6516
+ */
6517
+ export function timescaleOffsetAtS(from: TimeScale, to: TimeScale, utc_jd: number): number;
6518
+
6519
+ /**
6520
+ * Fixed inter-system offset `to_reading - from_reading`, in seconds, for the
6521
+ * same physical instant. Add the result to a `from`-scale reading to get the
6522
+ * `to`-scale reading.
6523
+ *
6524
+ * Covers the atomic scales (TAI/TT/GPST/GST/QZSST/BDT), whose mutual offsets
6525
+ * are constants fixed by their ICDs. Throws a `RangeError` when either scale is
6526
+ * UTC-based (`Utc`/`Glonasst`) — those carry leap seconds, so their offset is
6527
+ * epoch-dependent and needs [`timescaleOffsetAtS`] — or for `Tdb` (no fixed
6528
+ * offset; resolve it through an `Instant`).
6529
+ */
6530
+ export function timescaleOffsetS(from: TimeScale, to: TimeScale): number;
6531
+
3856
6532
  /**
3857
6533
  * Export records as the compact mapping CSV (`prn,norad_cat_id,active,sp3_id`).
3858
6534
  *
@@ -3912,6 +6588,25 @@ export function validate(records: any): any;
3912
6588
  */
3913
6589
  export function validateAgainstSp3Ids(records: any, ids: any): any;
3914
6590
 
6591
+ /**
6592
+ * Satellites visible above `minElevationDeg` from `station` at a single instant,
6593
+ * from already-initialized [`Tle`]s: the opsmode-preserving constellation
6594
+ * snapshot.
6595
+ *
6596
+ * Each `Tle` in `satellites` carries the opsmode it was constructed with, so a
6597
+ * deep-space / opsmode-sensitive object is evaluated in its own mode (unlike the
6598
+ * element-based core path, which hardcodes AFSPC). `ids` supplies the identity
6599
+ * out-of-band: `ids[i]` (a catalog number, name, or anything) becomes the
6600
+ * `catalogNumber` of `satellites[i]`, so the two arrays must be the same length.
6601
+ * The `Tle` instances are consumed by this call.
6602
+ *
6603
+ * `epochUnixUs` is a unix-microsecond UTC `bigint`. Per-satellite propagation or
6604
+ * frame failures are skipped; the result is filtered by `minElevationDeg` and
6605
+ * sorted by elevation descending. Throws an `Error` on an invalid station,
6606
+ * elevation threshold, or `ids`/`satellites` length mismatch.
6607
+ */
6608
+ export function visibleFromSatellites(satellites: Tle[], ids: string[], station: GroundStation, epoch_unix_us: bigint, min_elevation_deg: number): VisibleSatellite[];
6609
+
3915
6610
  /**
3916
6611
  * Wavelength, metres, for frequency in Hz.
3917
6612
  */