ootk 7.0.3 → 7.1.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.
package/dist/main.d.cts CHANGED
@@ -407,7 +407,9 @@ declare enum SensorType {
407
407
  /** Passive RF sensor (SIGINT, no transmission) */
408
408
  PASSIVE_RF = "PASSIVE_RF",
409
409
  /** Bistatic radio telescope */
410
- BISTATIC_RADIO_TELESCOPE = "BISTATIC_RADIO_TELESCOPE"
410
+ BISTATIC_RADIO_TELESCOPE = "BISTATIC_RADIO_TELESCOPE",
411
+ /** Telemetry, tracking, and command antenna (cooperative tracking dish) */
412
+ TT_C_ANTENNA = "TT_C_ANTENNA"
411
413
  }
412
414
 
413
415
  /**
@@ -2423,7 +2425,15 @@ declare abstract class GroundObject extends BaseObject {
2423
2425
  ecef(): EcefVec3<Kilometers>;
2424
2426
  /**
2425
2427
  * Calculates the Earth-Centered Inertial (ECI) position vector of the ground object at a given date.
2426
- * @variation optimized version of this.toGeodetic().toITRF().toJ2000().position;
2428
+ *
2429
+ * Uses the WGS84 ellipsoid (the same {@link llaRad2ecef} position that `ecef()` and
2430
+ * `Satellite.rae()` use), rotated into TEME by GMST. It deliberately does not use the
2431
+ * spherical-Earth `lla2eci()`: at mid latitudes that puts the observer ~20 km away from
2432
+ * its WGS84 position, which skewed `Satellite.dopplerFactor()` by up to ~0.2 km/s of range
2433
+ * rate near closest approach.
2434
+ *
2435
+ * The result is in TEME (GMST rotation only), the frame `Satellite.eci()` returns. For J2000
2436
+ * use {@link toJ2000}, which also applies precession and nutation.
2427
2437
  * @param date The date for which to calculate the ECI position vector. Defaults to the current date.
2428
2438
  * @returns The ECI position vector of the ground object.
2429
2439
  */
