@neilberkman/sidereon 0.11.1 → 0.13.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.
@@ -305,6 +305,25 @@ export class BroadcastEphemeris {
305
305
  * J2000 seconds. Returns `undefined` when no usable record covers the query.
306
306
  */
307
307
  evaluate(satellite: string, t_j2000_s: number): BroadcastStoreEvaluation | undefined;
308
+ /**
309
+ * Query ECEF position and clock for parallel satellite and epoch arrays
310
+ * against this parsed broadcast ephemeris store.
311
+ *
312
+ * `satellites[i]` is evaluated at `epochsJ2000S[i]`, where epochs are
313
+ * seconds since J2000 in GPST for GNSS broadcast records. The returned
314
+ * plain object has aligned `positionsEcefM`, `clocksS`, `statuses`, and
315
+ * `elementResults` arrays.
316
+ */
317
+ observableStatesAtJ2000S(satellites: any, epochs_j2000_s: any): any;
318
+ /**
319
+ * Query ECEF position and clock for many satellites at one epoch against
320
+ * this parsed broadcast ephemeris store.
321
+ *
322
+ * `epochJ2000S` is seconds since J2000 in GPST. The returned object follows
323
+ * the same contract as
324
+ * [`observableStatesAtJ2000S`](Self::observable_states_at_j2000_s).
325
+ */
326
+ observableStatesAtSharedJ2000S(satellites: any, epoch_j2000_s: number): any;
308
327
  /**
309
328
  * Solve a receiver position from broadcast ephemeris ALONE: the supported
310
329
  * real-time / offline single-point-positioning mode. `request` is the same
@@ -1454,14 +1473,84 @@ export class DragForce {
1454
1473
  readonly spaceWeather: SpaceWeather;
1455
1474
  }
1456
1475
 
1476
+ /**
1477
+ * A DTED terrain tile cache rooted at a directory of DTED Level 2 files.
1478
+ *
1479
+ * Heights are ORTHOMETRIC terrain elevations in meters. Point order is always
1480
+ * longitude first, then latitude, both in degrees.
1481
+ */
1457
1482
  export class DtedTerrain {
1458
1483
  free(): void;
1459
1484
  [Symbol.dispose](): void;
1485
+ /**
1486
+ * Batch terrain heights in ORTHOMETRIC meters for longitude-first points.
1487
+ *
1488
+ * `points` is an array of `[longitudeDeg, latitudeDeg]` pairs or
1489
+ * `{ longitudeDeg, latitudeDeg }` objects. `options.interpolation` is
1490
+ * `"bilinear"`, `"nearest"`, or `"nearestPosting"`. The return value is
1491
+ * index-aligned to `points`; each entry is `{ ok: true, heightM }` or
1492
+ * `{ ok: false, error }`. Missing tiles evaluate to `0.0`.
1493
+ */
1494
+ heightBatch(points: any, options: any): any;
1495
+ /**
1496
+ * Terrain height in ORTHOMETRIC meters at `(longitudeDeg, latitudeDeg)`.
1497
+ *
1498
+ * Longitude and latitude are degrees. The lookup uses bilinear
1499
+ * interpolation. Missing tiles evaluate to `0.0`, matching the core DTED
1500
+ * fallback.
1501
+ */
1460
1502
  heightM(longitude_deg: number, latitude_deg: number): number;
1503
+ /**
1504
+ * Terrain height in ORTHOMETRIC meters at `(longitudeDeg, latitudeDeg)`.
1505
+ *
1506
+ * Longitude and latitude are degrees. `options.interpolation` is
1507
+ * `"bilinear"`, `"nearest"`, or `"nearestPosting"`. Missing tiles evaluate
1508
+ * to `0.0`, matching the core DTED fallback.
1509
+ */
1461
1510
  heightMWithOptions(longitude_deg: number, latitude_deg: number, options: any): number;
1511
+ /**
1512
+ * Create a DTED terrain reader rooted at `root`.
1513
+ *
1514
+ * The root may contain tile files directly or the nested block layout the
1515
+ * core reader recognizes. Height results are ORTHOMETRIC meters.
1516
+ */
1462
1517
  constructor(root: string);
1463
1518
  }
1464
1519
 
1520
+ /**
1521
+ * Loaded EGM96 15-arcminute geoid grid for explicit terrain datum conversion.
1522
+ */
1523
+ export class Egm96FifteenMinuteGeoid {
1524
+ private constructor();
1525
+ free(): void;
1526
+ [Symbol.dispose](): void;
1527
+ /**
1528
+ * Load `WW15MGH.DAC` bytes as an EGM96 15-arcminute geoid grid.
1529
+ */
1530
+ static fromWw15mghDacBytes(bytes: Uint8Array): Egm96FifteenMinuteGeoid;
1531
+ /**
1532
+ * Read and load `WW15MGH.DAC` from disk. A missing file throws a typed
1533
+ * `MissingEgm96Dac` error with `path` and `remediation` fields.
1534
+ */
1535
+ static fromWw15mghDacPath(path: string): Egm96FifteenMinuteGeoid;
1536
+ }
1537
+
1538
+ /**
1539
+ * Ellipsoidal height `h` in metres above the WGS84 reference ellipsoid.
1540
+ */
1541
+ export class EllipsoidalHeightM {
1542
+ free(): void;
1543
+ [Symbol.dispose](): void;
1544
+ /**
1545
+ * Build an ellipsoidal height `h` in metres.
1546
+ */
1547
+ constructor(value_m: number);
1548
+ /**
1549
+ * Ellipsoidal height `h`, metres above the WGS84 reference ellipsoid.
1550
+ */
1551
+ readonly valueM: number;
1552
+ }
1553
+
1465
1554
  /**
1466
1555
  * Orthonormal encounter frame built from two relative states.
1467
1556
  */
@@ -2160,6 +2249,22 @@ export class Ionex {
2160
2249
  * a `RangeError` on non-finite input and an `Error` on out-of-range input.
2161
2250
  */
2162
2251
  slantDelay(lat_deg: number, lon_deg: number, azimuth_deg: number, elevation_deg: number, epoch_j2000_s: number, frequency_hz: number): number;
2252
+ /**
2253
+ * Extract the full IONEX vertical-TEC grids as plain sample data.
2254
+ *
2255
+ * Epochs are integer seconds since J2000. Latitude and longitude nodes and
2256
+ * grid steps are degrees. TEC and RMS maps are TECU and indexed
2257
+ * `[map][iLat][iLon]`. The shell height and base radius are kilometers.
2258
+ */
2259
+ tecGridSamples(): any;
2260
+ /**
2261
+ * Extract one IONEX vertical-TEC sample per grid node.
2262
+ *
2263
+ * Each sample is `{ epochJ2000S, latDeg, lonDeg, vtecTecu, rmsTecu }`.
2264
+ * Epochs are integer seconds since J2000, coordinates are degrees, and TEC
2265
+ * and RMS values are TECU.
2266
+ */
2267
+ tecSamples(): any;
2163
2268
  /**
2164
2269
  * Serialize to standard IONEX text. Deterministic: the same product always
2165
2270
  * produces byte-identical text, and re-parsing the output yields an equal
@@ -2171,6 +2276,16 @@ export class Ionex {
2171
2276
  * Mean Earth radius used by the geometry, kilometres.
2172
2277
  */
2173
2278
  readonly baseRadiusKm: number;
2279
+ /**
2280
+ * Signed latitude grid step, degrees. Standard IONEX grids are
2281
+ * north-to-south, so this value is usually negative.
2282
+ */
2283
+ readonly dlatDeg: number;
2284
+ /**
2285
+ * Signed longitude grid step, degrees. Standard IONEX grids are
2286
+ * west-to-east, so this value is usually positive.
2287
+ */
2288
+ readonly dlonDeg: number;
2174
2289
  /**
2175
2290
  * The IONEX `EXPONENT` header field; the TEC scale is `10^exponent`.
2176
2291
  */
@@ -2732,6 +2847,104 @@ export class MappingFactors {
2732
2847
  readonly wet: number;
2733
2848
  }
2734
2849
 
2850
+ /**
2851
+ * In-memory reader for memory-mappable terrain store bytes.
2852
+ *
2853
+ * Query results are orthometric terrain heights `H` in metres. Use the
2854
+ * ellipsoidal methods only when a geoid model is deliberately selected.
2855
+ */
2856
+ export class MmapTerrain {
2857
+ private constructor();
2858
+ free(): void;
2859
+ [Symbol.dispose](): void;
2860
+ /**
2861
+ * FNV-1a checksum of the full terrain store byte span.
2862
+ */
2863
+ checksum64(): bigint;
2864
+ /**
2865
+ * Ellipsoidal height `h = H + N` in metres at `(longitudeDeg, latitudeDeg)`
2866
+ * using the embedded EGM96 1-degree geoid grid.
2867
+ */
2868
+ ellipsoidalHeightM(longitude_deg: number, latitude_deg: number): EllipsoidalHeightM;
2869
+ /**
2870
+ * Ellipsoidal height `h = H + N` in metres using an explicit geoid model.
2871
+ *
2872
+ * The terrain lookup input order is `(longitudeDeg, latitudeDeg)`. Choosing
2873
+ * the EGM96 15-arcminute model requires a loaded `WW15MGH.DAC` grid and
2874
+ * does not fall back to the embedded 1-degree grid.
2875
+ */
2876
+ ellipsoidalHeightMWithModel(longitude_deg: number, latitude_deg: number, options: any, geoid: TerrainGeoidModel): EllipsoidalHeightM;
2877
+ /**
2878
+ * Ellipsoidal height `h = H + N` in metres using embedded EGM96 1-degree
2879
+ * geoid conversion and explicit terrain lookup options.
2880
+ */
2881
+ ellipsoidalHeightMWithOptions(longitude_deg: number, latitude_deg: number, options: any): EllipsoidalHeightM;
2882
+ /**
2883
+ * Parse terrain store bytes from a `Uint8Array`.
2884
+ */
2885
+ static fromBytes(bytes: Uint8Array): MmapTerrain;
2886
+ /**
2887
+ * Read a terrain store file from host I/O and parse it into memory.
2888
+ *
2889
+ * Browser runtimes should use [`MmapTerrain.fromBytes`] with fetched bytes.
2890
+ */
2891
+ static fromPath(path: string): MmapTerrain;
2892
+ /**
2893
+ * Parse terrain store bytes from an owned `Uint8Array` copy.
2894
+ */
2895
+ static fromVec(bytes: Uint8Array): MmapTerrain;
2896
+ /**
2897
+ * Batch ORTHOMETRIC terrain heights for longitude-first points.
2898
+ *
2899
+ * `points` is an array of `[longitudeDeg, latitudeDeg]` pairs or
2900
+ * `{ longitudeDeg, latitudeDeg }` objects. Each entry is
2901
+ * `{ ok: true, heightM }` or `{ ok: false, error }`.
2902
+ */
2903
+ heightBatch(points: any, options: any): any;
2904
+ /**
2905
+ * Terrain height in ORTHOMETRIC metres at `(longitudeDeg, latitudeDeg)`.
2906
+ *
2907
+ * Longitude and latitude are degrees. The lookup uses bilinear
2908
+ * interpolation. Missing tiles evaluate to `0.0`.
2909
+ */
2910
+ heightM(longitude_deg: number, latitude_deg: number): number;
2911
+ /**
2912
+ * Terrain height in ORTHOMETRIC metres at `(longitudeDeg, latitudeDeg)`.
2913
+ *
2914
+ * `options.interpolation` is `"bilinear"`, `"nearest"`, or
2915
+ * `"nearestPosting"`.
2916
+ */
2917
+ heightMWithOptions(longitude_deg: number, latitude_deg: number, options: any): number;
2918
+ /**
2919
+ * Batch typed ORTHOMETRIC terrain heights for longitude-first points.
2920
+ *
2921
+ * Each entry is `{ ok: true, orthometricHeightM: { valueM } }` or
2922
+ * `{ ok: false, error }`.
2923
+ */
2924
+ orthometricHeightBatch(points: any, options: any): any;
2925
+ /**
2926
+ * Typed ORTHOMETRIC terrain height `H` at `(longitudeDeg, latitudeDeg)`.
2927
+ */
2928
+ orthometricHeightM(longitude_deg: number, latitude_deg: number): OrthometricHeightM;
2929
+ /**
2930
+ * Typed ORTHOMETRIC terrain height `H` at `(longitudeDeg, latitudeDeg)`
2931
+ * with explicit lookup options.
2932
+ */
2933
+ orthometricHeightMWithOptions(longitude_deg: number, latitude_deg: number, options: any): OrthometricHeightM;
2934
+ /**
2935
+ * Parsed tile index records in store order.
2936
+ */
2937
+ tileIndex(): TerrainStoreTileIndex[];
2938
+ /**
2939
+ * Canonical store bytes for this parsed terrain store.
2940
+ */
2941
+ toBytes(): Uint8Array;
2942
+ /**
2943
+ * File-level vertical datum for the store's orthometric posting payloads.
2944
+ */
2945
+ readonly verticalDatum: VerticalDatum;
2946
+ }
2947
+
2735
2948
  /**
2736
2949
  * One refined Moon elevation threshold crossing (moonrise / moonset).
2737
2950
  */
@@ -3782,6 +3995,33 @@ export class OpmState {
3782
3995
  readonly velocityKmS: Float64Array;
3783
3996
  }
3784
3997
 
3998
+ /**
3999
+ * Orthometric terrain height `H` in metres above the EGM96 mean sea level
4000
+ * geoid.
4001
+ */
4002
+ export class OrthometricHeightM {
4003
+ free(): void;
4004
+ [Symbol.dispose](): void;
4005
+ /**
4006
+ * Build an orthometric height `H` in metres.
4007
+ */
4008
+ constructor(value_m: number);
4009
+ /**
4010
+ * Convert to ellipsoidal height `h = H + N` using degree inputs in geoid
4011
+ * order `(latitudeDeg, longitudeDeg)` and an explicit geoid model.
4012
+ */
4013
+ toEllipsoidalHeightDeg(latitude_deg: number, longitude_deg: number, geoid: TerrainGeoidModel): EllipsoidalHeightM;
4014
+ /**
4015
+ * Convert to ellipsoidal height `h = H + N` using radian inputs in geoid
4016
+ * order `(latitudeRad, longitudeRad)` and an explicit geoid model.
4017
+ */
4018
+ toEllipsoidalHeightRad(latitude_rad: number, longitude_rad: number, geoid: TerrainGeoidModel): EllipsoidalHeightM;
4019
+ /**
4020
+ * Orthometric height `H`, metres above the EGM96 mean sea level geoid.
4021
+ */
4022
+ readonly valueM: number;
4023
+ }
4024
+
3785
4025
  /**
3786
4026
  * The result of [`parseTleFile`]: the satellites that parsed, plus a count of
3787
4027
  * complete records that were skipped because SGP4 initialization failed.
@@ -3958,6 +4198,80 @@ export class PppFloatSolution {
3958
4198
  readonly ztdResidualM: number | undefined;
3959
4199
  }
3960
4200
 
4201
+ /**
4202
+ * A reusable precise-ephemeris interpolant with cached per-satellite nodes.
4203
+ *
4204
+ * Build this handle once from a parsed [`Sp3`] product, raw precise samples, or
4205
+ * a [`PreciseEphemerisSampleSource`], then reuse it for many state or range
4206
+ * queries. The handle delegates to
4207
+ * `sidereon_core::ephemeris::PreciseEphemerisInterpolant`; ECEF positions are
4208
+ * metres, clocks are seconds, and query epochs are seconds since J2000 in the
4209
+ * source time scale.
4210
+ */
4211
+ export class PreciseEphemerisInterpolant {
4212
+ private constructor();
4213
+ free(): void;
4214
+ [Symbol.dispose](): void;
4215
+ /**
4216
+ * Build a cached interpolant from an existing sample-backed precise source.
4217
+ */
4218
+ static fromPreciseEphemerisSamples(source: PreciseEphemerisSampleSource): PreciseEphemerisInterpolant;
4219
+ /**
4220
+ * Build a cached interpolant directly from precise samples.
4221
+ *
4222
+ * `samples` is the same array accepted by
4223
+ * [`preciseEphemerisSamplesFromSamples`]: each item has `{ sat, epoch,
4224
+ * positionEcefM, clockS?, clockEvent? }`, with epochs in seconds since
4225
+ * J2000 and positions in ECEF metres. Throws a `TypeError` for malformed
4226
+ * JS input and a `RangeError` for sample validation failures.
4227
+ */
4228
+ static fromSamples(samples: any): PreciseEphemerisInterpolant;
4229
+ /**
4230
+ * Build a cached interpolant from a parsed SP3 precise product.
4231
+ *
4232
+ * Nodes are copied from the product's native SP3 records. Query epochs are
4233
+ * seconds since J2000 in the SP3 product time scale.
4234
+ */
4235
+ static fromSp3(sp3: Sp3): PreciseEphemerisInterpolant;
4236
+ /**
4237
+ * Query ECEF position and optional clock for parallel satellite and epoch
4238
+ * arrays using this cached interpolant.
4239
+ *
4240
+ * `satellites[i]` is evaluated at `epochsJ2000S[i]`, where epochs are
4241
+ * seconds since J2000 on this handle's time scale. The returned plain
4242
+ * object has aligned `positionsEcefM`, `clocksS`, `statuses`, and
4243
+ * `elementResults` arrays.
4244
+ */
4245
+ observableStatesAtJ2000S(satellites: any, epochs_j2000_s: any): any;
4246
+ /**
4247
+ * Query ECEF position and optional clock for many satellites at one epoch
4248
+ * using this cached interpolant.
4249
+ *
4250
+ * `epochJ2000S` is seconds since J2000 on this handle's time scale. The
4251
+ * returned object follows the same contract as
4252
+ * [`observableStatesAtJ2000S`](Self::observable_states_at_j2000_s).
4253
+ */
4254
+ observableStatesAtSharedJ2000S(satellites: any, epoch_j2000_s: number): any;
4255
+ /**
4256
+ * Predict geometric ranges for many `(satellite, receiver, epoch)`
4257
+ * requests using this cached interpolant.
4258
+ *
4259
+ * `requests` is an array of `{ sat, receiverEcefM, tRxJ2000S }` objects.
4260
+ * Positions are ECEF metres and epochs are seconds since J2000 on this
4261
+ * handle's time scale. The output matches [`Sp3.predictRanges`].
4262
+ */
4263
+ predictRanges(requests: any, options: any): any;
4264
+ /**
4265
+ * Satellite tokens this handle can interpolate, ascending.
4266
+ */
4267
+ readonly satellites: string[];
4268
+ /**
4269
+ * Source time-scale abbreviation used by this handle's J2000-second axis,
4270
+ * such as `"GPST"`.
4271
+ */
4272
+ readonly timeScale: string;
4273
+ }
4274
+
3961
4275
  /**
3962
4276
  * A precise-ephemeris source built from samples rather than parsed SP3 text.
3963
4277
  *
@@ -3969,6 +4283,26 @@ export class PreciseEphemerisSampleSource {
3969
4283
  private constructor();
3970
4284
  free(): void;
3971
4285
  [Symbol.dispose](): void;
4286
+ /**
4287
+ * Query ECEF position and optional clock for parallel satellite and epoch
4288
+ * arrays against this sample-backed precise source.
4289
+ *
4290
+ * `satellites[i]` is evaluated at `epochsJ2000S[i]`, where epochs are
4291
+ * seconds since J2000 on the source time scale. The returned plain object
4292
+ * has aligned `positionsEcefM`, `clocksS`, `statuses`, and
4293
+ * `elementResults` arrays. Failed elements use the core missing-position
4294
+ * sentinel and carry the scalar engine error in `elementResults[i].error`.
4295
+ */
4296
+ observableStatesAtJ2000S(satellites: any, epochs_j2000_s: any): any;
4297
+ /**
4298
+ * Query ECEF position and optional clock for many satellites at one epoch
4299
+ * against this sample-backed precise source.
4300
+ *
4301
+ * `epochJ2000S` is seconds since J2000 on the source time scale. The
4302
+ * returned plain object follows the same contract as
4303
+ * [`observableStatesAtJ2000S`](Self::observable_states_at_j2000_s).
4304
+ */
4305
+ observableStatesAtSharedJ2000S(satellites: any, epoch_j2000_s: number): any;
3972
4306
  /**
3973
4307
  * Predict geometric ranges for many requests in one call. See the shared
3974
4308
  * [`predictRanges`](crate::precise_samples::predict_ranges_over) contract;
@@ -4518,13 +4852,80 @@ export class SatelliteVector {
4518
4852
  readonly values: Float64Array;
4519
4853
  }
4520
4854
 
4855
+ /**
4856
+ * Mutable SBAS correction store.
4857
+ *
4858
+ * Ingest raw SBAS messages with a source GEO and GNSS time, then query decoded
4859
+ * fast, long-term, ionospheric, and GEO navigation correction records.
4860
+ */
4521
4861
  export class SbasCorrectionStore {
4522
4862
  free(): void;
4523
4863
  [Symbol.dispose](): void;
4864
+ /**
4865
+ * Fast pseudorange correction for `(geo, sat)`, or `null`.
4866
+ *
4867
+ * `prcM` is meters, `rrcMS` is meters per second, and `tOfJ2000S` is
4868
+ * seconds since J2000.
4869
+ */
4870
+ fastCorrection(geo: string, sat: string): any;
4871
+ /**
4872
+ * SBAS GEO navigation state for `geo`, or `null`.
4873
+ *
4874
+ * Positions are ECEF meters, velocities are ECEF meters per second,
4875
+ * accelerations are ECEF meters per second squared, clock fields are
4876
+ * seconds and seconds per second, and `t0J2000S` is seconds since J2000.
4877
+ */
4878
+ geoNavState(geo: string): any;
4879
+ /**
4880
+ * Ingest one decoded SBAS message into the correction store.
4881
+ *
4882
+ * `geo` is the SBAS source satellite token such as `"S29"`. `week` and
4883
+ * `towS` are in the selected GNSS time scale. `form` is `"framed250"` or
4884
+ * `"body226"`.
4885
+ */
4524
4886
  ingest(bytes: Uint8Array, form: string | null | undefined, geo: string, week: number, tow_s: number, time_scale?: string | null): void;
4887
+ /**
4888
+ * SBAS ionospheric grid for `geo`, or `null`.
4889
+ *
4890
+ * Grid point latitudes and longitudes are degrees, vertical delays are
4891
+ * meters, and GIVE variances are square meters when present.
4892
+ */
4893
+ ionoGrid(geo: string): any;
4894
+ /**
4895
+ * SBAS ionospheric slant delay in meters, or `null`.
4896
+ *
4897
+ * Receiver latitude, longitude, elevation, and azimuth are radians.
4898
+ * `frequencyHz` is the carrier frequency for the reported group delay.
4899
+ */
4525
4900
  ionoSlantDelayM(geo: string, receiver_lat_rad: number, receiver_lon_rad: number, receiver_height_m: number, elevation_rad: number, azimuth_rad: number, frequency_hz: number): number | undefined;
4901
+ /**
4902
+ * Long-term orbit and clock correction for `(geo, sat)`, or `null`.
4903
+ *
4904
+ * Position deltas are ECEF meters, rates are ECEF meters per second, clock
4905
+ * deltas are seconds and seconds per second, and `t0J2000S` is seconds
4906
+ * since J2000.
4907
+ */
4908
+ longTermCorrection(geo: string, sat: string): any;
4909
+ /**
4910
+ * Create an empty SBAS correction store.
4911
+ */
4526
4912
  constructor();
4913
+ /**
4914
+ * Ready SBAS GEO source satellites at `tJ2000S`.
4915
+ *
4916
+ * The time is seconds since J2000. Returned tokens are strings such as
4917
+ * `"S29"`, sorted by most recent update first.
4918
+ */
4527
4919
  readyGeos(t_j2000_s: number): string[];
4920
+ /**
4921
+ * Allow or disallow partial SBAS corrections when building corrected
4922
+ * ephemeris states.
4923
+ */
4924
+ setAllowPartial(yes: boolean): void;
4925
+ /**
4926
+ * Set the maximum staleness for fresh SBAS corrections, in seconds.
4927
+ */
4928
+ setStalenessSeconds(seconds: number): void;
4528
4929
  }
4529
4930
 
4530
4931
  /**
@@ -4706,6 +5107,26 @@ export class Sp3 {
4706
5107
  * coverage gap (the engine refuses to extrapolate).
4707
5108
  */
4708
5109
  interpolate(satellite: string, j2000_seconds: Float64Array): Sp3Interpolation;
5110
+ /**
5111
+ * Query ECEF position and optional clock for parallel satellite and epoch
5112
+ * arrays against this parsed SP3 product.
5113
+ *
5114
+ * `satellites[i]` is evaluated at `epochsJ2000S[i]`, where epochs are
5115
+ * seconds since J2000 in the product time scale. The returned plain object
5116
+ * has aligned `positionsEcefM`, `clocksS`, `statuses`, and
5117
+ * `elementResults` arrays. Failed elements use the core missing-position
5118
+ * sentinel and carry the scalar engine error in `elementResults[i].error`.
5119
+ */
5120
+ observableStatesAtJ2000S(satellites: any, epochs_j2000_s: any): any;
5121
+ /**
5122
+ * Query ECEF position and optional clock for many satellites at one epoch
5123
+ * against this parsed SP3 product.
5124
+ *
5125
+ * `epochJ2000S` is seconds since J2000 in the product time scale. The
5126
+ * returned object follows the same contract as
5127
+ * [`observableStatesAtJ2000S`](Self::observable_states_at_j2000_s).
5128
+ */
5129
+ observableStatesAtSharedJ2000S(satellites: any, epoch_j2000_s: number): any;
4709
5130
  /**
4710
5131
  * Predict geometric ranges for many `(satellite, receiver, epoch)` requests
4711
5132
  * against this ephemeris in one call. `requests` is an array of
@@ -5296,6 +5717,139 @@ export class SunMoon {
5296
5717
  readonly sun: Float64Array;
5297
5718
  }
5298
5719
 
5720
+ /**
5721
+ * Terrain datum conversion and optional geoid-grid loading error variants.
5722
+ */
5723
+ export enum TerrainDatumError {
5724
+ /**
5725
+ * Terrain lookup failed before datum conversion.
5726
+ */
5727
+ Terrain = 0,
5728
+ /**
5729
+ * A geoid grid could not be parsed.
5730
+ */
5731
+ Geoid = 1,
5732
+ /**
5733
+ * Reading a geoid grid failed for a reason other than absence.
5734
+ */
5735
+ Io = 2,
5736
+ /**
5737
+ * The EGM96 15-arcminute `WW15MGH.DAC` grid was requested but is absent.
5738
+ */
5739
+ MissingEgm96Dac = 3,
5740
+ }
5741
+
5742
+ /**
5743
+ * Geoid model used to convert terrain orthometric height `H` to ellipsoidal
5744
+ * height `h`.
5745
+ */
5746
+ export class TerrainGeoidModel {
5747
+ private constructor();
5748
+ free(): void;
5749
+ [Symbol.dispose](): void;
5750
+ /**
5751
+ * Use a caller-supplied EGM96 15-arcminute geoid grid for `h = H + N`.
5752
+ */
5753
+ static egm96FifteenMinute(geoid: Egm96FifteenMinuteGeoid): TerrainGeoidModel;
5754
+ /**
5755
+ * Use the embedded EGM96 1-degree geoid grid for `h = H + N`.
5756
+ */
5757
+ static egm96OneDegree(): TerrainGeoidModel;
5758
+ /**
5759
+ * Model discriminator: `"egm96OneDegree"` or `"egm96FifteenMinute"`.
5760
+ */
5761
+ readonly kind: string;
5762
+ }
5763
+
5764
+ /**
5765
+ * Terrain store conversion, serialization, and parsing error variants.
5766
+ */
5767
+ export enum TerrainStoreError {
5768
+ /**
5769
+ * File or directory I/O failed.
5770
+ */
5771
+ Io = 0,
5772
+ /**
5773
+ * DTED or terrain store bytes could not be parsed.
5774
+ */
5775
+ Parse = 1,
5776
+ /**
5777
+ * The terrain store version is not supported.
5778
+ */
5779
+ UnsupportedVersion = 2,
5780
+ /**
5781
+ * The terrain store datum tag is not supported.
5782
+ */
5783
+ UnsupportedDatum = 3,
5784
+ /**
5785
+ * Two input DTED files resolved to the same integer tile id.
5786
+ */
5787
+ DuplicateTile = 4,
5788
+ /**
5789
+ * A tile payload checksum did not match its index record.
5790
+ */
5791
+ Checksum = 5,
5792
+ }
5793
+
5794
+ /**
5795
+ * Metadata for one tile index record in a memory-mappable terrain store.
5796
+ */
5797
+ export class TerrainStoreTileIndex {
5798
+ private constructor();
5799
+ free(): void;
5800
+ [Symbol.dispose](): void;
5801
+ /**
5802
+ * FNV-1a checksum of this tile's posting payload bytes.
5803
+ */
5804
+ readonly checksum64: bigint;
5805
+ /**
5806
+ * Byte length of this tile's posting payload in the store.
5807
+ */
5808
+ readonly dataLen: bigint;
5809
+ /**
5810
+ * Byte offset of this tile's posting payload in the store.
5811
+ */
5812
+ readonly dataOffset: bigint;
5813
+ /**
5814
+ * Number of latitude postings.
5815
+ */
5816
+ readonly latCount: number;
5817
+ /**
5818
+ * Integer latitude tile id, for example `36` for a tile covering
5819
+ * `36..37` degrees.
5820
+ */
5821
+ readonly latIndex: number;
5822
+ /**
5823
+ * Number of longitude postings.
5824
+ */
5825
+ readonly lonCount: number;
5826
+ /**
5827
+ * Integer longitude tile id, for example `-107` for a tile covering
5828
+ * `-107..-106` degrees.
5829
+ */
5830
+ readonly lonIndex: number;
5831
+ /**
5832
+ * Northern edge latitude, degrees.
5833
+ */
5834
+ readonly maxLatitudeDeg: number;
5835
+ /**
5836
+ * Eastern edge longitude, degrees.
5837
+ */
5838
+ readonly maxLongitudeDeg: number;
5839
+ /**
5840
+ * Southern edge latitude, degrees.
5841
+ */
5842
+ readonly minLatitudeDeg: number;
5843
+ /**
5844
+ * Western edge longitude, degrees.
5845
+ */
5846
+ readonly minLongitudeDeg: number;
5847
+ /**
5848
+ * Vertical datum for this tile's orthometric posting payload.
5849
+ */
5850
+ readonly verticalDatum: VerticalDatum;
5851
+ }
5852
+
5299
5853
  /**
5300
5854
  * A named time scale. The JS value matches the variant order below.
5301
5855
  */
@@ -5555,6 +6109,16 @@ export class VelocitySolution {
5555
6109
  readonly velocityMS: Float64Array;
5556
6110
  }
5557
6111
 
6112
+ /**
6113
+ * Vertical datum carried by a terrain store.
6114
+ */
6115
+ export enum VerticalDatum {
6116
+ /**
6117
+ * Orthometric height `H` in metres above the EGM96 mean sea level geoid.
6118
+ */
6119
+ Egm96MslOrthometric = 0,
6120
+ }
6121
+
5558
6122
  /**
5559
6123
  * Per-epoch topocentric visibility plus the dense pass list over the grid
5560
6124
  * window.
@@ -5678,6 +6242,50 @@ export class ZenithDelay {
5678
6242
  */
5679
6243
  export function acquire(samples: Float64Array, prn: bigint, options: any): AcquisitionResult;
5680
6244
 
6245
+ /**
6246
+ * Plain non-overlapping Allan deviation for explicit averaging factors.
6247
+ *
6248
+ * `series` is `{ kind, values }`, where `kind` is `"phaseSeconds"` or
6249
+ * `"fractionalFrequency"` and `values` are phase seconds or dimensionless
6250
+ * fractional-frequency samples. `tau0S` is the sample interval in seconds.
6251
+ * `averagingFactors` is an array of positive integer `m` values. Returns
6252
+ * `{ tauS, deviation, n }`.
6253
+ */
6254
+ export function allanDeviation(series: any, tau0_s: number, averaging_factors: any): any;
6255
+
6256
+ /**
6257
+ * Alpha-beta measurement update applied to a predicted scalar state.
6258
+ *
6259
+ * `predicted` is `{ level, rate }`, `measurement` has the same unit as
6260
+ * `level`, `dt` is seconds, and `gains` is `{ alpha, beta }`.
6261
+ */
6262
+ export function alphaBetaApplyMeasurement(predicted: any, measurement: number, dt: number, gains: any): any;
6263
+
6264
+ /**
6265
+ * Run one alpha-beta predict and measurement update.
6266
+ *
6267
+ * `state` is `{ level, rate }`, `measurement` has the same unit as `level`,
6268
+ * `dt` is seconds, and `gains` is `{ alpha, beta }`. Returns `{ predicted,
6269
+ * updated, innovation }`.
6270
+ */
6271
+ export function alphaBetaFilterStep(state: any, measurement: number, dt: number, gains: any): any;
6272
+
6273
+ /**
6274
+ * Alpha-beta constant-rate prediction.
6275
+ *
6276
+ * `state` is `{ level, rate }` and `dt` is the positive propagation interval in
6277
+ * seconds. Returns the predicted `{ level, rate }`.
6278
+ */
6279
+ export function alphaBetaPredict(state: any, dt: number): any;
6280
+
6281
+ /**
6282
+ * Steady-state alpha-beta gains from a positive tracking index.
6283
+ *
6284
+ * Returns `{ alpha, beta }`, where `alpha` is the level gain and `beta` maps
6285
+ * innovation to rate through `beta * innovation / dt`.
6286
+ */
6287
+ export function alphaBetaSteadyStateGains(tracking_index: number): any;
6288
+
5681
6289
  /**
5682
6290
  * On-sky angle in degrees between two direction vectors.
5683
6291
  */
@@ -5688,6 +6296,38 @@ export function angularSeparation(a: Float64Array, b: Float64Array): number;
5688
6296
  */
5689
6297
  export function angularSeparationCoords(a_lon_deg: number, a_lat_deg: number, b_lon_deg: number, b_lat_deg: number): number;
5690
6298
 
6299
+ /**
6300
+ * Run ARAIM MHSS protection-level computation.
6301
+ *
6302
+ * `geometry.rows` contains satellite IDs, ECEF line-of-sight unit vectors,
6303
+ * optional constellation labels, and elevations in radians. `receiver` is WGS84
6304
+ * geodetic radians plus ellipsoidal height meters. `ism` contains
6305
+ * constellation defaults and optional satellite overrides. Satellite models may
6306
+ * provide paired `effectiveSigmaIntM` and `effectiveSigmaAccM` fields; omit both
6307
+ * to let the core derive them from elevation. `allocation` may be omitted to use
6308
+ * `araimLpv200Allocation()`. Returned `hplM`, `vplM`, `sigmaAccHM`,
6309
+ * `sigmaAccVM`, `emtM`, and per-mode ENU arrays are meters.
6310
+ */
6311
+ export function araim(geometry: any, ism: any, allocation: any): any;
6312
+
6313
+ /**
6314
+ * Enumerate ARAIM fault hypotheses for the given geometry, ISM, and allocation.
6315
+ *
6316
+ * Inputs mirror `araim`. The returned priors are probabilities. Excluded
6317
+ * satellites are string tokens such as `"G01"`, and excluded constellations are
6318
+ * labels such as `"GPS"`.
6319
+ */
6320
+ export function araimFaultModes(geometry: any, ism: any, allocation: any): any;
6321
+
6322
+ /**
6323
+ * LPV-200 ARAIM integrity and continuity allocation.
6324
+ *
6325
+ * The returned object can be passed to `araim`. Probability fields are
6326
+ * dimensionless, `pEmt` defaults to `1e-5`, and `maxFaultOrder` is an integer
6327
+ * fault order.
6328
+ */
6329
+ export function araimLpv200Allocation(): any;
6330
+
5691
6331
  /**
5692
6332
  * Evaluate NRLMSISE-00 neutral-atmosphere density and temperature.
5693
6333
  *
@@ -5752,6 +6392,38 @@ export function carrierBandName(band: CarrierBand): string;
5752
6392
  */
5753
6393
  export function carrierFrequencyHz(system: GnssSystem, band: CarrierBand): number | undefined;
5754
6394
 
6395
+ /**
6396
+ * CA-CFAR false alarm probability from searched-cell count, absolute
6397
+ * threshold, and mean noise level.
6398
+ */
6399
+ export function cfarCaFalseAlarmProbability(searched_cells: number, threshold: number, noise_level: number): number;
6400
+
6401
+ /**
6402
+ * CA-CFAR threshold multiplier from searched-cell count and target false alarm
6403
+ * probability.
6404
+ */
6405
+ export function cfarCaMultiplierFromPfa(searched_cells: number, false_alarm_probability: number): number;
6406
+
6407
+ /**
6408
+ * CA-CFAR false alarm probability from searched-cell count and multiplier.
6409
+ */
6410
+ export function cfarCaPfaFromMultiplier(searched_cells: number, multiplier: number): number;
6411
+
6412
+ /**
6413
+ * CA-CFAR absolute threshold from searched-cell count, target false alarm
6414
+ * probability, and mean noise level.
6415
+ */
6416
+ export function cfarCaThreshold(searched_cells: number, false_alarm_probability: number, noise_level: number): number;
6417
+
6418
+ /**
6419
+ * Compute the closed-form Chan-Ho seed used by [`locateSource`].
6420
+ *
6421
+ * `mode` is `"toa"`, `"tdoa"`, or `{ mode: "tdoa", referenceSensor }`.
6422
+ * Per-sensor speed overrides are not used by the closed-form equations, but
6423
+ * they are used by [`locateSource`] during iterative refinement.
6424
+ */
6425
+ export function chanHoInitialGuess(sensors: any, arrival_times_s: any, propagation_speed_m_s: number, mode: any): any;
6426
+
5755
6427
  /**
5756
6428
  * Returns `true` when a diff has any findings.
5757
6429
  */
@@ -5805,6 +6477,20 @@ export function coherentLossDb(freq_error_hz: number, integration_time_s: number
5805
6477
  */
5806
6478
  export function collisionProbability(object1: ConjunctionState, object2: ConjunctionState, hard_body_radius_km: number, method?: string | null): CollisionProbability;
5807
6479
 
6480
+ /**
6481
+ * Compute one or more Allan-family curves with a selected tau grid and gap
6482
+ * policy.
6483
+ *
6484
+ * `input` is `{ series, tau0S, options? }`. `series.kind` may be
6485
+ * `"phaseSeconds"`, `"fractionalFrequency"`, `"phaseSecondsWithGaps"`, or
6486
+ * `"fractionalFrequencyWithGaps"`; gap series use `null` for missing samples.
6487
+ * `options.estimators` is `"standard"`, `"all"`, `"none"`, or a boolean flag
6488
+ * object. `options.tauGrid` is `"octave"`, `"all"`, or
6489
+ * `{ kind: "explicit", averagingFactors }`. `tau0S` and all returned `tauS`
6490
+ * values are seconds.
6491
+ */
6492
+ export function computeAllanDeviations(input: any): any;
6493
+
5808
6494
  /**
5809
6495
  * Coherently correlate interleaved IQ samples against a GPS C/A PRN replica.
5810
6496
  * `iq` is `[i0, q0, i1, q1, ...]`.
@@ -5902,6 +6588,14 @@ export function decodeRtcmMessage(body: Uint8Array): any;
5902
6588
  */
5903
6589
  export function decodeRtcmStream(bytes: Uint8Array): any;
5904
6590
 
6591
+ /**
6592
+ * Decode a raw SBAS message.
6593
+ *
6594
+ * `form` is `"framed250"` for a 32-byte message with CRC or `"body226"` for a
6595
+ * 29-byte body. The result contains `messageType`, `form`, legacy debug
6596
+ * `kind`, and `message`, a structured decoded payload. Parse failures are
6597
+ * thrown as `Error`.
6598
+ */
5905
6599
  export function decodeSbasMessage(bytes: Uint8Array, form?: string | null): any;
5906
6600
 
5907
6601
  export function decodeSsr(bytes: Uint8Array, framed?: boolean | null): any;
@@ -5985,6 +6679,14 @@ export function dopplerShift(gcrs_position_km: Float64Array, gcrs_velocity_km_s:
5985
6679
  */
5986
6680
  export function dopplerToRangeRate(doppler_hz: number, carrier_hz: number): number;
5987
6681
 
6682
+ /**
6683
+ * Convert a DTED tile tree into canonical memory-mappable terrain store bytes.
6684
+ *
6685
+ * The returned `Uint8Array` can be passed to [`MmapTerrain.fromBytes`] or
6686
+ * [`MmapTerrain.fromVec`]. Posting payloads are decoded orthometric metres.
6687
+ */
6688
+ export function dtedTreeToMmapStore(root: string): Uint8Array;
6689
+
5988
6690
  /**
5989
6691
  * Angular radius in degrees of Earth as seen from each satellite position.
5990
6692
  */
@@ -6129,6 +6831,19 @@ export function estimateDecay(drag: DragForce, request: any): any;
6129
6831
  */
6130
6832
  export function estimateDecayWithSpaceWeather(drag: DragForce, table: SpaceWeatherTable, request: any): any;
6131
6833
 
6834
+ /**
6835
+ * Exponentially weighted moving-average update.
6836
+ *
6837
+ * `alpha` must be in `[0, 1]`; the returned value is
6838
+ * `previous + alpha * (sample - previous)`.
6839
+ */
6840
+ export function ewmaUpdate(previous: number, sample: number, alpha: number): number;
6841
+
6842
+ /**
6843
+ * EWMA update with `alpha = 1 / 2^shift`.
6844
+ */
6845
+ export function ewmaUpdatePowerOfTwo(previous: number, sample: number, shift: number): number;
6846
+
6132
6847
  /**
6133
6848
  * Find Moon elevation threshold crossings (moonrise / moonset) over a UTC
6134
6849
  * window.
@@ -6450,6 +7165,15 @@ export function gnssVisible(sp3: Sp3, station_ecef_m: Float64Array, j2000_second
6450
7165
  */
6451
7166
  export function gpsUtcOffsetS(year: number, month: number, day: number): number;
6452
7167
 
7168
+ /**
7169
+ * Overlapping Hadamard deviation for explicit averaging factors.
7170
+ *
7171
+ * `series` is `{ kind, values }`, `tau0S` is seconds, and
7172
+ * `averagingFactors` contains positive integer `m` values. Returns
7173
+ * `{ tauS, deviation, n }`.
7174
+ */
7175
+ export function hadamardDeviation(series: any, tau0_s: number, averaging_factors: any): any;
7176
+
6453
7177
  /**
6454
7178
  * Trace of the Gauss-Newton Hessian approximation `J^T J`: the sum of the
6455
7179
  * squared column norms of the Jacobian, with no inverse formed.
@@ -6490,6 +7214,28 @@ export function iodGibbs(r1: Float64Array, r2: Float64Array, r3: Float64Array):
6490
7214
  */
6491
7215
  export function iodHerrickGibbs(r1: Float64Array, r2: Float64Array, r3: Float64Array, jd1: number, jd2: number, jd3: number): IodVelocity;
6492
7216
 
7217
+ /**
7218
+ * Build an IONEX vertical-TEC product from flat node samples.
7219
+ *
7220
+ * `samples` is an array of `{ epochJ2000S, latDeg, lonDeg, vtecTecu,
7221
+ * rmsTecu? }` objects. Epochs are integer seconds since J2000, coordinates are
7222
+ * degrees, and TEC/RMS values are TECU. `shellHeightKm` and `baseRadiusKm` are
7223
+ * kilometers. Validation errors from the core sample builder are thrown as
7224
+ * `RangeError`.
7225
+ */
7226
+ export function ionexFromNodeSamples(samples: any, shell_height_km: number, base_radius_km: number, exponent: number): Ionex;
7227
+
7228
+ /**
7229
+ * Build an IONEX vertical-TEC product from full-grid samples.
7230
+ *
7231
+ * `samples.mapEpochsJ2000S` are integer seconds since J2000. Latitude and
7232
+ * longitude nodes and `dlatDeg` / `dlonDeg` are degrees. `tecMaps` and
7233
+ * `rmsMaps` are TECU and indexed `[map][iLat][iLon]`. The shell height and
7234
+ * base radius are kilometers. Validation errors from the core sample builder
7235
+ * are thrown as `RangeError`.
7236
+ */
7237
+ export function ionexFromSamples(samples: any): Ionex;
7238
+
6493
7239
  /**
6494
7240
  * Ionosphere-free code or meter-valued phase combination, metres.
6495
7241
  */
@@ -6539,6 +7285,15 @@ export function j2000SecondsToCivil(seconds: bigint): CivilDateTime;
6539
7285
  */
6540
7286
  export function jarqueBera(x: Float64Array): any;
6541
7287
 
7288
+ /**
7289
+ * Steady-state gains for a scalar constant-velocity Kalman filter.
7290
+ *
7291
+ * `trackingIndex`, `dt`, and `measurementVariance` must be positive. Returns
7292
+ * `{ positionGain, rateGain }`; `rateGain * dt` equals the alpha-beta `beta`
7293
+ * gain for the same tracking index.
7294
+ */
7295
+ export function kalmanCvSteadyStateGains(tracking_index: number, dt: number, measurement_variance: number): any;
7296
+
6542
7297
  /**
6543
7298
  * GPS broadcast Klobuchar ionospheric group delay in the model's native units
6544
7299
  * (positive metres).
@@ -6751,12 +7506,38 @@ export function loadRinexObs(bytes: Uint8Array): RinexObs;
6751
7506
  */
6752
7507
  export function loadSp3(bytes: Uint8Array): Sp3;
6753
7508
 
7509
+ /**
7510
+ * Locate a source from sensor arrival times.
7511
+ *
7512
+ * `sensors` is an array of `{ positionM, propagationSpeedMS? }`; each
7513
+ * `positionM` is a 2D or 3D Cartesian metre vector and all sensors must share
7514
+ * the same dimension. `arrivalTimesS` is an aligned seconds array,
7515
+ * `propagationSpeedMS` is the call-level speed in metres per second, and
7516
+ * `options` may include `mode`, `referenceSensor`, `timingSigmaS`, `loss`,
7517
+ * `fScaleS`, `ftol`, `xtol`, `gtol`, and `maxNfev`.
7518
+ */
7519
+ export function locateSource(sensors: any, arrival_times_s: any, propagation_speed_m_s: number, options: any): any;
7520
+
6754
7521
  export function lunarSolarEclipses(start_unix_us: bigint, end_unix_us: bigint, step_s: number, tolerance_s: number): any;
6755
7522
 
6756
7523
  export function lunarSolarEclipsesSpk(spk: Spk, start_unix_us: bigint, end_unix_us: bigint, step_s: number, tolerance_s: number): any;
6757
7524
 
6758
7525
  export function lvlhRotation(position_km: Float64Array, velocity_km_s: Float64Array): Float64Array;
6759
7526
 
7527
+ /**
7528
+ * Gaussian consistency factor applied by [`madSpread`].
7529
+ */
7530
+ export function madGaussianConsistency(): number;
7531
+
7532
+ /**
7533
+ * Median absolute deviation spread estimate.
7534
+ *
7535
+ * `values` is a JS number array. The returned spread is
7536
+ * `MAD_GAUSSIAN_CONSISTENCY * median(abs(value - median(values)))`, floored by
7537
+ * `scaleFloor`.
7538
+ */
7539
+ export function madSpread(values: any, scale_floor: number): number;
7540
+
6760
7541
  export function meanMotionCircular(radius_km: number): number;
6761
7542
 
6762
7543
  export function meanMotionFromState(position_km: Float64Array, velocity_km_s: Float64Array): number;
@@ -6799,6 +7580,15 @@ export function meridianTransits(body: string, station: any, start_unix_us: bigi
6799
7580
 
6800
7581
  export function meridianTransitsSpk(spk: Spk, body: string, station: any, start_unix_us: bigint, end_unix_us: bigint, step_s: number, tolerance_s: number): any;
6801
7582
 
7583
+ /**
7584
+ * Modified Allan deviation for explicit averaging factors.
7585
+ *
7586
+ * `series` is `{ kind, values }`, `tau0S` is seconds, and
7587
+ * `averagingFactors` contains positive integer `m` values. Returns
7588
+ * `{ tauS, deviation, n }`.
7589
+ */
7590
+ export function modifiedAdev(series: any, tau0_s: number, averaging_factors: any): any;
7591
+
6802
7592
  /**
6803
7593
  * Mean, variance, skewness, and excess kurtosis of a residual set in one pass.
6804
7594
  *
@@ -6881,6 +7671,28 @@ export function nequickGDelayM(_eval: any, frequency_hz: number): number;
6881
7671
  */
6882
7672
  export function nequickGStecTecu(_eval: any): number;
6883
7673
 
7674
+ /**
7675
+ * Scalar normalized innovation squared statistic.
7676
+ */
7677
+ export function nis(innovation: number, innovation_variance: number): number;
7678
+
7679
+ /**
7680
+ * Bar-Shalom expected NIS value for `dof` measurement degrees of freedom.
7681
+ */
7682
+ export function nisExpectedValue(dof: number): number;
7683
+
7684
+ /**
7685
+ * Test a scalar innovation against a chi-square NIS gate.
7686
+ *
7687
+ * Returns `{ nis, threshold, inGate, dof }`, with `confidence` in `(0, 1)`.
7688
+ */
7689
+ export function nisGate(innovation: number, innovation_variance: number, dof: number, confidence: number): any;
7690
+
7691
+ /**
7692
+ * Chi-square NIS gate threshold for `dof` and confidence probability.
7693
+ */
7694
+ export function nisGateThreshold(dof: number, confidence: number): number;
7695
+
6884
7696
  /**
6885
7697
  * Parse bytes and return grouped epoch snapshots directly.
6886
7698
  */
@@ -6911,11 +7723,26 @@ export function noiseAmplification(f1_hz: number, f2_hz: number): number;
6911
7723
  */
6912
7724
  export function normalCovariance(jacobian: Float64Array, m: number, n: number, variance_scale: number): Float64Array;
6913
7725
 
7726
+ /**
7727
+ * Scalar normalized innovation `innovation / sqrt(innovationVariance)`.
7728
+ */
7729
+ export function normalizedInnovation(innovation: number, innovation_variance: number): number;
7730
+
6914
7731
  /**
6915
7732
  * Build the NTRIP connection request bytes for a config object.
6916
7733
  */
6917
7734
  export function ntripRequestBytes(config: any): Uint8Array;
6918
7735
 
7736
+ /**
7737
+ * Missing-position sentinel used in failed observable-state batch elements.
7738
+ *
7739
+ * The returned JS value is `[NaN, NaN, NaN]`, matching
7740
+ * `sidereon_core::ephemeris::OBSERVABLE_STATE_MISSING_POSITION_ECEF_M`. Always
7741
+ * check `elementResults[i].ok` or `statuses[i]` before using
7742
+ * `positionsEcefM[i]`.
7743
+ */
7744
+ export function observableStateMissingPositionEcefM(): any;
7745
+
6919
7746
  /**
6920
7747
  * Predict observables for one satellite from a broadcast ephemeris store.
6921
7748
  * Delegates to `sidereon_core::observables::predict`.
@@ -6974,6 +7801,15 @@ export function oceanTideLoading(station_ecef_m: Float64Array, year: number, mon
6974
7801
  */
6975
7802
  export function orthometricHeightM(ellipsoidal_height_m: number, lat_rad: number, lon_rad: number): number;
6976
7803
 
7804
+ /**
7805
+ * Fully overlapping Allan deviation for explicit averaging factors.
7806
+ *
7807
+ * `series` is `{ kind, values }`, `tau0S` is seconds, and
7808
+ * `averagingFactors` contains positive integer `m` values. Returns
7809
+ * `{ tauS, deviation, n }`.
7810
+ */
7811
+ export function overlappingAdev(series: any, tau0_s: number, averaging_factors: any): any;
7812
+
6977
7813
  /**
6978
7814
  * Parallactic angle (degrees) of a target at a station.
6979
7815
  *
@@ -7365,6 +8201,12 @@ export function sampleBroadcastEphemeris(broadcast: BroadcastEphemeris, satellit
7365
8201
 
7366
8202
  export function sampleSp3Ephemeris(sp3: Sp3, satellites: string[], start_j2000_s: number, stop_j2000_s: number, step_s: number): any;
7367
8203
 
8204
+ /**
8205
+ * Convert an SBAS satellite token such as `"S29"` to broadcast PRN number
8206
+ * such as `129`. Returns `null` for non-SBAS satellites.
8207
+ */
8208
+ export function satToSbasPrn(sat: string): any;
8209
+
7368
8210
  /**
7369
8211
  * Apparent visual magnitude of a sunlit body from a diffuse-sphere phase law.
7370
8212
  *
@@ -7376,8 +8218,20 @@ export function sampleSp3Ephemeris(sp3: Sp3, satellites: string[], start_j2000_s
7376
8218
  */
7377
8219
  export function satelliteVisualMagnitude(range_km: number, phase_angle_deg: number, standard_magnitude: number, reference_range_km: number): number;
7378
8220
 
8221
+ /**
8222
+ * SBAS-corrected broadcast satellite position and clock.
8223
+ *
8224
+ * Position is ECEF meters and clock is seconds at `tJ2000S`, seconds since
8225
+ * J2000. Returns `null` when the selected SBAS mode cannot provide a state.
8226
+ */
7379
8227
  export function sbasCorrectedState(broadcast: BroadcastEphemeris, store: SbasCorrectionStore, geo: string, sat: string, t_j2000_s: number, mode?: string | null): any;
7380
8228
 
8229
+ /**
8230
+ * Convert an SBAS broadcast PRN number such as `129` to an SBAS satellite
8231
+ * token such as `"S29"`. Returns `null` when the PRN is outside the SBAS range.
8232
+ */
8233
+ export function sbasPrnToSat(broadcast_prn: number): any;
8234
+
7381
8235
  /**
7382
8236
  * Screen a primary satellite against a secondary TLE catalog for threshold TCAs.
7383
8237
  *
@@ -7592,6 +8446,13 @@ export function solveRtkFixed(config: any): RtkFixedSolution;
7592
8446
  */
7593
8447
  export function solveRtkFloat(config: any): RtkFloatSolution;
7594
8448
 
8449
+ /**
8450
+ * Solve SPP using an SBAS-corrected broadcast source and optional SBAS iono.
8451
+ *
8452
+ * The returned solution uses the same units as `solveSpp`: ECEF meters,
8453
+ * receiver clock seconds, residual meters, and optional geodetic radians plus
8454
+ * ellipsoidal height meters.
8455
+ */
7595
8456
  export function solveSppSbas(broadcast: BroadcastEphemeris, store: SbasCorrectionStore, geo: string, request: any, mode?: string | null): SppSolution;
7596
8457
 
7597
8458
  /**
@@ -7631,6 +8492,33 @@ export function solveVelocityBroadcast(broadcast: BroadcastEphemeris, observatio
7631
8492
  */
7632
8493
  export function solveWithFallback(precise: Sp3[], broadcast: BroadcastEphemeris, request: any, policy: any): SourcedSolution;
7633
8494
 
8495
+ /**
8496
+ * Compute the timing Cramer-Rao lower bound for a proposed source position.
8497
+ *
8498
+ * The covariance is `(H^T H)^-1 * timingSigmaS^2`; position blocks are square
8499
+ * metres and origin-time variance is square seconds.
8500
+ */
8501
+ export function sourceCrlb(sensors: any, source_position_m: any, propagation_speed_m_s: number, timing_sigma_s: number): any;
8502
+
8503
+ /**
8504
+ * Compute timing DOP for a proposed source position.
8505
+ *
8506
+ * `sourcePositionM` is a 2D or 3D Cartesian metre vector in the same frame as
8507
+ * the sensors. The returned DOP values multiply timing sigma in seconds to
8508
+ * produce metres in the caller's Cartesian axes.
8509
+ */
8510
+ export function sourceDop(sensors: any, source_position_m: any, propagation_speed_m_s: number): any;
8511
+
8512
+ /**
8513
+ * Return the plain mode object for TDOA solves against `referenceSensor`.
8514
+ */
8515
+ export function sourceSolveModeTdoa(reference_sensor: number): any;
8516
+
8517
+ /**
8518
+ * Return the plain mode value for absolute time-of-arrival solves.
8519
+ */
8520
+ export function sourceSolveModeToa(): string;
8521
+
7634
8522
  /**
7635
8523
  * Extract a parsed SP3 product as the canonical precise-ephemeris samples, one
7636
8524
  * per real position record in ascending epoch order.
@@ -7738,6 +8626,20 @@ export function temeToGcrs(position_km: Float64Array, velocity_km_s: Float64Arra
7738
8626
  */
7739
8627
  export function terminatorLatitudeDeg(sub_solar_latitude_deg: number, sub_solar_longitude_deg: number, longitude_deg: number): number;
7740
8628
 
8629
+ /**
8630
+ * Return an FNV-1a checksum for terrain store bytes.
8631
+ */
8632
+ export function terrainStoreChecksum64(bytes: Uint8Array): bigint;
8633
+
8634
+ /**
8635
+ * Time deviation for explicit averaging factors.
8636
+ *
8637
+ * `series` is `{ kind, values }`, `tau0S` is seconds, and
8638
+ * `averagingFactors` contains positive integer `m` values. Returns
8639
+ * `{ tauS, deviation, n }`.
8640
+ */
8641
+ export function timeDeviation(series: any, tau0_s: number, averaging_factors: any): any;
8642
+
7741
8643
  /**
7742
8644
  * Short uppercase identifier for a time scale, e.g. `"GPST"`.
7743
8645
  */
@@ -7879,3 +8781,8 @@ export function wideLaneCycles(phi1_cycles: number, phi2_cycles: number, p1_m: n
7879
8781
  * Wide-lane wavelength `c / (f1 - f2)`, metres.
7880
8782
  */
7881
8783
  export function wideLaneWavelength(f1_hz: number, f2_hz: number): number;
8784
+
8785
+ /**
8786
+ * Convert a DTED tile tree and write canonical terrain store bytes to a path.
8787
+ */
8788
+ export function writeDtedTreeToMmapStore(root: string, out_path: string): void;