@@ -2449,7 +2459,11 @@ declare abstract class GroundObject extends BaseObject {
2449
2459
  toGeodetic(): Geodetic;
2450
2460
  /**
2451
2461
  * Converts the ground position to J2000 inertial coordinates.
2452
- * Ground objects have zero velocity in the inertial frame (ignoring Earth rotation).
2462
+ *
2463
+ * The site is placed on the WGS84 ellipsoid in ITRF and rotated into J2000 with the full
2464
+ * precession, nutation and sidereal-time chain ({@link ITRF.toJ2000}), so it is in the same
2465
+ * frame as `Satellite.toJ2000()`. The velocity is the Earth-rotation velocity (omega x r,
2466
+ * ~0.46 km/s at the equator): a ground site is fixed in ITRF, not in inertial space.
2453
2467
  * @param date - The date for the conversion (defaults to now)
2454
2468
  * @returns J2000 state vector
2455
2469
  */
@@ -2756,6 +2770,13 @@ declare abstract class FormatTle {
2756
2770
  * Format a value in TLE exponential notation for BSTAR or mean motion ddot.
2757
2771
  * Format: "sNNNNN±N" (8 chars) where mantissa has implied leading decimal point.
2758
2772
  * Example: 0.00017507 → " 17507-3" (i.e., .17507 × 10^-3)
2773
+ *
2774
+ * The result is ALWAYS exactly 8 characters. The field has room for a 5-digit
2775
+ * mantissa and a single-digit exponent, so values needing more are folded into
2776
+ * what the format can express: magnitudes below 1e-10 become zero (the usual
2777
+ * convention for a drag term too small to write), and the 1e9-and-up case is
2778
+ * saturated. Anything longer would push every later column of TLE line 1 to the
2779
+ * right, which silently corrupts ephemeris type, element number and checksum.
2759
2780
  * @param value - The value to format
2760
2781
  * @returns Formatted 8-character string
2761
2782
  */
@@ -3305,6 +3326,48 @@ interface OmmParsedDataFormat {
3305
3326
  };
3306
3327
  }
3307
3328
 
3329
+ /**
3330
+ * @author Theodore Kruczek
3331
+ * @license AGPL-3.0-or-later
3332
+ * @copyright (c) 2025-2026 Kruczek Labs LLC
3333
+ *
3334
+ * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
3335
+ * terms of the GNU Affero General Public License as published by the Free Software
3336
+ * Foundation, either version 3 of the License, or (at your option) any later version.
3337
+ *
3338
+ * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
3339
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
3340
+ * See the GNU Affero General Public License for more details.
3341
+ *
3342
+ * You should have received a copy of the GNU Affero General Public License along with
3343
+ * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
3344
+ */
3345
+
3346
+ /**
3347
+ * The subset of {@link Sgp4WasmBase} the `Sgp4` class needs to route
3348
+ * propagation through the USSF Astro Standards wasm build. Structural, so
3349
+ * this module never imports `external/` at runtime and any loaded
3350
+ * `Sgp4Wasm`/`Sgp4XpWasm` instance satisfies it.
3351
+ */
3352
+ interface Sgp4WasmBackendLike {
3353
+ readonly isLoaded: boolean;
3354
+ addSat(line1: string, line2: string): bigint;
3355
+ initSats(satKeys: readonly bigint[]): void;
3356
+ propagateOnePosVelFast(satKey: bigint, minutesSinceEpoch: number): {
3357
+ err: number;
3358
+ position: {
3359
+ x: number;
3360
+ y: number;
3361
+ z: number;
3362
+ };
3363
+ velocity: {
3364
+ x: number;
3365
+ y: number;
3366
+ z: number;
3367
+ };
3368
+ };
3369
+ }
3370
+
3308
3371
  /**
3309
3372
  * @author Theodore Kruczek
3310
3373
  * @description Orbital Object ToolKit (ootk) is a collection of tools for working
@@ -3333,6 +3396,37 @@ declare enum Sgp4GravConstants {
3333
3396
  wgs84 = "wgs84"
3334
3397
  }
3335
3398
  declare class Sgp4 {
3399
+ /**
3400
+ * Routes all subsequent `createSatrec`/`propagate` calls in this JavaScript
3401
+ * context through the USSF Astro Standards SGP4 wasm build instead of the
3402
+ * pure-TypeScript implementation. Pass a loaded `Sgp4Wasm` or `Sgp4XpWasm`
3403
+ * instance (see `src/external/`).
3404
+ *
3405
+ * satKeys are attached to satrecs lazily on first propagation, so the
3406
+ * backend can be activated before or after satrecs are created. Satrecs
3407
+ * without TLE lines (e.g. built from an OMM) and TLEs the wasm library
3408
+ * rejects fall back to the TypeScript implementation permanently.
3409
+ * @param wasm A loaded wasm SGP4 instance.
3410
+ */
3411
+ static useWasmBackend(wasm: Sgp4WasmBackendLike): void;
3412
+ /**
3413
+ * Restores the pure-TypeScript SGP4 implementation.
3414
+ */
3415
+ static clearWasmBackend(): void;
3416
+ /**
3417
+ * Whether propagation is currently routed through a wasm backend.
3418
+ */
3419
+ static get isWasmBackendActive(): boolean;
3420
+ /**
3421
+ * Diagnostic counters for the wasm backend: distinct TLEs attached to the
3422
+ * wasm registry vs permanently fallen back to the TypeScript
3423
+ * implementation. A growing fallback count means part of the catalog is
3424
+ * still propagating in TypeScript.
3425
+ */
3426
+ static get wasmBackendStats(): {
3427
+ attached: number;
3428
+ fallback: number;
3429
+ };
3336
3430
  private static angle_;
3337
3431
  private static asinh_;
3338
3432
  static createSatrec(tleLine1: string, tleLine2: string, whichconst?: Sgp4GravConstants, opsmode?: Sgp4OpsMode): SatelliteRecord;
@@ -4805,8 +4899,13 @@ declare class Satellite extends SpaceObject {
4805
4899
  */
4806
4900
  az(observer: GroundObject, date?: Date): Degrees | null;
4807
4901
  /**
4808
- * Calculates the RAE (Range, Azimuth, Elevation) values for a given sensor and date. If no date is provided, the
4809
- * current time is used.
4902
+ * Calculates the RAE (Range, Azimuth, Elevation) values and their rates for a given sensor
4903
+ * and date. If no date is provided, the current time is used.
4904
+ *
4905
+ * The rates are central differences of `rae()` over +/-0.5 s, stored in the units the
4906
+ * {@link RAE} class expects: km/s for range rate and rad/s for the angle rates (read them
4907
+ * in deg/s with `azRate` / `elRate`). The azimuth change is wrapped so a pass through
4908
+ * north does not produce a 360 deg jump.
4810
4909
  * @variation expanded
4811
4910
  * @param observer - The observer's position on the ground.
4812
4911
  * @param date - The date at which to calculate the RAE values. Optional, defaults to the current date.
@@ -5167,11 +5266,12 @@ declare class Satellite extends SpaceObject {
5167
5266
  /**
5168
5267
  * Calculates the angle between this satellite, another satellite, and the Sun.
5169
5268
  *
5170
- * Returns the angle at this satellite between the vector to the other satellite
5171
- * and the vector to the Sun.
5269
+ * Returns the angle at the OTHER satellite between its vector to the Sun and its vector
5270
+ * to this satellite: the solar phase angle of `other` as seen from this satellite
5271
+ * (0 = fully lit face toward this satellite, pi = backlit).
5172
5272
  *
5173
5273
  * @param other - The other satellite.
5174
- * @param sunPosition - The Sun's ECI position vector.
5274
+ * @param sunPosition - The Sun's position in TEME (the frame of `eci()`), km.
5175
5275
  * @param date - The date for the calculation.
5176
5276
  * @returns The angle in radians.
5177
5277
  * @throws Error if positions are undefined.
@@ -5877,6 +5977,7 @@ declare enum SpaceObjectType {
5877
5977
  DWARF_PLANET = 36,
5878
5978
  MOON = 37,
5879
5979
  DYNAMIC_GROUND_OBJECT = 38,
5980
+ ASTEROID = 39,
5880
5981
  MAX_SPACE_OBJECT_TYPE = 40
5881
5982
  }
5882
5983
  /**
@@ -6440,6 +6541,26 @@ declare class FieldOfView {
6440
6541
  * @returns True if within FOV
6441
6542
  */
6442
6543
  containsDirection(direction: Vector3D, range: Kilometers): boolean;
6544
+ /**
6545
+ * Samples a unit direction on or inside the FOV cone.
6546
+ *
6547
+ * The cone cross-section is parameterized like a standard 2D ellipse in
6548
+ * angular (gnomonic) space: x = halfAngle * cos(t), y = minorHalfAngle * sin(t),
6549
+ * where x is the off-boresight angle along the major axis (u) and y along the
6550
+ * minor axis (v). Uniform steps in t produce well-distributed boundary points
6551
+ * even for highly eccentric fans (e.g., an 80° x 1° fence radar), unlike
6552
+ * uniform steps in the geometric position angle which clump at the fan tips.
6553
+ *
6554
+ * Points sampled with radialFraction < 1 always satisfy the elliptical cone
6555
+ * containment check; radialFraction = 1 lies exactly on the boundary.
6556
+ *
6557
+ * @param t - Parametric ellipse angle in radians. t=0 points along the major
6558
+ * axis (+u), t=PI/2 along the minor axis (+v). Note this is NOT the
6559
+ * geometric position angle around the boresight.
6560
+ * @param radialFraction - 0 = boresight, 1 = cone boundary (default: 1)
6561
+ * @returns Unit direction vector in the FOV's reference frame (ENU for topocentric)
6562
+ */
6563
+ directionAt(t: Radians, radialFraction?: number): Vector3D;
6443
6564
  /**
6444
6565
  * Gets the effective minimum elevation at a given azimuth.
6445
6566
  * Considers all applicable elevation masks and returns the most restrictive.
@@ -7204,6 +7325,16 @@ declare class PhasedArrayRadar extends RadarSensor {
7204
7325
  * @returns Best face index, or -1 if no face is within 90° of target
7205
7326
  */
7206
7327
  getBestFace(az: Degrees, el: Degrees): number;
7328
+ /**
7329
+ * Great-circle angle between a look direction and a face's boresight, in degrees.
7330
+ * (The face checks used sqrt(dAz^2 + dEl^2) with no azimuth wrap: 359 deg missed a 0 deg
7331
+ * face, and azimuth differences were not shrunk by cos(elevation).)
7332
+ * @param az - Target azimuth in degrees
7333
+ * @param el - Target elevation in degrees
7334
+ * @param face - Face index
7335
+ * @returns Angle from boresight in degrees
7336
+ */
7337
+ private angleFromBoresight_;
7207
7338
  protected serializeSpecific(): Record<string, unknown>;
7208
7339
  /**
7209
7340
  * Creates a deep copy of this phased array radar.
@@ -7238,12 +7369,13 @@ declare class PhasedArrayRadar extends RadarSensor {
7238
7369
  */
7239
7370
  declare function ecef2eci<T extends number>(ecef: EcefVec3<T>, gmst: number): TemeVec3<T>;
7240
7371
  /**
7241
- * Converts ECEF coordinates to ENU coordinates.
7242
- * @param ecef - The ECEF coordinates.
7243
- * @param lla - The LLA coordinates.
7372
+ * Rotates an ECEF vector into the local East-North-Up axes at `lla` (a rotation only: pass
7373
+ * a relative vector, e.g. target minus site, to get topocentric ENU).
7374
+ * @param ecef - The ECEF vector.
7375
+ * @param lla - The site latitude/longitude in RADIANS (geodetic).
7244
7376
  * @returns The ENU coordinates.
7245
7377
  */
7246
- declare function ecef2enu<T extends number>(ecef: EcefVec3<T>, lla: LlaVec3): EnuVec3<T>;
7378
+ declare function ecef2enu<T extends number>(ecef: EcefVec3<T>, lla: LlaVec3<Radians, number>): EnuVec3<T>;
7247
7379
  /**
7248
7380
  * Converts TEME (True Equator Mean Equinox) to ECEF (Earth-Centered Earth-Fixed) coordinates.
7249
7381
  *
@@ -7290,15 +7422,21 @@ declare function llaRad2ecef<AltitudeUnits extends number>(lla: LlaVec3<Radians,
7290
7422
  */
7291
7423
  declare function lla2ecef<AltitudeUnits extends number>(lla: LlaVec3<Degrees, AltitudeUnits>): EcefVec3<AltitudeUnits>;
7292
7424
  /**
7293
- * Converts geodetic coordinates (lat/lon/alt) to TEME (True Equator Mean Equinox) coordinates.
7425
+ * Places lat/lon/alt on a SPHERICAL Earth (radius `Earth.radiusMean`) and rotates it into
7426
+ * TEME by GMST.
7294
7427
  *
7295
- * **Coordinate Frame Transformation: Geodetic → TEME**
7428
+ * **Spherical-Earth helper, not a WGS84 site position.** The latitude is used as if it were
7429
+ * geocentric, so for a geodetic (WGS84) latitude the result is up to ~21 km from the true
7430
+ * position (about 7 km above the ellipsoid at the equator, 14 km below it at the poles, and
7431
+ * offset north-south at mid latitudes). It is meant for drawing on a spherical globe of
7432
+ * radius `Earth.radiusMean`.
7296
7433
  *
7297
- * Converts WGS84 geodetic coordinates to inertial TEME coordinates via ECEF
7298
- * and GMST rotation. Uses spherical Earth approximation (Earth.radiusMean).
7434
+ * For a physical site position (look angles, range, Doppler, orbit determination) use
7435
+ * `ecef2eci(llaRad2ecef(lla), gmst)` (WGS84, TEME), `GroundObject.eci()`, or
7436
+ * `GroundObject.toJ2000()` for J2000.
7299
7437
  *
7300
7438
  * @variation cached - results are cached
7301
- * @param lla - Geodetic coordinates (lat/lon in radians, alt in km)
7439
+ * @param lla - Latitude/longitude in radians and altitude above the sphere in km
7302
7440
  * @param gmst - Greenwich Mean Sidereal Time in radians
7303
7441
  * @returns TEME coordinates (inertial)
7304
7442
  */
@@ -7339,10 +7477,10 @@ declare function rae2ecef<D extends number>(rae: RaeVec3<D, Degrees>, lla: LlaVe
7339
7477
  declare function rae2eci<D extends number>(rae: RaeVec3<D, Degrees>, lla: LlaVec3<Degrees, D>, gmst: number): TemeVec3<D>;
7340
7478
  /**
7341
7479
  * Converts a vector in RAE (Range, Azimuth, Elevation) coordinates to ENU (East, North, Up) coordinates.
7342
- * @param rae - The vector in RAE coordinates.
7480
+ * @param rae - The vector in RAE coordinates, with azimuth and elevation in RADIANS.
7343
7481
  * @returns The vector in ENU coordinates.
7344
7482
  */
7345
- declare function rae2enu(rae: RaeVec3): EnuVec3<Kilometers>;
7483
+ declare function rae2enu(rae: RaeVec3<Kilometers, Radians>): EnuVec3<Kilometers>;
7346
7484
  /**
7347
7485
  * Converts South, East, and Zenith (SEZ) coordinates to Right Ascension, Elevation, and Range (RAE) coordinates.
7348
7486
  * @param sez The SEZ coordinates.
@@ -7873,9 +8011,19 @@ declare const spaceObjType2Str: (spaceObjType: SpaceObjectType) => string;
7873
8011
  * Calculates the Doppler factor for a given location, position, and velocity.
7874
8012
  * The Doppler factor is a measure of the change in frequency or wavelength of a wave
7875
8013
  * as observed by an observer moving relative to the source of the wave.
7876
- * @param location - The location vector of the observer.
7877
- * @param position - The position vector of the source.
7878
- * @param velocity - The velocity vector of the source.
8014
+ *
8015
+ * Returns `1 - rangeRate / c`, so observed = transmitted * factor: above 1 while the
8016
+ * source approaches, below 1 while it recedes.
8017
+ *
8018
+ * All three vectors must be in the same inertial frame (TEME, as from `Satellite.eci()`
8019
+ * and `GroundObject.eci()`), despite the `EcefVec3` parameter types: the observer is
8020
+ * treated as Earth-fixed and its rotational velocity (omega x r) is subtracted here.
8021
+ * The observer position must be the WGS84 one that `rae()` uses; a spherical-Earth
8022
+ * observer (`lla2eci()`) sits ~20 km off at mid latitudes and skews the range rate by
8023
+ * up to ~0.2 km/s near closest approach.
8024
+ * @param location - The observer position (inertial frame, km).
8025
+ * @param position - The source position (inertial frame, km).
8026
+ * @param velocity - The source velocity (inertial frame, km/s).
7879
8027
  * @returns The calculated Doppler factor.
7880
8028
  */
7881
8029
  declare const dopplerFactor: (location: EcefVec3<Kilometers>, position: EcefVec3<Kilometers>, velocity: EcefVec3<KilometersPerSecond>) => number;
@@ -8367,13 +8515,19 @@ declare class DynamicGroundObject extends GroundObject {
8367
8515
  getEcef(time: Date): EcefVec3<Kilometers> | null;
8368
8516
  /**
8369
8517
  * Gets the ECI (Earth-Centered Inertial) position at a specific time.
8518
+ *
8519
+ * The WGS84 position from {@link getEcef} rotated into TEME by GMST, the same model
8520
+ * `GroundObject.eci()` uses (not the spherical-Earth `lla2eci()`).
8370
8521
  * @param time - The time to get position for
8371
- * @returns ECI position vector, or null if time is outside waypoint range
8522
+ * @returns ECI (TEME) position vector, or null if time is outside waypoint range
8372
8523
  */
8373
8524
  getEci(time: Date): TemeVec3<Kilometers> | null;
8374
8525
  /**
8375
8526
  * Converts position at a specific time to J2000 inertial coordinates.
8376
- * Ground objects have zero velocity in the inertial frame (ignoring Earth rotation).
8527
+ *
8528
+ * The WGS84 position is rotated from ITRF into J2000 with precession, nutation and
8529
+ * sidereal time, as in `GroundObject.toJ2000()`. The velocity is the Earth-rotation
8530
+ * velocity (omega x r); the platform's own motion between waypoints is not included.
8377
8531
  * @param time - The time for the conversion
8378
8532
  * @returns J2000 state vector, or null if time is outside waypoint range
8379
8533
  */
@@ -9498,16 +9652,21 @@ declare abstract class CelestialBody extends BaseObject {
9498
9652
  * Gets rise, transit, and set times for this body as seen from a ground location.
9499
9653
  * @param observer - The ground observer location
9500
9654
  * @param date - The starting date for the search
9501
- * @param minElevation - Minimum elevation angle in degrees (default 0)
9655
+ * @param minElevation - Elevation threshold in degrees (default 0). At 0 the times are the
9656
+ * usual rise/set (upper limb on the horizon, with refraction); otherwise they are when the
9657
+ * body's centre crosses that geometric elevation.
9502
9658
  * @returns Rise, transit, and set times (null if body doesn't rise/set)
9503
9659
  */
9504
9660
  getRiseSetTimes(observer: GroundObject, date?: Date, minElevation?: Degrees): RiseSetTimes;
9505
9661
  /**
9506
9662
  * Calculates the angular diameter of this body as seen from a given position.
9507
- * @param observerPos - The observer's position in km
9663
+ * @param observerPos - The observer's position in km (J2000, at `date`)
9664
+ * @param date - The time of `observerPos` (defaults to now). The body is placed at this
9665
+ * time; without it a past or future observer position was paired with the body's
9666
+ * position now.
9508
9667
  * @returns Angular diameter in radians
9509
9668
  */
9510
- getAngularDiameter(observerPos: Vector3D<Kilometers>): Radians;
9669
+ getAngularDiameter(observerPos: Vector3D<Kilometers>, date?: Date): Radians;
9511
9670
  /**
9512
9671
  * Calculates the angular separation between this body and a target position.
9513
9672
  * @param targetPos - The target position in ECI coordinates (km)
@@ -9597,9 +9756,13 @@ declare class SunBody extends CelestialBody {
9597
9756
  */
9598
9757
  eci(date?: Date): Vector3D<Kilometers>;
9599
9758
  /**
9600
- * Gets the Sun's apparent position (corrected for light travel time).
9759
+ * Gets the Sun's apparent position (corrected for light travel time and aberration).
9760
+ *
9761
+ * Same as {@link eci}: astronomy-engine's `GeoVector` already applies the light-time and
9762
+ * aberration corrections. (This used to roll the time back by another ~499 s, putting the
9763
+ * Sun a further ~20 arcsec along its path.)
9601
9764
  * @param date - The date/time for the position calculation
9602
- * @returns Position vector in kilometers
9765
+ * @returns Position vector in kilometers (J2000)
9603
9766
  */
9604
9767
  eciApparent(date?: Date): Vector3D<Kilometers>;
9605
9768
  /**
@@ -9651,8 +9814,13 @@ declare class SunBody extends CelestialBody {
9651
9814
  static sunSatEarthAngle(satPos: Vector3D<Kilometers>, sunPos: Vector3D<Kilometers>): Degrees;
9652
9815
  /**
9653
9816
  * Determines if a satellite is in Earth's shadow.
9817
+ *
9818
+ * The test is a cylinder-plus-cone that tracks the umbra boundary closely (within ~0.01 deg
9819
+ * of the `lightingRatio` umbra edge in LEO); a satellite in the penumbra counts as lit. Use
9820
+ * {@link lightingRatio} when partial illumination matters.
9654
9821
  * @param epoch - The epoch for the calculation
9655
- * @param satPos - The satellite's ECI position in kilometers
9822
+ * @param satPos - The satellite's position in J2000 (the frame of `eci()`), km; a TEME
9823
+ * position from `Satellite.eci()` is ~0.3 deg off in 2026
9656
9824
  * @example
9657
9825
  * ```typescript
9658
9826
  * import { Sun, Satellite, EpochUTC, Vector3D, Kilometers, Seconds } from 'ootk';
@@ -9661,14 +9829,8 @@ declare class SunBody extends CelestialBody {
9661
9829
  * const now = new Date();
9662
9830
  * const epoch = new EpochUTC((now.getTime() / 1000) as Seconds);
9663
9831
  *
9664
- * const pv = satellite.eci(now);
9665
- * if (pv) {
9666
- * const satPos = new Vector3D<Kilometers>(
9667
- * pv.position.x as Kilometers,
9668
- * pv.position.y as Kilometers,
9669
- * pv.position.z as Kilometers
9670
- * );
9671
- *
9832
+ * const satPos = satellite.toJ2000(now).position; // J2000, like Sun.eci()
9833
+ * {
9672
9834
  * const inShadow = Sun.shadow(epoch, satPos);
9673
9835
  * console.log(inShadow ? 'Satellite is in eclipse' : 'Satellite is sunlit');
9674
9836
  *
@@ -9701,10 +9863,11 @@ declare class SunBody extends CelestialBody {
9701
9863
  lightingRatio(satPos: Vector3D<Kilometers>, sunPos: Vector3D<Kilometers>): number;
9702
9864
  /**
9703
9865
  * Calculates the Sun's angular diameter as seen from a position.
9704
- * @param obsPos - Observer position in kilometers
9866
+ * @param obsPos - Observer position in kilometers (J2000, at `date`)
9867
+ * @param date - The time of `obsPos` (defaults to now)
9705
9868
  * @returns Angular diameter in radians
9706
9869
  */
9707
- diameter(obsPos: Vector3D<Kilometers>): Radians;
9870
+ diameter(obsPos: Vector3D<Kilometers>, date?: Date): Radians;
9708
9871
  /**
9709
9872
  * Calculates comprehensive sun times for a given location and date.
9710
9873
  *
@@ -9741,9 +9904,13 @@ declare class SunBody extends CelestialBody {
9741
9904
  getTimes(dateVal: Date | number, lat: Degrees, lon: Degrees, alt?: Meters, isUtc?: boolean): SunTime;
9742
9905
  /**
9743
9906
  * Gets sunrise and sunset times using astronomy-engine.
9907
+ *
9908
+ * The times are when the Sun's centre crosses `minElevation` (geometric altitude). The
9909
+ * default -0.833 deg is the standard sunrise/sunset definition (refraction plus the solar
9910
+ * semidiameter); -6, -12 and -18 give civil, nautical and astronomical twilight.
9744
9911
  * @param observer - Ground observer location
9745
9912
  * @param date - The date for calculation
9746
- * @param minElevation - Minimum elevation in degrees (default -0.833 for standard sunrise)
9913
+ * @param minElevation - Elevation of the Sun's centre in degrees (default -0.833 for standard sunrise)
9747
9914
  */
9748
9915
  getSunriseSunset(observer: GroundObject, date?: Date, minElevation?: Degrees): {
9749
9916
  sunrise: Date | null;
@@ -11396,6 +11563,555 @@ declare class RungeKutta4Propagator extends Propagator {
11396
11563
  restore(index: number): void;
11397
11564
  }
11398
11565
 
11566
+ /**
11567
+ * @author Theodore Kruczek
11568
+ * @license AGPL-3.0-or-later
11569
+ * @copyright (c) 2025-2026 Kruczek Labs LLC
11570
+ *
11571
+ * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
11572
+ * terms of the GNU Affero General Public License as published by the Free Software
11573
+ * Foundation, either version 3 of the License, or (at your option) any later version.
11574
+ *
11575
+ * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
11576
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11577
+ * See the GNU Affero General Public License for more details.
11578
+ *
11579
+ * You should have received a copy of the GNU Affero General Public License along with
11580
+ * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
11581
+ */
11582
+
11583
+ /**
11584
+ * An Astro Standards satellite key returned by the TLE tree.
11585
+ *
11586
+ * Format: `JJJddddddYYSSSSSSSE` (Julian day, fraction of day, epoch year,
11587
+ * 7-digit satellite number, element type). The value is 19 digits and exceeds
11588
+ * `Number.MAX_SAFE_INTEGER`, so it must remain a `bigint` end-to-end.
11589
+ */
11590
+ type SatKey = bigint;
11591
+ /**
11592
+ * Logging levels accepted by `SetLogLevel_wasm`.
11593
+ */
11594
+ declare enum Sgp4WasmLogLevel {
11595
+ None = 0,
11596
+ Info = 1,
11597
+ Warn = 2,
11598
+ Error = 3
11599
+ }
11600
+ /**
11601
+ * Sources for the Emscripten glue script and wasm binary.
11602
+ *
11603
+ * In Node both default to files that sit next to this module
11604
+ * (`src/external/Sgp4Prop.js` / `.wasm`). In the browser there is no default;
11605
+ * both must be provided (typically URLs served as static assets).
11606
+ */
11607
+ interface Sgp4WasmLoadOptions {
11608
+ /** Glue JS source: filesystem path, URL, or preloaded text (`{ text }`). */
11609
+ glue?: string | URL | {
11610
+ text: string;
11611
+ };
11612
+ /** Wasm binary source: filesystem path, URL, or raw bytes. */
11613
+ wasm?: string | URL | Uint8Array | ArrayBuffer;
11614
+ /** Forwarded to the Emscripten Module as its stdout hook. */
11615
+ print?: (msg: string) => void;
11616
+ /** Forwarded to the Emscripten Module as its stderr hook. */
11617
+ printErr?: (msg: string) => void;
11618
+ }
11619
+ /**
11620
+ * A single propagation record without geodetic coordinates
11621
+ * (8 doubles per record in wasm memory).
11622
+ *
11623
+ * Position and velocity are in the TEME (true equator, mean equinox) frame,
11624
+ * matching the output of the pure-TypeScript {@link Sgp4} class.
11625
+ */
11626
+ interface Sgp4WasmPosVel {
11627
+ /** SGP4 propagation error code for this record; 0 = success. */
11628
+ err: number;
11629
+ /**
11630
+ * Echo of the propagation time: minutes since TLE epoch for the mse
11631
+ * variants, or days since 1950 UTC for the ds50UTC variants.
11632
+ */
11633
+ time: number;
11634
+ /** TEME position in kilometers. */
11635
+ position: Vector3D<Kilometers>;
11636
+ /** TEME velocity in kilometers per second. */
11637
+ velocity: Vector3D<KilometersPerSecond>;
11638
+ }
11639
+ /**
11640
+ * A full propagation record including geodetic coordinates
11641
+ * (11 doubles per record in wasm memory).
11642
+ */
11643
+ interface Sgp4WasmState extends Sgp4WasmPosVel {
11644
+ /** Geodetic latitude/longitude/height. */
11645
+ llh: {
11646
+ lat: Degrees;
11647
+ lon: Degrees;
11648
+ height: Kilometers;
11649
+ };
11650
+ }
11651
+ /**
11652
+ * Result of the scratch-buffer fast path
11653
+ * ({@link Sgp4WasmBase.propagateOnePosVelFast}). Plain numbers in the TEME
11654
+ * frame (km, km/s) to avoid per-call allocations on hot paths.
11655
+ */
11656
+ interface Sgp4WasmFastPosVel {
11657
+ /** SGP4 propagation error code; 0 = success. */
11658
+ err: number;
11659
+ position: {
11660
+ x: number;
11661
+ y: number;
11662
+ z: number;
11663
+ };
11664
+ velocity: {
11665
+ x: number;
11666
+ y: number;
11667
+ z: number;
11668
+ };
11669
+ }
11670
+ /**
11671
+ * Error thrown by the Sgp4Wasm wrapper classes.
11672
+ */
11673
+ declare class Sgp4WasmError extends Error {
11674
+ readonly code?: number | undefined;
11675
+ constructor(message: string, code?: number | undefined);
11676
+ }
11677
+ /**
11678
+ * The subset of the evaluated Emscripten Module object used by the wrappers.
11679
+ * Exposed via {@link Sgp4WasmBase.module} as a raw escape hatch.
11680
+ */
11681
+ interface Sgp4PropEmscriptenModule {
11682
+ _malloc(bytes: number): number;
11683
+ _free(ptr: number): void;
11684
+ /** Raw export used by the hot path to skip cwrap dispatch overhead. */
11685
+ _Sgp4PropPosVel_wasm(keysPtr: number, numKeys: number, startMse: number, propsPerSat: number, stepMin: number, resultPtr: number): number;
11686
+ cwrap(name: string, returnType: string | null, argTypes: string[]): (...args: unknown[]) => unknown;
11687
+ ccall(name: string, returnType: string | null, argTypes: string[], args: unknown[]): unknown;
11688
+ setValue(ptr: number, value: number | bigint, type: string): void;
11689
+ getValue(ptr: number, type: string): number | bigint;
11690
+ UTF8ToString(ptr: number, maxBytesToRead?: number): string;
11691
+ HEAP8: Int8Array;
11692
+ HEAPU8: Uint8Array;
11693
+ HEAP32: Int32Array;
11694
+ HEAPF64: Float64Array;
11695
+ HEAP64: BigInt64Array;
11696
+ wasmBinary?: ArrayBuffer | Uint8Array;
11697
+ onRuntimeInitialized?: () => void;
11698
+ onAbort?: (reason: unknown) => void;
11699
+ print?: (msg: string) => void;
11700
+ printErr?: (msg: string) => void;
11701
+ calledRun?: boolean;
11702
+ }
11703
+ /**
11704
+ * The subset of Emscripten's internal FS object captured during glue
11705
+ * evaluation (it is not exported on the Module object). Needed for
11706
+ * `TleLoadFileVFS_wasm`, which reads `inFile` and writes `outFile` in the
11707
+ * virtual filesystem.
11708
+ */
11709
+ interface Sgp4PropFS {
11710
+ writeFile(path: string, data: string | Uint8Array): void;
11711
+ readFile(path: string, opts: {
11712
+ encoding: 'utf8';
11713
+ }): string;
11714
+ readFile(path: string, opts?: {
11715
+ encoding: 'binary';
11716
+ }): Uint8Array;
11717
+ unlink(path: string): void;
11718
+ analyzePath(path: string): {
11719
+ exists: boolean;
11720
+ };
11721
+ }
11722
+ /**
11723
+ * Human-readable messages for the negative return codes shared by the
11724
+ * dynamic-array management functions.
11725
+ */
11726
+ declare const SGP4_WASM_DYN_ARR_ERRORS: Record<number, string>;
11727
+ /**
11728
+ * Human-readable messages for the negative return codes of
11729
+ * `AddSatToDynArr_wasm`.
11730
+ */
11731
+ declare const SGP4_WASM_ADD_SAT_ERRORS: Record<number, string>;
11732
+
11733
+ /**
11734
+ * @author Theodore Kruczek
11735
+ * @license AGPL-3.0-or-later
11736
+ * @copyright (c) 2025-2026 Kruczek Labs LLC
11737
+ *
11738
+ * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
11739
+ * terms of the GNU Affero General Public License as published by the Free Software
11740
+ * Foundation, either version 3 of the License, or (at your option) any later version.
11741
+ *
11742
+ * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
11743
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11744
+ * See the GNU Affero General Public License for more details.
11745
+ *
11746
+ * You should have received a copy of the GNU Affero General Public License along with
11747
+ * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
11748
+ */
11749
+
11750
+ /**
11751
+ * Base class wrapping the USSF Astro Standards "C Sgp4Prop WebAssembly"
11752
+ * builds (v9.1.1.0). Concrete subclasses ({@link Sgp4Wasm} for classic SGP4,
11753
+ * {@link Sgp4XpWasm} for SGP4-XP) only pick the artifact filenames.
11754
+ *
11755
+ * The Emscripten artifacts (`Sgp4Prop.js`/`.wasm` and the `.xp` pair) are
11756
+ * license-restricted and distributed via space-track.org. They are NOT
11757
+ * shipped with ootk; they must be placed in `src/external/` (Node default)
11758
+ * or supplied explicitly through {@link Sgp4WasmLoadOptions}.
11759
+ *
11760
+ * The glue script is a classic non-modularized Emscripten build, which
11761
+ * cannot be imported from an ES-module package (the internal `Module`
11762
+ * object is unreachable). It is therefore fetched as text and evaluated in
11763
+ * a controlled function scope with a pre-seeded `Module` (including
11764
+ * `wasmBinary`, so Emscripten's file-location logic is never exercised).
11765
+ * Note this requires `unsafe-eval` if a Content-Security-Policy is present.
11766
+ *
11767
+ * All propagation output is in the TEME frame, matching the pure-TypeScript
11768
+ * {@link Sgp4} class.
11769
+ */
11770
+ declare abstract class Sgp4WasmBase {
11771
+ /** Glue script filename used for Node default resolution. */
11772
+ protected abstract readonly defaultGlueFile_: string;
11773
+ /** Wasm binary filename used for Node default resolution. */
11774
+ protected abstract readonly defaultWasmFile_: string;
11775
+ private module_;
11776
+ private fs_;
11777
+ private bindings_;
11778
+ private loadPromise_;
11779
+ private isDynArrInitialized_;
11780
+ private scratchKeyPtr_;
11781
+ private scratchResultPtr_;
11782
+ /**
11783
+ * Converts a UTC epoch to the Astro Standards ds50UTC time system
11784
+ * (days since 1949 December 31, 00:00 UTC).
11785
+ * @param epoch The epoch to convert.
11786
+ * @returns Days since 1950 UTC.
11787
+ */
11788
+ static toDs50Utc(epoch: EpochUTC): number;
11789
+ /**
11790
+ * Whether the wasm runtime has been loaded and initialized.
11791
+ */
11792
+ get isLoaded(): boolean;
11793
+ /**
11794
+ * Raw Emscripten Module escape hatch (`_malloc`, `ccall`, heap views, ...).
11795
+ * @throws {Sgp4WasmError} If the module is not loaded yet.
11796
+ */
11797
+ get module(): Sgp4PropEmscriptenModule;
11798
+ /**
11799
+ * Raw Emscripten virtual filesystem escape hatch.
11800
+ * @throws {Sgp4WasmError} If the module is not loaded yet.
11801
+ */
11802
+ get fs(): Sgp4PropFS;
11803
+ /**
11804
+ * Loads and initializes the wasm runtime. Idempotent — repeat calls return
11805
+ * the same in-flight or completed load.
11806
+ * @param options Artifact sources and stdout/stderr hooks. In Node both
11807
+ * artifacts default to files next to this module; in the browser both must
11808
+ * be provided (typically URLs to statically served copies).
11809
+ * @returns This instance, once the runtime is initialized.
11810
+ */
11811
+ load(options?: Sgp4WasmLoadOptions): Promise<this>;
11812
+ /**
11813
+ * Frees the dynamic array (if initialized) and drops all references to the
11814
+ * wasm runtime so it can be garbage collected. Note Emscripten linear
11815
+ * memory cannot be truly freed; a subsequent load() evaluates a fresh,
11816
+ * isolated runtime.
11817
+ */
11818
+ dispose(): void;
11819
+ /**
11820
+ * Adds a single TLE to the TLE tree (`TleAddSatFrLines_wasm`).
11821
+ * @param line1 Line 1 of the TLE.
11822
+ * @param line2 Line 2 of the TLE.
11823
+ * @returns The satKey of the added TLE.
11824
+ */
11825
+ addSat(line1: string, line2: string): SatKey;
11826
+ /**
11827
+ * Adds any number of TLEs from newline-separated text
11828
+ * (`TleAddSatsFrLines_wasm`).
11829
+ *
11830
+ * The library adds TLEs individually: entries it fails to parse come back
11831
+ * as `0n` in the returned array (positions match the input order), while
11832
+ * the rest are added normally.
11833
+ * @param tleText Newline-separated TLE lines.
11834
+ * @returns One satKey per input TLE; `0n` marks a failed entry.
11835
+ */
11836
+ addSats(tleText: string): SatKey[];
11837
+ /**
11838
+ * Adds any number of TLEs through the Emscripten virtual filesystem
11839
+ * (`TleLoadFileVFS_wasm`). The text is written to the VFS `inFile`, and
11840
+ * the satKeys the library writes to `outFile` are read back.
11841
+ * @param tleText Newline-separated TLE lines.
11842
+ * @returns The satKeys of all added TLEs.
11843
+ */
11844
+ loadTlesVfs(tleText: string): SatKey[];
11845
+ /**
11846
+ * Removes TLEs from the TLE tree (`TleRemoveSats_wasm`).
11847
+ * @param satKeys The satKeys to remove.
11848
+ */
11849
+ removeSats(satKeys: readonly SatKey[]): void;
11850
+ /**
11851
+ * Initializes SGP4 objects for previously added TLEs
11852
+ * (`Sgp4InitSats_wasm`). Must be called after adding TLEs and before
11853
+ * propagating them.
11854
+ * @param satKeys The satKeys to initialize.
11855
+ */
11856
+ initSats(satKeys: readonly SatKey[]): void;
11857
+ /**
11858
+ * Removes initialized SGP4 objects (`Sgp4RemoveSats_wasm`).
11859
+ * @param satKeys The satKeys to remove.
11860
+ */
11861
+ uninitSats(satKeys: readonly SatKey[]): void;
11862
+ /**
11863
+ * Propagates satKeys with geodetic output (`Sgp4Prop_wasm`).
11864
+ * @param satKeys The satKeys to propagate (must be initialized).
11865
+ * @param startTimeMse Start time in minutes since each TLE's epoch.
11866
+ * @param propsPerSat Number of propagations per satellite.
11867
+ * @param stepSizeMin Step size in minutes between propagations.
11868
+ * @returns Records indexed as `[satIndex][stepIndex]`.
11869
+ */
11870
+ propagate(satKeys: readonly SatKey[], startTimeMse: number, propsPerSat: number, stepSizeMin: number): Sgp4WasmState[][];
11871
+ /**
11872
+ * Propagates satKeys, position/velocity only (`Sgp4PropPosVel_wasm`).
11873
+ * @param satKeys The satKeys to propagate (must be initialized).
11874
+ * @param startTimeMse Start time in minutes since each TLE's epoch.
11875
+ * @param propsPerSat Number of propagations per satellite.
11876
+ * @param stepSizeMin Step size in minutes between propagations.
11877
+ * @returns Records indexed as `[satIndex][stepIndex]`.
11878
+ */
11879
+ propagatePosVel(satKeys: readonly SatKey[], startTimeMse: number, propsPerSat: number, stepSizeMin: number): Sgp4WasmPosVel[][];
11880
+ /**
11881
+ * Propagates satKeys from an absolute time with geodetic output
11882
+ * (`Sgp4PropDs50Utc_wasm`).
11883
+ * @param satKeys The satKeys to propagate (must be initialized).
11884
+ * @param startTimeDs50Utc Start time in days since 1950 UTC (see {@link toDs50Utc}).
11885
+ * @param propsPerSat Number of propagations per satellite.
11886
+ * @param stepSizeMin Step size in minutes between propagations.
11887
+ * @returns Records indexed as `[satIndex][stepIndex]`.
11888
+ */
11889
+ propagateDs50Utc(satKeys: readonly SatKey[], startTimeDs50Utc: number, propsPerSat: number, stepSizeMin: number): Sgp4WasmState[][];
11890
+ /**
11891
+ * Propagates satKeys from an absolute time, position/velocity only
11892
+ * (`Sgp4PropDs50UtcPosVel_wasm`).
11893
+ * @param satKeys The satKeys to propagate (must be initialized).
11894
+ * @param startTimeDs50Utc Start time in days since 1950 UTC (see {@link toDs50Utc}).
11895
+ * @param propsPerSat Number of propagations per satellite.
11896
+ * @param stepSizeMin Step size in minutes between propagations.
11897
+ * @returns Records indexed as `[satIndex][stepIndex]`.
11898
+ */
11899
+ propagateDs50UtcPosVel(satKeys: readonly SatKey[], startTimeDs50Utc: number, propsPerSat: number, stepSizeMin: number): Sgp4WasmPosVel[][];
11900
+ /**
11901
+ * Convenience single-satellite, single-step propagation.
11902
+ * @param satKey The satKey to propagate (must be initialized).
11903
+ * @param minutesSinceEpoch Minutes since the TLE epoch.
11904
+ * @returns The propagated state.
11905
+ */
11906
+ propagateOne(satKey: SatKey, minutesSinceEpoch: number): Sgp4WasmState;
11907
+ /**
11908
+ * Convenience single-satellite propagation to an absolute UTC epoch.
11909
+ * @param satKey The satKey to propagate (must be initialized).
11910
+ * @param epoch The UTC epoch to propagate to.
11911
+ * @returns The propagated state.
11912
+ */
11913
+ propagateEpoch(satKey: SatKey, epoch: EpochUTC): Sgp4WasmState;
11914
+ /**
11915
+ * Hot-path single-satellite propagation (`Sgp4PropPosVel_wasm`) that reuses
11916
+ * persistent scratch buffers instead of allocating per call, and returns
11917
+ * plain numbers instead of Vector3D instances. Intended for per-frame use
11918
+ * (e.g. as a drop-in backend for `Sgp4.propagate`).
11919
+ * @param satKey The satKey to propagate (must be initialized).
11920
+ * @param minutesSinceEpoch Minutes since the TLE epoch.
11921
+ * @returns Plain TEME position/velocity plus the per-record error code; a
11922
+ * nonzero function-level failure is reported as `err` too.
11923
+ */
11924
+ propagateOnePosVelFast(satKey: SatKey, minutesSinceEpoch: number): Sgp4WasmFastPosVel;
11925
+ /**
11926
+ * Initializes the module-global dynamic array of SGP4 objects
11927
+ * (`InitDynArr_wasm`).
11928
+ * @param initialSize Initial capacity of the array.
11929
+ */
11930
+ initDynArr(initialSize: number): void;
11931
+ /**
11932
+ * Re-allocates the dynamic array to a new capacity
11933
+ * (`ReallocateDynArr_wasm`).
11934
+ * @param newSize New capacity of the array.
11935
+ */
11936
+ reallocDynArr(newSize: number): void;
11937
+ /**
11938
+ * Frees the dynamic array (`FreeDynArr_wasm`).
11939
+ */
11940
+ freeDynArr(): void;
11941
+ /**
11942
+ * Current size of the dynamic array (`GetDynArrSize_wasm`).
11943
+ */
11944
+ get dynArrSize(): number;
11945
+ /**
11946
+ * Adds a TLE to the dynamic array (`AddSatToDynArr_wasm`).
11947
+ * @param line1 Line 1 of the TLE.
11948
+ * @param line2 Line 2 of the TLE.
11949
+ * @returns The dynamic array index of the added satellite.
11950
+ */
11951
+ addSatToDynArr(line1: string, line2: string): number;
11952
+ /**
11953
+ * Propagates dynamic array entries, position/velocity only
11954
+ * (`Sgp4PropDynArrPosVel_wasm`).
11955
+ * @param indexes Dynamic array indices to propagate.
11956
+ * @param startTimeMse Start time in minutes since each TLE's epoch.
11957
+ * @param propsPerSat Number of propagations per satellite.
11958
+ * @param stepSizeMin Step size in minutes between propagations.
11959
+ * @returns Records indexed as `[satIndex][stepIndex]`.
11960
+ */
11961
+ propagateDynArrPosVel(indexes: readonly number[], startTimeMse: number, propsPerSat: number, stepSizeMin: number): Sgp4WasmPosVel[][];
11962
+ /**
11963
+ * Propagates dynamic array entries from an absolute time with geodetic
11964
+ * output (`Sgp4PropDs50UtcDynArr_wasm`).
11965
+ * @param indexes Dynamic array indices to propagate.
11966
+ * @param startTimeDs50Utc Start time in days since 1950 UTC (see {@link toDs50Utc}).
11967
+ * @param propsPerSat Number of propagations per satellite.
11968
+ * @param stepSizeMin Step size in minutes between propagations.
11969
+ * @returns Records indexed as `[satIndex][stepIndex]`.
11970
+ */
11971
+ propagateDs50UtcDynArr(indexes: readonly number[], startTimeDs50Utc: number, propsPerSat: number, stepSizeMin: number): Sgp4WasmState[][];
11972
+ /**
11973
+ * Propagates dynamic array entries from an absolute time,
11974
+ * position/velocity only (`Sgp4PropDs50UtcDynArrPosVel_wasm`).
11975
+ * @param indexes Dynamic array indices to propagate.
11976
+ * @param startTimeDs50Utc Start time in days since 1950 UTC (see {@link toDs50Utc}).
11977
+ * @param propsPerSat Number of propagations per satellite.
11978
+ * @param stepSizeMin Step size in minutes between propagations.
11979
+ * @returns Records indexed as `[satIndex][stepIndex]`.
11980
+ */
11981
+ propagateDs50UtcDynArrPosVel(indexes: readonly number[], startTimeDs50Utc: number, propsPerSat: number, stepSizeMin: number): Sgp4WasmPosVel[][];
11982
+ /**
11983
+ * Sets the wasm library's logging level (`SetLogLevel_wasm`).
11984
+ * @param level The new log level.
11985
+ */
11986
+ setLogLevel(level: Sgp4WasmLogLevel): void;
11987
+ /**
11988
+ * Counts the TLEs in newline-separated text by counting line-1 rows.
11989
+ * @param tleText Newline-separated TLE lines.
11990
+ * @returns Number of TLEs.
11991
+ */
11992
+ private static countTles_;
11993
+ private static isHttpUrl_;
11994
+ private fn_;
11995
+ private loadInternal_;
11996
+ private static buildBindings_;
11997
+ private resolveGlueText_;
11998
+ private resolveWasmBinary_;
11999
+ private resolveDefaultSource_;
12000
+ private readNodeFile_;
12001
+ private missingArtifactError_;
12002
+ private withMalloc_;
12003
+ private withI64Array_;
12004
+ private withI32Array_;
12005
+ private readI64Array_;
12006
+ /**
12007
+ * Allocates a result buffer of `count` doubles, runs `fn`, and copies the
12008
+ * buffer out. The HEAPF64 view is re-read from the module after the call
12009
+ * because wasm memory growth invalidates cached views.
12010
+ */
12011
+ private withF64Result_;
12012
+ private runKeysWithErrSat_;
12013
+ private propagateKeys_;
12014
+ private propagateIndexes_;
12015
+ /**
12016
+ * Parses a copied-out result buffer into per-satellite, per-step records.
12017
+ * Records are 8 doubles wide (err, time, pos, vel) or 11 doubles wide
12018
+ * (plus lat, lon, height) — the distribution docs' "7 per record"
12019
+ * precondition is stale.
12020
+ */
12021
+ private parseRecords_;
12022
+ }
12023
+
12024
+ /**
12025
+ * @author Theodore Kruczek
12026
+ * @license AGPL-3.0-or-later
12027
+ * @copyright (c) 2025-2026 Kruczek Labs LLC
12028
+ *
12029
+ * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
12030
+ * terms of the GNU Affero General Public License as published by the Free Software
12031
+ * Foundation, either version 3 of the License, or (at your option) any later version.
12032
+ *
12033
+ * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12034
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12035
+ * See the GNU Affero General Public License for more details.
12036
+ *
12037
+ * You should have received a copy of the GNU Affero General Public License along with
12038
+ * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
12039
+ */
12040
+
12041
+ /**
12042
+ * Sgp4WasmPropagator adapts the USSF Astro Standards SGP4 WebAssembly
12043
+ * wrappers ({@link Sgp4Wasm} / {@link Sgp4XpWasm}) to the same
12044
+ * {@link Propagator} interface as {@link Sgp4Propagator}, so the official
12045
+ * Astro Standards implementation can be swapped in for the pure-TypeScript
12046
+ * SGP4.
12047
+ *
12048
+ * The wasm instance must already be loaded (`await wasm.load()`); the
12049
+ * constructor registers and initializes the TLE synchronously. Call
12050
+ * {@link dispose} to remove the satellite from the wasm instance's registry
12051
+ * when done.
12052
+ */
12053
+ declare class Sgp4WasmPropagator extends Propagator {
12054
+ private readonly wasm_;
12055
+ private readonly tle_;
12056
+ private readonly satKey_;
12057
+ private cacheState_;
12058
+ private checkpoints_;
12059
+ constructor(wasm_: Sgp4WasmBase, tle_: Tle);
12060
+ /**
12061
+ * The Astro Standards satKey backing this propagator.
12062
+ */
12063
+ get satKey(): SatKey;
12064
+ /**
12065
+ * Gets the state of the propagator in the J2000 coordinate system.
12066
+ * @returns The J2000 state of the propagator.
12067
+ */
12068
+ get state(): J2000;
12069
+ /**
12070
+ * Calculates the ephemeris maneuver using the SGP4 propagator.
12071
+ * @param start The start epoch in UTC.
12072
+ * @param finish The finish epoch in UTC.
12073
+ * @param maneuvers The array of thrust maneuvers.
12074
+ * @param interval The time interval in seconds.
12075
+ */
12076
+ ephemerisManeuver(_start: EpochUTC, _finish: EpochUTC, _maneuvers: Thrust[], _interval?: number): VerletBlendInterpolator;
12077
+ /**
12078
+ * Performs a maneuver with the given thrust.
12079
+ * @param maneuver - The thrust maneuver to perform.
12080
+ * @param interval - The time interval for the maneuver (default: 60.0 seconds).
12081
+ * @throws Error if maneuvers cannot be modeled with SGP4.
12082
+ */
12083
+ maneuver(_maneuver: Thrust, _interval?: number): J2000[];
12084
+ /**
12085
+ * Propagates the state to a specified epoch in J2000 coordinates.
12086
+ * @param epoch - The epoch in UTC format.
12087
+ * @returns The propagated state in J2000 coordinates.
12088
+ */
12089
+ propagate(epoch: EpochUTC): J2000;
12090
+ /**
12091
+ * Resets the state of the propagator to the TLE epoch state.
12092
+ */
12093
+ reset(): void;
12094
+ /**
12095
+ * Saves the current state of the propagator and returns the index of the checkpoint.
12096
+ * @returns The index of the checkpoint.
12097
+ */
12098
+ checkpoint(): number;
12099
+ /**
12100
+ * Clears all the checkpoints in the propagator.
12101
+ */
12102
+ clearCheckpoints(): void;
12103
+ /**
12104
+ * Restores the state of the propagator to a previously saved checkpoint.
12105
+ * @param index - The index of the checkpoint to restore.
12106
+ */
12107
+ restore(index: number): void;
12108
+ /**
12109
+ * Removes the satellite from the backing wasm instance's SGP4 and TLE
12110
+ * registries.
12111
+ */
12112
+ dispose(): void;
12113
+ }
12114
+
11399
12115
  /**
11400
12116
  * @author Theodore Kruczek
11401
12117
  * @license AGPL-3.0-or-later
@@ -11925,6 +12641,18 @@ declare class ModifiedGoodingIOD {
11925
12641
  constructor(mu?: number);
11926
12642
  private createInitial_;
11927
12643
  private createErrorFunction_;
12644
+ /**
12645
+ * Solves for a J2000 state at the middle observation's epoch: a Gooding three-line-of-sight
12646
+ * estimate refined by a downhill simplex over all observations with a two-body force model.
12647
+ *
12648
+ * `tolerance` ends the simplex once the spread of the summed line-of-sight error (radians)
12649
+ * or of the vertices falls below it.
12650
+ * @param observations - Optical observations, in time order (at least 3)
12651
+ * @param r0 - Range guess for the first observation (km)
12652
+ * @param rN - Range guess for the last observation (km)
12653
+ * @param options - Solver options
12654
+ * @returns The J2000 state at the middle observation's epoch
12655
+ */
11928
12656
  solve(observations: ObservationOptical[], r0?: Kilometers, rN?: Kilometers, { nRev, direction, posSearch, velSearch, tolerance, maxIter, printIter, }?: SolveOptions): J2000;
11929
12657
  private defaultSolveOptions_;
11930
12658
  }
@@ -13290,6 +14018,94 @@ declare class PassiveRFSensor extends Sensor {
13290
14018
  clone(): PassiveRFSensor;
13291
14019
  }
13292
14020
 
14021
+ /**
14022
+ * @author Theodore Kruczek
14023
+ * @license AGPL-3.0-or-later
14024
+ * @copyright (c) 2025-2026 Kruczek Labs LLC
14025
+ *
14026
+ * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
14027
+ * terms of the GNU Affero General Public License as published by the Free Software
14028
+ * Foundation, either version 3 of the License, or (at your option) any later version.
14029
+ *
14030
+ * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
14031
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14032
+ * See the GNU Affero General Public License for more details.
14033
+ *
14034
+ * You should have received a copy of the GNU Affero General Public License along with
14035
+ * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
14036
+ */
14037
+
14038
+ /**
14039
+ * Parameters for constructing a TtcAntenna.
14040
+ */
14041
+ interface TtcAntennaParams extends SensorParams {
14042
+ /** Antenna dish diameter in meters */
14043
+ antennaDiameter?: number;
14044
+ /** Antenna gain in dB */
14045
+ antennaGain?: number;
14046
+ /** Whether the station supports two-way ranging */
14047
+ hasRanging?: boolean;
14048
+ /** Whether the station can uplink commands (vs receive-only) */
14049
+ hasUplink?: boolean;
14050
+ }
14051
+ /**
14052
+ * Telemetry, tracking, and command (TT&C) antenna.
14053
+ *
14054
+ * A steerable dish used to communicate with cooperative spacecraft. Unlike
14055
+ * radars and telescopes, a TT&C antenna cannot detect non-cooperative
14056
+ * objects; its "observations" come from tracking a transponding target
14057
+ * (angles from autotrack, range/range-rate from two-way ranging and
14058
+ * doppler). Range is limited by the link budget rather than a radar
14059
+ * equation, so deep space networks can track targets millions of
14060
+ * kilometers away.
14061
+ *
14062
+ * @example
14063
+ * ```typescript
14064
+ * const dss14 = new TtcAntenna({
14065
+ * id: 'dss-14',
14066
+ * name: 'Goldstone 70m',
14067
+ * sensorType: SensorType.TT_C_ANTENNA,
14068
+ * antennaDiameter: 70,
14069
+ * hasRanging: true,
14070
+ * hasUplink: true,
14071
+ * fieldOfView: {
14072
+ * minRange: 0 as Kilometers,
14073
+ * maxRange: 1e9 as Kilometers,
14074
+ * minAzimuth: 0 as Degrees,
14075
+ * maxAzimuth: 360 as Degrees,
14076
+ * minElevation: 6 as Degrees,
14077
+ * maxElevation: 90 as Degrees,
14078
+ * },
14079
+ * });
14080
+ * ```
14081
+ */
14082
+ declare class TtcAntenna extends Sensor {
14083
+ /** Antenna dish diameter in meters */
14084
+ antennaDiameter?: number;
14085
+ /** Antenna gain in dB */
14086
+ antennaGain?: number;
14087
+ /** Whether the station supports two-way ranging */
14088
+ hasRanging: boolean;
14089
+ /** Whether the station can uplink commands */
14090
+ hasUplink: boolean;
14091
+ constructor(params: TtcAntennaParams);
14092
+ /**
14093
+ * Creates an angle observation (Ra/Dec) of a cooperative target.
14094
+ * Angles come from antenna autotrack while locked to the target's downlink.
14095
+ * @param target - The space object to observe
14096
+ * @param date - Time of observation (defaults to now)
14097
+ * @returns ObservationOptical or null if target not in FOV
14098
+ */
14099
+ observe(target: SpaceObject, date?: Date): ObservationOptical | null;
14100
+ protected serializeSpecific(): Record<string, unknown>;
14101
+ /**
14102
+ * Creates a deep copy of this TT&C antenna.
14103
+ * The cloned sensor will not have a parent assigned.
14104
+ * @returns A new TtcAntenna instance with the same properties
14105
+ */
14106
+ clone(): TtcAntenna;
14107
+ }
14108
+
13293
14109
  /**
13294
14110
  * @author Theodore Kruczek
13295
14111
  * @license AGPL-3.0-or-later
@@ -13458,19 +14274,26 @@ declare class HorizonsParser {
13458
14274
  * @returns Parsed observer data
13459
14275
  */
13460
14276
  static parseObserver(data: string): HorizonsObserverResult;
14277
+ /** Metadata labels recognized in Horizons output headers. */
14278
+ private static readonly metadataLabels_;
13461
14279
  /**
13462
- * Extracts a value from a key: value line.
14280
+ * Extracts a metadata value from a `Label : value` line, tolerating the
14281
+ * column-aligned padding Horizons inserts before the colon (e.g.
14282
+ * "Output units : KM-S"). Returns null if the line does not carry the
14283
+ * given label.
13463
14284
  */
13464
- private static extractValue_;
14285
+ private static extractLabeledValue_;
14286
+ /** Returns the first recognized metadata label/value on the line, if any. */
14287
+ private static matchMetadataLine_;
13465
14288
  /**
13466
- * Extracts the target body name, stripping parenthetical descriptors and IDs.
14289
+ * Strips parenthetical descriptors and IDs from a target body name.
13467
14290
  *
13468
14291
  * Horizons format examples:
13469
- * - "1 Ceres {source: astDys}" → "1 Ceres"
13470
- * - "Artemis II (spacecraft) (-1024) {source: ...}" → "Artemis II"
13471
- * - "Mars (499)" → "Mars"
14292
+ * - "1 Ceres" → "1 Ceres"
14293
+ * - "Artemis II (spacecraft) (-1024)" → "Artemis II"
14294
+ * - "Mars (499)" → "Mars"
13472
14295
  */
13473
- private static extractTargetName_;
14296
+ private static stripNameSuffixes_;
13474
14297
  /**
13475
14298
  * Parses a vector data line from Horizons output.
13476
14299
  * Horizons vector output can span multiple lines.
@@ -15649,6 +16472,59 @@ declare class PlaneChangeBurn {
15649
16472
  static velocityAtTrueAnomaly(semimajorAxis: Kilometers, eccentricity: number, trueAnomaly: Radians, mu: number): number;
15650
16473
  }
15651
16474
 
16475
+ /**
16476
+ * @author Theodore Kruczek
16477
+ * @license AGPL-3.0-or-later
16478
+ * @copyright (c) 2026 Kruczek Labs LLC
16479
+ *
16480
+ * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
16481
+ * terms of the GNU Affero General Public License as published by the Free Software
16482
+ * Foundation, either version 3 of the License, or (at your option) any later version.
16483
+ *
16484
+ * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
16485
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16486
+ * See the GNU Affero General Public License for more details.
16487
+ *
16488
+ * You should have received a copy of the GNU Affero General Public License along with
16489
+ * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
16490
+ */
16491
+ /**
16492
+ * Tsiolkovsky rocket-equation helpers for tracking a satellite's propellant
16493
+ * budget across a sequence of impulsive burns.
16494
+ *
16495
+ * All masses are in kilograms, delta-V in meters per second, and specific
16496
+ * impulse in seconds.
16497
+ */
16498
+ declare class PropellantBudget {
16499
+ /** Standard gravity used by the specific-impulse definition (m/s^2). */
16500
+ static readonly g0 = 9.80665;
16501
+ /**
16502
+ * Mass remaining after an impulsive burn: `m * exp(-dv / (isp * g0))`.
16503
+ * @param massKg Total mass before the burn. (kg)
16504
+ * @param deltaVMs Delta-V of the burn. (m/s)
16505
+ * @param ispS Specific impulse of the propulsion system. (s)
16506
+ * @returns Total mass after the burn. (kg)
16507
+ */
16508
+ static massAfterBurn(massKg: number, deltaVMs: number, ispS: number): number;
16509
+ /**
16510
+ * Propellant consumed by an impulsive burn.
16511
+ * @param massKg Total mass before the burn. (kg)
16512
+ * @param deltaVMs Delta-V of the burn. (m/s)
16513
+ * @param ispS Specific impulse of the propulsion system. (s)
16514
+ * @returns Propellant mass consumed. (kg)
16515
+ */
16516
+ static propellantUsed(massKg: number, deltaVMs: number, ispS: number): number;
16517
+ /**
16518
+ * Delta-V available before the propellant is exhausted:
16519
+ * `isp * g0 * ln(m / dry)`.
16520
+ * @param massKg Current total mass. (kg)
16521
+ * @param dryMassKg Dry mass (no propellant). (kg)
16522
+ * @param ispS Specific impulse of the propulsion system. (s)
16523
+ * @returns Remaining delta-V. (m/s)
16524
+ */
16525
+ static deltaVRemaining(massKg: number, dryMassKg: number, ispS: number): number;
16526
+ }
16527
+
15652
16528
  /**
15653
16529
  * @author Theodore Kruczek
15654
16530
  * @license AGPL-3.0-or-later
@@ -15666,6 +16542,23 @@ declare class PlaneChangeBurn {
15666
16542
  * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
15667
16543
  */
15668
16544
 
16545
+ type PlaneChangeAssignment = 'burn1' | 'burn2' | 'none';
16546
+ interface HohmannTransferWithPlaneChangeResult {
16547
+ /** Circular speed of the initial orbit (km/s). */
16548
+ vInit: number;
16549
+ /** Circular speed of the final orbit (km/s). */
16550
+ vFinal: number;
16551
+ /** Delta-V magnitude of the first burn (km/s). */
16552
+ deltaV1: number;
16553
+ /** Delta-V magnitude of the second burn (km/s). */
16554
+ deltaV2: number;
16555
+ /** Total delta-V for both burns (km/s). */
16556
+ deltaVTotal: number;
16557
+ /** Coast time between the two burns (s). */
16558
+ tTrans: Seconds;
16559
+ /** Which burn carries the plane change. */
16560
+ planeChangeBurn: PlaneChangeAssignment;
16561
+ }
15669
16562
  declare class TwoBurnOrbitTransfer {
15670
16563
  vInit: number;
15671
16564
  vFinal: number;
@@ -15680,6 +16573,23 @@ declare class TwoBurnOrbitTransfer {
15680
16573
  * @returns An instance of TwoBurnOrbitTransfer containing the calculated parameters.
15681
16574
  */
15682
16575
  static hohmannTransfer(rInit: number, rFinal: number): TwoBurnOrbitTransfer;
16576
+ /**
16577
+ * Calculates a Hohmann transfer between two circular orbits with an optional
16578
+ * inclination change folded into one of the two burns as a single combined
16579
+ * impulse.
16580
+ *
16581
+ * The plane change is cheapest where the orbital velocity is lowest. For a
16582
+ * raising transfer that is the second burn (at rFinal); for a lowering
16583
+ * transfer it is the first burn (at rInit). The plane change is auto-assigned
16584
+ * to the cheaper burn and the assignment is reported in the result. A
16585
+ * combined burn costs `sqrt(v1^2 + v2^2 - 2 * v1 * v2 * cos(deltaInc))`
16586
+ * (law of cosines between the pre- and post-burn velocity vectors).
16587
+ * @param rInit The initial orbit radius. (km)
16588
+ * @param rFinal The final orbit radius. (km)
16589
+ * @param deltaIncRad The inclination change. (rad)
16590
+ * @returns Per-burn delta-V magnitudes, total, transfer time, and the plane-change assignment.
16591
+ */
16592
+ static hohmannTransferWithPlaneChange(rInit: number, rFinal: number, deltaIncRad: Radians): HohmannTransferWithPlaneChangeResult;
15683
16593
  get deltaV(): number;
15684
16594
  /**
15685
16595
  * Calculates the two maneuver thrusts required for a two-burn orbit transfer.
@@ -17212,10 +18122,15 @@ declare class LaunchTrajectoryGenerator {
17212
18122
  */
17213
18123
  private static greatCirclePoint_;
17214
18124
  /**
17215
- * Convert geodetic coordinates to ECI position.
17216
- * Uses spherical Earth approximation (consistent with lla2eci in transforms.ts).
18125
+ * Convert geodetic coordinates to a J2000 position.
18126
+ *
18127
+ * The point is placed on the WGS84 ellipsoid in ITRF and rotated into J2000 with
18128
+ * precession, nutation and sidereal time, so the trajectory starts on the same launch
18129
+ * site a `GroundObject` at those coordinates reports. (A spherical Earth rotated by GMST
18130
+ * alone, the earlier model, is a TEME position on the wrong surface: the pad sat ~17 km
18131
+ * off on the sphere plus up to ~40 km of precession and nutation since J2000.)
17217
18132
  */
17218
- private static geodeticToEci_;
18133
+ private static geodeticToJ2000_;
17219
18134
  /**
17220
18135
  * Compute the orbital velocity vector at the insertion point.
17221
18136
  * The velocity is tangent to the orbit (perpendicular to the radial direction),
@@ -17266,107 +18181,167 @@ declare class LaunchTrajectoryGenerator {
17266
18181
  * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
17267
18182
  */
17268
18183
 
18184
+ /** Options for {@link LaunchWindowFinder}. */
18185
+ interface LaunchWindowOptions {
18186
+ /** Launch site geodetic latitude. */
18187
+ siteLat: Degrees;
18188
+ /** Launch site longitude (-180 to 180, east positive). */
18189
+ siteLon: Degrees;
18190
+ /** Inclination of the desired orbit. */
18191
+ inclination: Degrees;
18192
+ /** Whether the vehicle crosses the site heading north (ascending leg) or south (descending leg). */
18193
+ direction: 'N' | 'S';
18194
+ /**
18195
+ * RAAN of the target orbital plane. Pass a function to account for the
18196
+ * target's nodal drift over the search window (see {@link LaunchWindowFinder.meanRaanAt}).
18197
+ */
18198
+ targetRaan: Degrees | ((time: Date) => Degrees);
18199
+ /** Start of the search window. */
18200
+ startTime: Date;
18201
+ /** Length of the search window in hours. Defaults to 24. */
18202
+ searchHours?: number;
18203
+ /** Coarse scan step in seconds. Defaults to 60. */
18204
+ coarseStepSec?: number;
18205
+ /** Refinement step in seconds around the best coarse sample. Defaults to 1. */
18206
+ fineStepSec?: number;
18207
+ }
18208
+ /** A candidate launch time and the plane alignment it achieves. */
18209
+ interface LaunchWindowResult {
18210
+ /** The launch time that best aligns the launch plane with the target plane. */
18211
+ time: Date;
18212
+ /** RAAN of the plane reachable by launching at {@link time}. (deg) */
18213
+ achievableRaan: Degrees;
18214
+ /** RAAN of the target plane at {@link time}. (deg) */
18215
+ targetRaan: Degrees;
18216
+ /** Signed alignment error achievable - target, normalized to [-180, 180). (deg) */
18217
+ raanError: Degrees;
18218
+ }
17269
18219
  /**
17270
- * Parameters describing an orbit's current state.
18220
+ * Finds the launch time whose resulting orbital plane best matches a target
18221
+ * plane's RAAN (a launch-window / RAAN-matching search).
18222
+ *
18223
+ * A launch site can only inject into planes that contain it, so for a fixed
18224
+ * inclination the achievable RAAN is a function of launch time alone: the site
18225
+ * rotates eastward under the candidate planes at Earth's rotation rate. This
18226
+ * class computes that achievable RAAN in closed form (spherical geometry, no
18227
+ * propagation) and scans a time window for the minimum |ΔRAAN| against the
18228
+ * target plane.
18229
+ *
18230
+ * @example
18231
+ * ```typescript
18232
+ * const finder = new LaunchWindowFinder({
18233
+ * siteLat: 28.608 as Degrees, // Kennedy Space Center
18234
+ * siteLon: -80.604 as Degrees,
18235
+ * inclination: 51.64 as Degrees,
18236
+ * direction: 'N',
18237
+ * targetRaan: (t) => LaunchWindowFinder.meanRaanAt(issSatrec, t),
18238
+ * startTime: new Date(),
18239
+ * });
18240
+ * const window = finder.findBestLaunchTime();
18241
+ * ```
17271
18242
  */
17272
- interface OrbitParameters {
17273
- meanAnomaly: number;
17274
- argOfPerigee: number;
17275
- raan: number;
17276
- altitude: number;
17277
- latitude: number;
17278
- longitude: number;
18243
+ declare class LaunchWindowFinder {
18244
+ private readonly options_;
18245
+ constructor(options: LaunchWindowOptions);
18246
+ /**
18247
+ * Whether the site can inject directly into the desired inclination: the
18248
+ * orbit plane must reach the site's latitude, i.e. |sin(lat)| <= sin(inc).
18249
+ */
18250
+ isGeometryPossible(): boolean;
18251
+ /**
18252
+ * RAAN of the (only) plane with the configured inclination that contains the
18253
+ * launch site at the given time on the configured leg. (deg, 0-360)
18254
+ */
18255
+ achievableRaan(time: Date): Degrees;
18256
+ /**
18257
+ * Scans the search window for the launch time minimizing |ΔRAAN| to the
18258
+ * target plane, then refines around the best coarse sample. Returns null
18259
+ * when the geometry is impossible (inclination below site latitude).
18260
+ */
18261
+ findBestLaunchTime(): LaunchWindowResult | null;
18262
+ /**
18263
+ * Mean RAAN of a satellite at a given time: the TLE epoch value advanced by
18264
+ * the secular nodal drift (J2). Suitable as the `targetRaan` function so the
18265
+ * target plane's regression over the search window is accounted for.
18266
+ */
18267
+ static meanRaanAt(satrec: SatelliteRecord, time: Date): Degrees;
18268
+ private targetRaanAt_;
18269
+ private raanErrorAt_;
18270
+ private static julianDate_;
18271
+ private static normalizeDeg_;
18272
+ private static normalize180_;
17279
18273
  }
18274
+
17280
18275
  /**
17281
- * Options for OrbitFinder.
18276
+ * @author Theodore Kruczek
18277
+ * @license AGPL-3.0-or-later
18278
+ * @copyright (c) 2025-2026 Kruczek Labs LLC
18279
+ *
18280
+ * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
18281
+ * terms of the GNU Affero General Public License as published by the Free Software
18282
+ * Foundation, either version 3 of the License, or (at your option) any later version.
18283
+ *
18284
+ * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
18285
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18286
+ * See the GNU Affero General Public License for more details.
18287
+ *
18288
+ * You should have received a copy of the GNU Affero General Public License along with
18289
+ * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
17282
18290
  */
17283
- interface OrbitFinderOptions {
17284
- /** Optional callback for debug messages */
17285
- debugCallback?: (message: string) => void;
18291
+
18292
+ /** Cartesian TEME vector, km (position) or km/s (velocity). */
18293
+ interface StateVec3 {
18294
+ x: number;
18295
+ y: number;
18296
+ z: number;
18297
+ }
18298
+ interface GroundTrackState {
18299
+ /** TEME position at the epoch (km). */
18300
+ position: StateVec3;
18301
+ /** TEME velocity at the epoch (km/s). */
18302
+ velocity: StateVec3;
18303
+ }
18304
+ interface GroundTrackStateOptions {
18305
+ /** Semi-major axis of the desired orbit (km). */
18306
+ semimajorAxisKm: Kilometers;
18307
+ /** Eccentricity of the desired orbit (0 for circular). */
18308
+ eccentricity: number;
18309
+ /** Inclination of the desired orbit (radians, 0..pi). */
18310
+ inclinationRad: Radians;
18311
+ /** Geodetic latitude of the launch site / target sub-point (radians). */
18312
+ latRad: Radians;
18313
+ /** Geodetic longitude of the launch site / target sub-point (radians, -pi..pi). */
18314
+ lonRad: Radians;
18315
+ /** GMST at the epoch (radians). */
18316
+ gmstRad: GreenwichMeanSiderealTime;
18317
+ /** Direction of ground-track motion at the sub-point: 'N' (ascending) or 'S' (descending). */
18318
+ direction: 'N' | 'S';
17286
18319
  }
17287
18320
  /**
17288
- * OrbitFinder is a utility class for manipulating satellite orbital parameters
17289
- * to position a satellite over a specific latitude/longitude at a specific time.
18321
+ * Builds a TEME state vector that places a satellite at **perigee, directly over a
18322
+ * geodetic sub-point**, on an orbit of the requested shape and inclination, moving
18323
+ * North (ascending) or South (descending) at that point.
17290
18324
  *
17291
- * It works by taking an existing satellite's orbital parameters as a starting point
17292
- * and searching for adjustments to orbital elements (mean anomaly, RAAN, argument of perigee)
17293
- * until it finds a configuration that passes over the target location with the correct
17294
- * directional motion (North or South).
18325
+ * This is the closed-form replacement for the {@link OrbitFinder} ground-track
18326
+ * search: instead of synthesizing candidate TLEs and iterating SGP4 until the
18327
+ * sub-point converges (~2.8 km tolerance), it constructs the exact state
18328
+ * analytically. Feed the result to `rv2tle` to fit SGP4 mean elements.
17295
18329
  *
17296
- * @example
17297
- * ```typescript
17298
- * // Create an OrbitFinder for a circular orbit
17299
- * const finder = new OrbitFinder(
17300
- * satellite,
17301
- * 45.0 as Degrees, // target latitude
17302
- * -122.0 as Degrees, // target longitude
17303
- * 'N', // moving north at target
17304
- * new Date()
17305
- * );
17306
- * const result = finder.rotateOrbitToLatLon();
17307
- * if (result[0] !== 'Error') {
17308
- * const [tle1, tle2] = result;
17309
- * // Use the new TLE
17310
- * }
18330
+ * The position is built with the full WGS84 ellipsoid so `eci2lla(position, gmst)`
18331
+ * returns the requested lat/lon exactly. The velocity is perpendicular to the
18332
+ * radius vector (flight-path angle 0, i.e. perigee) with the horizontal azimuth
18333
+ * fixed by the standard `cos(i) = sin(azimuth) * cos(geocentricLat)` relation, so
18334
+ * the fitted orbit has the requested inclination. For a circular orbit (e = 0)
18335
+ * this reduces to radius = a and speed = sqrt(mu / a).
17311
18336
  *
17312
- * // For elliptical orbits, specify target altitude
17313
- * const ellipticalFinder = new OrbitFinder(
17314
- * satellite,
17315
- * 45.0 as Degrees,
17316
- * -122.0 as Degrees,
17317
- * 'S',
17318
- * new Date(),
17319
- * 400 as Kilometers // target altitude for perigee
17320
- * );
17321
- * ```
18337
+ * @returns the TEME position/velocity, or `null` when the target latitude is
18338
+ * unreachable for the requested inclination (|cos(i)| > cos(geocentricLat)).
17322
18339
  */
17323
- declare class OrbitFinder {
17324
- static readonly MAX_LAT_ERROR: Degrees;
17325
- static readonly MAX_LON_ERROR: Degrees;
17326
- static readonly MAX_ALT_ERROR: Kilometers;
17327
- static readonly MAX_ITERATIONS = 5000;
17328
- static readonly COARSE_STEP = 1;
17329
- static readonly FINE_STEP = 0.005;
17330
- private readonly sat_;
17331
- private readonly goalParams_;
17332
- private readonly now_;
17333
- private readonly goalDirection_;
17334
- private readonly debugCallback_?;
17335
- private currentParams_;
17336
- private lastLatitude_;
17337
- private currentDirection_;
17338
- constructor(sat: Satellite, goalLat: Degrees, goalLon: Degrees, goalDirection: 'N' | 'S', now: Date, goalAlt?: Kilometers, raanOffset?: number, options?: OrbitFinderOptions);
17339
- /**
17340
- * Rotates the orbit to pass over the target latitude/longitude at the specified time.
17341
- * @returns A tuple of [TleLine1, TleLine2] on success, or ['Error', message] on failure.
17342
- */
17343
- rotateOrbitToLatLon(): [TleLine1, TleLine2] | ['Error', string];
17344
- private debug_;
17345
- private calculateTimeVariables_;
17346
- private getCurrentOrbitParams_;
17347
- private determineDirection_;
17348
- private isCorrectDirection_;
17349
- private updateOrbit_;
17350
- private meanACalcLoop_;
17351
- private meanACalc_;
17352
- private linearSearchRaan_;
17353
- private normalizeAngleDifference_;
17354
- private calculateError_;
17355
- private updateOrbitWithoutDirectionCheck_;
17356
- private findPerigeePosition_;
17357
- /**
17358
- * Returns the 5-char satnum to embed in the synthesized TLEs.
17359
- *
17360
- * Why not {@link Satellite.sccNum}? For extended (7+ digit) IDs sccNum is
17361
- * the full 9-digit canonical value, which would push the TLE past 69 chars
17362
- * and break Sgp4.createSatrec. The input tle1 always has a valid 5-char
17363
- * satnum at columns 2-6, and SGP4 itself doesn't care what value lives
17364
- * there as long as line 1 and line 2 agree — so use that.
17365
- */
17366
- private tleSatNum_;
17367
- private generateTle1_;
17368
- private generateTle2_;
17369
- }
18340
+ declare const groundTrackStateVector: (opts: GroundTrackStateOptions) => GroundTrackState | null;
18341
+ /** Semi-major axis (km) from an SGP4 mean motion in revolutions/day. */
18342
+ declare const semimajorAxisFromMeanMotion: (meanMotionRevPerDay: number) => Kilometers;
18343
+ /** Perigee speed (km/s) — exported for callers that need the vis-viva speed alongside the state. */
18344
+ declare const perigeeSpeed: (semimajorAxisKm: Kilometers, eccentricity: number) => KilometersPerSecond;
17370
18345
 
17371
18346
  /**
17372
18347
  * @author Theodore Kruczek
@@ -17552,4 +18527,68 @@ declare class RepeatGroundTrack {
17552
18527
  private static gcd_;
17553
18528
  }
17554
18529
 
17555
- export { AccessCalculator, type AccessConstraints, AccessWindow, AngularDiameterMethod, AngularDistanceMethod, Antenna, type AntennaParams, AtmosphericDrag, type AzEl, BaseObject, type BaseObjectParams, BatchLeastSquaresOD, BatchLeastSquaresResult, Beacon, type BeaconParams, type BoresightFrame, BoxMuller, type CatalogObject, CatalogScreener, type CatalogScreeningOptions, CatalogSource, type CdmExportOptions, CdmExporter, type CdmHeader, type CdmManeuverableStatus, type CdmObjectData, type CdmObjectMetadata, type CdmObjectType, CdmParser, type CdmRelativeData, CelestialBody, type CelestialBodyParams, CelestialBodyType, CenterBody, CenterBodyMu, ChebyshevCoefficients, ChebyshevCompressor, ChebyshevInterpolator, ClassicalElements, type ClassicalElementsParams, CommDeviceType, CommLink, type CommPlatform, CommunicationDevice, type CommunicationDeviceInterface, type CommunicationDeviceParams, ConjunctionAssessment, type ConjunctionAssessmentOptions, ConjunctionEvent, type ConjunctionSpaceObjectInput, type ConsistencyRatioResult, ConstellationGenerator, ContactScheduler, ContactSelectionStrategy, CovarianceFrame, CovarianceRealism, type CovarianceRealismResult, CovarianceSample, type CoverageStatistics, CubicSpline, CubicSplineInterpolator, DEFAULT_INTERPOLATOR, DEFAULT_LAGRANGE_ORDER, DEG2RAD, DataHandler, type Days, type Dbm, type Dbw, type Decibels, type Degrees, type DegreesPerDay, type DegreesPerSecond, type DifferentiableFunction, DormandPrince54Propagator, DownhillSimplex, DynamicGroundObject, type DynamicGroundObjectParams, Earth, EarthGravity, type EcefVec3, type EigenvalueAnalysisResult, type ElevationMask, type EnuVec3, EphemerisBody, type EphemerisBodyParams, type EphemerisDataPoint, type EphemerisInterpolationType, EphemerisSatellite, type EphemerisSatelliteParams, Epoch, EpochGPS, EpochTAI, EpochTDB, EpochTT, EpochUTC, EpochWindow, EquinoctialElements, type EquinoctialElementsParams, EulerAngles, FieldInterpolator, FieldOfView, type FieldOfViewParams, type FindNearestOptions, Force, ForceModel, FormatTle, type FovBoundaryPoint, FovFrame, FovShape, type GcrfVec3, Geodetic, GibbsIOD, GoldenSection, GoodingIOD, Gravity, type GreenwichMeanSiderealTime, type GroundInterpolationMethod, GroundObject, type GroundObjectParams, type GroundPositionParams, GroundStation, type GroundStationParams, type GroundTrackPoint, HerrickGibbsIOD, type Hertz, Hill, type HistoricalState, History, type HistoryConfig, type HistoryEntry, type HorizonsEphemerisData, type HorizonsObserverResult, HorizonsParser, type HorizonsVectorResult, type Hours, ITRF, Interpolator, InterpolatorType, type ItrfVec3, J2000, type J2000Vec3, type JacobianFunction, Jupiter, KM_PER_AU, KeplerPropagator, type Kilometers, type KilometersPerSecond, LagrangeInterpolator, LambertIOD, LandObject, LaserRangingSensor, type LaserRangingSensorParams, type LaunchDetails, type LaunchTrajectoryConfig, LaunchTrajectoryGenerator, LevenbergMarquardtOD, LevenbergMarquardtResult, type LibrationData, type Line1Data, type Line2Data, type LinkBudget, type LlaVec3, type Lookangle, MILLISECONDS_PER_DAY, MILLISECONDS_PER_SECOND, MILLISECONDS_TO_DAYS, MINUTES_PER_DAY, MS_PER_DAY, type MahalanobisResult, Marker, Mars, Matrix, MechanicalRadar, type MechanicalRadarParams, Mercury, type Meters, type MetersPerSecond, type Milliseconds, type Minutes, ModifiedGoodingIOD, ModulationType, Moon, MoonBody, type MoonPhaseInfo, type MoonTimes, Neptune, type NumericalPropagatorOptions, type NutationAngles, Observation, ObservationOptical, ObservationRadar, type OdmExportOptions, OdmExporter, type OemCovarianceMatrix, type OemDataBlock, type OemExportOptions, type OemFromStateVectorsOptions, type OemHeader, type OemMetadata, OemParser, type OmmCovarianceMatrix, type OmmDataFormat, type OmmExportOptions, type OmmHeader, type OmmMeanElements, type OmmMetadata, type OmmParsedDataFormat, OmmParser, type OmmSpacecraftParameters, type OmmTleParameters, type OmmUserDefined, OotkError, type OperationsDetails, type OpmExportOptions, OpticalSensor, type OpticalSensorParams, type OptionsParams, OrbitDeterminationError, OrbitFinder, type OrbitFinderOptions, type OrbitParameters, OrbitRegime, type OrbitTrackPoint, type OrbitalShell, PI, ParseError, type ParsedCdm, type ParsedOem, type ParsedOmm, PassType, PassiveRFSensor, type PassiveRFSensorParams, PayloadStatus, PhasedArrayRadar, type PhasedArrayRadarParams, PlaneChangeBurn, PlanetBody, Pluto, PolynomialRegression, type PosVel, type PositionVelocity, type PrecessionAngles, ProbabilityOfCollision, PropagationError, Propagator, PropagatorType, Quaternion, RAD2DEG, RADIUS_OF_EARTH, RAE, RCS_VMAG_ESTIMATE_MAX, RCS_VMAG_ESTIMATE_MIN, RIC, type RaDec, RadarSensor, type RadarSensorParams, RadecGeocentric, RadecTopocentric, type Radians, type RadiansPerSecond, type RaeVec3, Random, RandomGaussianSource, type RcsShape, Receiver, type ReceiverParams, type ReferenceFrame, RelativeState, type RelayLinkBudget, RepeatGroundTrack, type RepeatGroundTrackOptions, type RepeatOrbitResult, type RfVec3, type RicSigmas, type RiseSetTimes, RkCheckpoint, RkResult, RungeKutta4Propagator, RungeKutta89Propagator, RungeKuttaAdaptive, type RuvVec3, type Rv2TleOptions, type Rv2TleResult, type RvVector, SLR_WAVELENGTHS, SPEED_OF_LIGHT_KM_S, type SatNumKind, Satellite, type SatelliteCoverageStats, type SatelliteParams, type SatelliteRecord, Saturn, type ScaleFactorResult, type ScheduleOptions, ScheduledContact, type ScheduledContactParams, ScreeningFilter, type ScreeningResult, type Seconds, type SecondsPerMeterPerSecond, SegmentedLagrangeInterpolator, Sensor, type SensorInterface, type SensorParams, type SensorPlatform, SensorType, type SerializedAntenna, type SerializedCommDevice, type SerializedObject, type SerializedSensor, type SezVec3, Sgp4, Sgp4Error, Sgp4ErrorCode, Sgp4OpsMode, Sgp4Propagator, type Sgp4Result, SimpleLinearRegression, SolarRadiationPressure, SolarSystem, type SpaceCraftDetails, SpaceObject, type SpaceObjectParams, SpaceObjectType, Star, type StarObjectParams, StateCovariance, StateInterpolator, StateVector, type StateVectorSgp4, type StationCoverageStats, type StringifiedNumber, Sun, SunBody, SunStatus, type SunTime, TAU, TEME, type TemeVec3, ThirdBodyGravity, Thrust, TimeStamped, type TimeWindow, Tle, type TleData, type TleDataFull, type TleLine1, type TleLine2, type TleParams, Transmitter, type TransmitterParams, Transponder, type TransponderParams, TwoBurnOrbitTransfer, Uranus, ValidationError, type Vec3, type Vec3Flat, Vector, Vector3D, Venus, VerletBlendInterpolator, VisualizationHelpers, type Watts, Waypoint, type WaypointData, ZoomValue, acoth, acsch, angularDiameter, angularDistance, angularVelocityOfEarth, array2d, asec2rad, asech, azel2uv, bodyTypeLookup, boresightFrameFromAzElRoll, cKmPerMs, cKmPerSec, cMPerSec, calcGmst, calcIncFromAz, calcInertAz, calculateFspl, calculatePropagationDelay, cappedScreeningCovarianceFromTle, clamp, concat, copySign, covariance, createCovarianceFromTle, createSampleCovarianceFromTle, createVec, csch, dbmToDbw, dbwToDbm, dbwToWatts, deg2rad, derivative, dopplerFactor, earthGravityParam, ecef2eci, ecef2enu, ecef2rae, ecefRad2rae, eci2ecef, eci2lla, eci2rae, enu2rf, estimateRcs, estimateVmagFromRcs, evalPoly, factorial, gamma, getDayOfYear, getDegLat, getDegLon, getRadLat, getRadLon, halfPi, isLeapYear, jacobian, jday, linearDistance, linearInterpolate, lla2ecef, lla2eci, lla2sez, llaRad2ecef, log10, mag2db, masec2rad, matchHalfPlane, mean, msec2sec, newtonM, newtonNu, normalizeAngle, observationDerivative, observationNoiseFromSigmas, parseCenterBody, rad2deg, radecToPosition, radecToVelocity, rae2ecef, rae2eci, rae2enu, rae2raeOffBoresight, rae2ruv, rae2sez, relativeVelocity, rv2tle, scaleAndClampRicSigmas, sec2day, sec2deg, sec2min, sech, secondsPerDay, secondsPerSiderealDay, secondsPerWeek, sez2rae, sign, spaceObjType2Str, std, temp4, toPrecision, ttasec2rad, uv2azel, wattsToDbw, wrapAngle, x2o3 };
18530
+ /**
18531
+ * @author Theodore Kruczek
18532
+ * @license AGPL-3.0-or-later
18533
+ * @copyright (c) 2025-2026 Kruczek Labs LLC
18534
+ *
18535
+ * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
18536
+ * terms of the GNU Affero General Public License as published by the Free Software
18537
+ * Foundation, either version 3 of the License, or (at your option) any later version.
18538
+ *
18539
+ * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
18540
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18541
+ * See the GNU Affero General Public License for more details.
18542
+ *
18543
+ * You should have received a copy of the GNU Affero General Public License along with
18544
+ * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
18545
+ */
18546
+
18547
+ /**
18548
+ * Classic SGP4 propagation via the official USSF Astro Standards
18549
+ * "C Sgp4Prop WebAssembly" build (`Sgp4Prop.js` / `Sgp4Prop.wasm`).
18550
+ *
18551
+ * @example
18552
+ * ```ts
18553
+ * const sgp4 = await new Sgp4Wasm().load();
18554
+ * const satKey = sgp4.addSat(line1, line2);
18555
+ * sgp4.initSats([satKey]);
18556
+ * const state = sgp4.propagateOne(satKey, 60); // 60 min past epoch
18557
+ * ```
18558
+ */
18559
+ declare class Sgp4Wasm extends Sgp4WasmBase {
18560
+ protected readonly defaultGlueFile_ = "Sgp4Prop.js";
18561
+ protected readonly defaultWasmFile_ = "Sgp4Prop.wasm";
18562
+ }
18563
+
18564
+ /**
18565
+ * @author Theodore Kruczek
18566
+ * @license AGPL-3.0-or-later
18567
+ * @copyright (c) 2025-2026 Kruczek Labs LLC
18568
+ *
18569
+ * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
18570
+ * terms of the GNU Affero General Public License as published by the Free Software
18571
+ * Foundation, either version 3 of the License, or (at your option) any later version.
18572
+ *
18573
+ * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
18574
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18575
+ * See the GNU Affero General Public License for more details.
18576
+ *
18577
+ * You should have received a copy of the GNU Affero General Public License along with
18578
+ * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
18579
+ */
18580
+
18581
+ /**
18582
+ * SGP4-XP propagation via the official USSF Astro Standards
18583
+ * "C Sgp4Prop WebAssembly" build (`Sgp4Prop.xp.js` / `Sgp4Prop.xp.wasm`).
18584
+ *
18585
+ * SGP4-XP is the extended propagator that additionally supports
18586
+ * ephemeris-type-4 TLEs; for classic type-0 TLEs it produces results
18587
+ * matching {@link Sgp4Wasm}. The API surface is identical.
18588
+ */
18589
+ declare class Sgp4XpWasm extends Sgp4WasmBase {
18590
+ protected readonly defaultGlueFile_ = "Sgp4Prop.xp.js";
18591
+ protected readonly defaultWasmFile_ = "Sgp4Prop.xp.wasm";
18592
+ }
18593
+
18594
+ export { AccessCalculator, type AccessConstraints, AccessWindow, AngularDiameterMethod, AngularDistanceMethod, Antenna, type AntennaParams, AtmosphericDrag, type AzEl, BaseObject, type BaseObjectParams, BatchLeastSquaresOD, BatchLeastSquaresResult, Beacon, type BeaconParams, type BoresightFrame, BoxMuller, type CatalogObject, CatalogScreener, type CatalogScreeningOptions, CatalogSource, type CdmExportOptions, CdmExporter, type CdmHeader, type CdmManeuverableStatus, type CdmObjectData, type CdmObjectMetadata, type CdmObjectType, CdmParser, type CdmRelativeData, CelestialBody, type CelestialBodyParams, CelestialBodyType, CenterBody, CenterBodyMu, ChebyshevCoefficients, ChebyshevCompressor, ChebyshevInterpolator, ClassicalElements, type ClassicalElementsParams, CommDeviceType, CommLink, type CommPlatform, CommunicationDevice, type CommunicationDeviceInterface, type CommunicationDeviceParams, ConjunctionAssessment, type ConjunctionAssessmentOptions, ConjunctionEvent, type ConjunctionSpaceObjectInput, type ConsistencyRatioResult, ConstellationGenerator, ContactScheduler, ContactSelectionStrategy, CovarianceFrame, CovarianceRealism, type CovarianceRealismResult, CovarianceSample, type CoverageStatistics, CubicSpline, CubicSplineInterpolator, DEFAULT_INTERPOLATOR, DEFAULT_LAGRANGE_ORDER, DEG2RAD, DataHandler, type Days, type Dbm, type Dbw, type Decibels, type Degrees, type DegreesPerDay, type DegreesPerSecond, type DifferentiableFunction, DormandPrince54Propagator, DownhillSimplex, DynamicGroundObject, type DynamicGroundObjectParams, Earth, EarthGravity, type EcefVec3, type EigenvalueAnalysisResult, type ElevationMask, type EnuVec3, EphemerisBody, type EphemerisBodyParams, type EphemerisDataPoint, type EphemerisInterpolationType, EphemerisSatellite, type EphemerisSatelliteParams, Epoch, EpochGPS, EpochTAI, EpochTDB, EpochTT, EpochUTC, EpochWindow, EquinoctialElements, type EquinoctialElementsParams, EulerAngles, FieldInterpolator, FieldOfView, type FieldOfViewParams, type FindNearestOptions, Force, ForceModel, FormatTle, type FovBoundaryPoint, FovFrame, FovShape, type GcrfVec3, Geodetic, GibbsIOD, GoldenSection, GoodingIOD, Gravity, type GreenwichMeanSiderealTime, type GroundInterpolationMethod, GroundObject, type GroundObjectParams, type GroundPositionParams, GroundStation, type GroundStationParams, type GroundTrackPoint, type GroundTrackState, type GroundTrackStateOptions, HerrickGibbsIOD, type Hertz, Hill, type HistoricalState, History, type HistoryConfig, type HistoryEntry, type HohmannTransferWithPlaneChangeResult, type HorizonsEphemerisData, type HorizonsObserverResult, HorizonsParser, type HorizonsVectorResult, type Hours, ITRF, Interpolator, InterpolatorType, type ItrfVec3, J2000, type J2000Vec3, type JacobianFunction, Jupiter, KM_PER_AU, KeplerPropagator, type Kilometers, type KilometersPerSecond, LagrangeInterpolator, LambertIOD, LandObject, LaserRangingSensor, type LaserRangingSensorParams, type LaunchDetails, type LaunchTrajectoryConfig, LaunchTrajectoryGenerator, LaunchWindowFinder, type LaunchWindowOptions, type LaunchWindowResult, LevenbergMarquardtOD, LevenbergMarquardtResult, type LibrationData, type Line1Data, type Line2Data, type LinkBudget, type LlaVec3, type Lookangle, MILLISECONDS_PER_DAY, MILLISECONDS_PER_SECOND, MILLISECONDS_TO_DAYS, MINUTES_PER_DAY, MS_PER_DAY, type MahalanobisResult, Marker, Mars, Matrix, MechanicalRadar, type MechanicalRadarParams, Mercury, type Meters, type MetersPerSecond, type Milliseconds, type Minutes, ModifiedGoodingIOD, ModulationType, Moon, MoonBody, type MoonPhaseInfo, type MoonTimes, Neptune, type NumericalPropagatorOptions, type NutationAngles, Observation, ObservationOptical, ObservationRadar, type OdmExportOptions, OdmExporter, type OemCovarianceMatrix, type OemDataBlock, type OemExportOptions, type OemFromStateVectorsOptions, type OemHeader, type OemMetadata, OemParser, type OmmCovarianceMatrix, type OmmDataFormat, type OmmExportOptions, type OmmHeader, type OmmMeanElements, type OmmMetadata, type OmmParsedDataFormat, OmmParser, type OmmSpacecraftParameters, type OmmTleParameters, type OmmUserDefined, OotkError, type OperationsDetails, type OpmExportOptions, OpticalSensor, type OpticalSensorParams, type OptionsParams, OrbitDeterminationError, OrbitRegime, type OrbitTrackPoint, type OrbitalShell, PI, ParseError, type ParsedCdm, type ParsedOem, type ParsedOmm, PassType, PassiveRFSensor, type PassiveRFSensorParams, PayloadStatus, PhasedArrayRadar, type PhasedArrayRadarParams, type PlaneChangeAssignment, PlaneChangeBurn, PlanetBody, Pluto, PolynomialRegression, type PosVel, type PositionVelocity, type PrecessionAngles, ProbabilityOfCollision, PropagationError, Propagator, PropagatorType, PropellantBudget, Quaternion, RAD2DEG, RADIUS_OF_EARTH, RAE, RCS_VMAG_ESTIMATE_MAX, RCS_VMAG_ESTIMATE_MIN, RIC, type RaDec, RadarSensor, type RadarSensorParams, RadecGeocentric, RadecTopocentric, type Radians, type RadiansPerSecond, type RaeVec3, Random, RandomGaussianSource, type RcsShape, Receiver, type ReceiverParams, type ReferenceFrame, RelativeState, type RelayLinkBudget, RepeatGroundTrack, type RepeatGroundTrackOptions, type RepeatOrbitResult, type RfVec3, type RicSigmas, type RiseSetTimes, RkCheckpoint, RkResult, RungeKutta4Propagator, RungeKutta89Propagator, RungeKuttaAdaptive, type RuvVec3, type Rv2TleOptions, type Rv2TleResult, type RvVector, SGP4_WASM_ADD_SAT_ERRORS, SGP4_WASM_DYN_ARR_ERRORS, SLR_WAVELENGTHS, SPEED_OF_LIGHT_KM_S, type SatKey, type SatNumKind, Satellite, type SatelliteCoverageStats, type SatelliteParams, type SatelliteRecord, Saturn, type ScaleFactorResult, type ScheduleOptions, ScheduledContact, type ScheduledContactParams, ScreeningFilter, type ScreeningResult, type Seconds, type SecondsPerMeterPerSecond, SegmentedLagrangeInterpolator, Sensor, type SensorInterface, type SensorParams, type SensorPlatform, SensorType, type SerializedAntenna, type SerializedCommDevice, type SerializedObject, type SerializedSensor, type SezVec3, Sgp4, Sgp4Error, Sgp4ErrorCode, Sgp4OpsMode, type Sgp4PropEmscriptenModule, type Sgp4PropFS, Sgp4Propagator, type Sgp4Result, Sgp4Wasm, Sgp4WasmBase, Sgp4WasmError, type Sgp4WasmFastPosVel, type Sgp4WasmLoadOptions, Sgp4WasmLogLevel, type Sgp4WasmPosVel, Sgp4WasmPropagator, type Sgp4WasmState, Sgp4XpWasm, SimpleLinearRegression, SolarRadiationPressure, SolarSystem, type SpaceCraftDetails, SpaceObject, type SpaceObjectParams, SpaceObjectType, Star, type StarObjectParams, StateCovariance, StateInterpolator, type StateVec3, StateVector, type StateVectorSgp4, type StationCoverageStats, type StringifiedNumber, Sun, SunBody, SunStatus, type SunTime, TAU, TEME, type TemeVec3, ThirdBodyGravity, Thrust, TimeStamped, type TimeWindow, Tle, type TleData, type TleDataFull, type TleLine1, type TleLine2, type TleParams, Transmitter, type TransmitterParams, Transponder, type TransponderParams, TtcAntenna, type TtcAntennaParams, TwoBurnOrbitTransfer, Uranus, ValidationError, type Vec3, type Vec3Flat, Vector, Vector3D, Venus, VerletBlendInterpolator, VisualizationHelpers, type Watts, Waypoint, type WaypointData, ZoomValue, acoth, acsch, angularDiameter, angularDistance, angularVelocityOfEarth, array2d, asec2rad, asech, azel2uv, bodyTypeLookup, boresightFrameFromAzElRoll, cKmPerMs, cKmPerSec, cMPerSec, calcGmst, calcIncFromAz, calcInertAz, calculateFspl, calculatePropagationDelay, cappedScreeningCovarianceFromTle, clamp, concat, copySign, covariance, createCovarianceFromTle, createSampleCovarianceFromTle, createVec, csch, dbmToDbw, dbwToDbm, dbwToWatts, deg2rad, derivative, dopplerFactor, earthGravityParam, ecef2eci, ecef2enu, ecef2rae, ecefRad2rae, eci2ecef, eci2lla, eci2rae, enu2rf, estimateRcs, estimateVmagFromRcs, evalPoly, factorial, gamma, getDayOfYear, getDegLat, getDegLon, getRadLat, getRadLon, groundTrackStateVector, halfPi, isLeapYear, jacobian, jday, linearDistance, linearInterpolate, lla2ecef, lla2eci, lla2sez, llaRad2ecef, log10, mag2db, masec2rad, matchHalfPlane, mean, msec2sec, newtonM, newtonNu, normalizeAngle, observationDerivative, observationNoiseFromSigmas, parseCenterBody, perigeeSpeed, rad2deg, radecToPosition, radecToVelocity, rae2ecef, rae2eci, rae2enu, rae2raeOffBoresight, rae2ruv, rae2sez, relativeVelocity, rv2tle, scaleAndClampRicSigmas, sec2day, sec2deg, sec2min, sech, secondsPerDay, secondsPerSiderealDay, secondsPerWeek, semimajorAxisFromMeanMotion, sez2rae, sign, spaceObjType2Str, std, temp4, toPrecision, ttasec2rad, uv2azel, wattsToDbw, wrapAngle, x2o3 };