/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Custom error classes for ootk.
 *
 * Error Handling Convention:
 * - ValidationError: Invalid constructor arguments, out-of-range values
 * - ParseError: Malformed external data formats (TLE, OEM, Horizons)
 * - PropagationError: Unrecoverable propagation failures (use null for expected failures)
 * - OrbitDeterminationError: IOD algorithm convergence failures
 *
 * Methods that may fail for expected reasons (e.g., satellite decay, time outside
 * ephemeris window) should return null rather than throwing.
 */
/**
 * Base class for all ootk errors.
 *
 * All custom error classes in ootk extend this base class, allowing
 * callers to catch all ootk-specific errors with a single catch block.
 *
 * @example
 * ```typescript
 * try {
 *   const sat = new Satellite({ tle1, tle2 });
 * } catch (e) {
 *   if (e instanceof OotkError) {
 *     console.log('ootk error:', e.message);
 *   }
 * }
 * ```
 */
declare class OotkError extends Error {
    constructor(message: string);
}
/**
 * Thrown when input validation fails (invalid ranges, types, formats).
 *
 * Use this error for:
 * - Constructor parameter validation
 * - Method argument validation
 * - Out-of-range numeric values
 * - Invalid enum values
 *
 * @example
 * ```typescript
 * if (latitude < -90 || latitude > 90) {
 *   throw new ValidationError(
 *     'Latitude must be between -90 and 90 degrees',
 *     'latitude',
 *     latitude,
 *   );
 * }
 * ```
 */
declare class ValidationError extends OotkError {
    readonly field?: string | undefined;
    readonly value?: unknown | undefined;
    /**
     * Creates a new ValidationError.
     * @param message - Human-readable error message
     * @param field - Optional name of the field that failed validation
     * @param value - Optional value that failed validation
     */
    constructor(message: string, field?: string | undefined, value?: unknown | undefined);
}
/**
 * Thrown when parsing external data formats fails.
 *
 * Use this error for:
 * - TLE parsing failures
 * - OEM file parsing failures
 * - Horizons data parsing failures
 * - Any external data format that cannot be parsed
 *
 * @example
 * ```typescript
 * if (line1.length !== 69) {
 *   throw new ParseError(
 *     'TLE line 1 must be exactly 69 characters',
 *     'TLE',
 *     1,
 *   );
 * }
 * ```
 */
declare class ParseError extends OotkError {
    readonly format?: string | undefined;
    readonly line?: number | undefined;
    /**
     * Creates a new ParseError.
     * @param message - Human-readable error message
     * @param format - Optional format identifier (e.g., 'TLE', 'OEM', 'HORIZONS')
     * @param line - Optional line number where the error occurred
     */
    constructor(message: string, format?: string | undefined, line?: number | undefined);
}
/**
 * Thrown when orbital propagation encounters an unrecoverable error.
 *
 * Note: Expected failures (e.g., satellite decay, epoch before TLE epoch)
 * should return null rather than throwing this error. Use PropagationError
 * only for truly unexpected, unrecoverable failures.
 *
 * @example
 * ```typescript
 * if (!isFinite(position.x)) {
 *   throw new PropagationError(
 *     'Propagation produced non-finite position',
 *     epoch,
 *   );
 * }
 * ```
 */
declare class PropagationError extends OotkError {
    readonly epoch?: Date | undefined;
    /**
     * Creates a new PropagationError.
     * @param message - Human-readable error message
     * @param epoch - Optional epoch at which the propagation failed
     */
    constructor(message: string, epoch?: Date | undefined);
}
/**
 * Thrown when orbit determination algorithms fail to converge.
 *
 * Use this error for:
 * - Gauss IOD failures
 * - Gooding IOD failures
 * - Gibbs IOD failures
 * - Lambert solver failures
 * - Any iterative algorithm that fails to converge
 *
 * @example
 * ```typescript
 * if (iterations > maxIterations) {
 *   throw new OrbitDeterminationError(
 *     'Algorithm failed to converge after maximum iterations',
 *     'Gooding',
 *   );
 * }
 * ```
 */
declare class OrbitDeterminationError extends OotkError {
    readonly algorithm?: string | undefined;
    /**
     * Creates a new OrbitDeterminationError.
     * @param message - Human-readable error message
     * @param algorithm - Optional algorithm name (e.g., 'Gauss', 'Gooding', 'Lambert')
     */
    constructor(message: string, algorithm?: string | undefined);
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/** Enumeration representing different methods for calculating angular diameter. */
declare enum AngularDiameterMethod {
    Circle = 0,
    Sphere = 1
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/** Enumeration representing different methods for calculating angular distance. */
declare enum AngularDistanceMethod {
    Cosine = 0,
    Haversine = 1
}

declare enum CatalogSource {
    UNKNOWN = "unknown",
    USSF = "spacetrack",
    CELESTRAK = "celestrak",
    CELESTRAK_SUP = "celestrak-sup",
    UNIV_OF_MICH = "univ-of-mich",
    CALPOLY = "calpoly",
    NUSPACE = "nuspace",
    VIMPEL = "vimpel",
    SATNOGS = "satnogs",
    TLE_TXT = "TLE.txt",
    EXTRA_JSON = "extra.json"
}

declare enum CommLink {
    AEHF = "AEHF",
    GALILEO = "Galileo",
    IRIDIUM = "Iridium",
    STARLINK = "Starlink",
    WGS = "WGS"
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * Enum representing the reference frame for field of view boresight specification.
 */
declare enum FovFrame {
    /** Topocentric: azimuth/elevation from local horizon (default for ground sensors) */
    TOPOCENTRIC = "TOPOCENTRIC",
    /** Body-fixed: relative to platform body axes (for space-based sensors) */
    BODY = "BODY"
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * Enum representing different field of view geometric shapes.
 */
declare enum FovShape {
    /** Elliptical cone around boresight (default) */
    ELLIPTICAL_CONE = "ELLIPTICAL_CONE",
    /** Circular cone around boresight (symmetric case) */
    CIRCULAR_CONE = "CIRCULAR_CONE"
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/** Orbit regime classifications. */
declare enum OrbitRegime {
    LEO = "Low Earth Orbit",
    MEO = "Medium Earth Orbit",
    HEO = "Highly Eccentric Orbit",
    GEO = "Geosynchronous Orbit",
    OTHER = "Uncategorized Orbit"
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
declare enum PassType {
    OUT_OF_VIEW = -1,
    ENTER = 0,
    IN_VIEW = 1,
    EXIT = 2
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * Enum representing available propagator implementations.
 */
declare enum PropagatorType {
    /** SGP4/SDP4 analytical propagator (TLE-based). */
    SGP4 = "SGP4",
    /** Kepler analytical two-body propagator. */
    KEPLER = "KEPLER",
    /** Runge-Kutta 4th order fixed-step numerical propagator. */
    RK4 = "RK4",
    /** Dormand-Prince 5(4) adaptive numerical propagator. */
    DP54 = "DP54",
    /** @deprecated Use DP54 instead. */
    DORMAND_PRINCE = "DP54",
    /** Runge-Kutta 8(9) adaptive numerical propagator. */
    RK89 = "RK89"
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * Enum representing different types of sensors.
 */
declare enum SensorType {
    /** Optical/visual sensor (telescope, camera) */
    OPTICAL = "OPTICAL",
    /** Mechanical tracking radar (dish-based) */
    MECHANICAL_RADAR = "MECHANICAL_RADAR",
    /** Phased array radar (electronic beam steering) */
    PHASED_ARRAY_RADAR = "PHASED_ARRAY_RADAR",
    /** Laser ranging sensor (SLR - Satellite Laser Ranging) */
    LASER_RANGING = "LASER_RANGING",
    /** Passive RF sensor (SIGINT, no transmission) */
    PASSIVE_RF = "PASSIVE_RF",
    /** Bistatic radio telescope */
    BISTATIC_RADIO_TELESCOPE = "BISTATIC_RADIO_TELESCOPE"
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
declare enum Sgp4OpsMode {
    AFSPC = "a",
    IMPROVED = "i"
}

/**
 * @author @thkruz Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * Represents the illumination status of a satellite relative to the Sun.
 *
 * This enum is used to indicate whether a satellite is in sunlight, in Earth's
 * shadow (eclipse), or in an unknown state.
 */
declare enum SunStatus {
    /** Unknown illumination state - typically when position data is unavailable */
    UNKNOWN = -1,
    /** Satellite is in Earth's umbral shadow (full eclipse - no direct sunlight) */
    UMBRAL = 0,
    /** Satellite is in Earth's penumbral shadow (partial eclipse - partial sunlight) */
    PENUMBRAL = 1,
    /** Satellite is fully illuminated by the Sun */
    SUN = 2
}

declare enum PayloadStatus {
    OPERATIONAL = "+",
    NONOPERATIONAL = "-",
    PARTIALLY_OPERATIONAL = "P",
    BACKUP_STANDBY = "B",
    SPARE = "S",
    EXTENDED_MISSION = "X",
    DECAYED = "D",
    UNKNOWN = "?"
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Base class for all Epoch time representations.
 *
 * The Epoch class hierarchy provides precise time handling for orbital mechanics
 * calculations. Different astronomical time scales are required for different
 * applications:
 *
 * ## Class Hierarchy
 * ```
 * Epoch (base class)
 * ├── EpochUTC  - Coordinated Universal Time (primary user-facing class)
 * ├── EpochTAI  - International Atomic Time
 * ├── EpochTT   - Terrestrial Time
 * └── EpochTDB  - Barycentric Dynamical Time
 *
 * EpochGPS      - GPS Time (standalone, week/seconds format)
 * ```
 *
 * ## Time Scale Conversion Chain
 * ```
 * UTC ──(+leap seconds)──► TAI ──(+32.184s)──► TT ──(+relativistic)──► TDB
 *  │
 *  └──(week/seconds since 1980-01-06)──► GPS
 * ```
 *
 * ## Internal Representation
 * All Epoch subclasses store time as POSIX seconds (seconds since
 * 1970-01-01T00:00:00.000 in their respective time scale). This provides
 * a consistent internal representation while allowing conversions between
 * time scales.
 *
 * @see EpochUTC - The primary entry point for time operations
 * @see EpochTAI - For continuous atomic timekeeping
 * @see EpochTT - For Earth-based astronomical observations
 * @see EpochTDB - For planetary ephemerides and solar system calculations
 * @see EpochGPS - For GPS/GNSS applications
 */
declare class Epoch {
    posix: Seconds;
    constructor(posix?: Seconds);
    toString(): string;
    toExcelString(): string;
    difference(epoch: Epoch): Seconds;
    equals(epoch: Epoch): boolean;
    toDateTime(): Date;
    toEpochYearAndDay(): {
        epochYr: string;
        epochDay: string;
    };
    private getDayOfYear_;
    private isLeapYear_;
    toJulianDate(): number;
    toJulianCenturies(): number;
    operatorGreaterThan(other: Epoch): boolean;
    operatorGreaterThanOrEqual(other: Epoch): boolean;
    operatorLessThan(other: Epoch): boolean;
    operatorLessThanOrEqual(other: Epoch): boolean;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Represents an epoch in GPS Time format.
 *
 * GPS Time uses a week number and seconds-into-week format, referenced to
 * the GPS epoch of January 6, 1980, 00:00:00 UTC. Unlike UTC, GPS Time does
 * **not** include leap seconds, so it runs ahead of UTC by the accumulated
 * leap seconds since 1980 minus 19 seconds.
 *
 * ## GPS Time Structure
 * GPS time is expressed as two components:
 * - **Week number**: Weeks since January 6, 1980
 * - **Seconds of week**: Seconds elapsed in the current week (0 to 604799)
 *
 * ## Relationship to Other Time Scales
 * ```
 * GPS = UTC + leap_seconds - 19
 * GPS = TAI - 19
 * ```
 *
 * The 19-second offset exists because GPS Time was synchronized with UTC
 * when there were 19 leap seconds, and GPS Time has not added leap seconds
 * since then.
 *
 * ## Week Number Rollover
 * GPS receivers transmit week numbers with limited bits, causing rollover:
 * - **10-bit rollover**: Every 1024 weeks (~19.7 years)
 * - **13-bit rollover**: Every 8192 weeks (~157 years)
 *
 * Use `week10Bit` or `week13Bit` getters when interfacing with receivers
 * that use these formats.
 *
 * ## When to Use EpochGPS
 * - **GPS receiver data**: Parsing timestamps from GPS/GNSS receivers
 * - **Navigation messages**: Working with GPS broadcast ephemerides
 * - **GNSS applications**: Any Global Navigation Satellite System work
 * - **Precise timing**: GPS provides nanosecond-level timing
 *
 * ## When NOT to Use EpochGPS
 * - For general satellite tracking (use EpochUTC)
 * - For astronomical calculations (use EpochTT or EpochTDB)
 * - For user-facing timestamps (use EpochUTC)
 *
 * ## Creating and Converting Instances
 * ```typescript
 * // Convert from UTC to GPS
 * const utc = EpochUTC.now();
 * const gps = utc.toGPS();
 *
 * console.log(gps.week);      // Full week number
 * console.log(gps.seconds);   // Seconds into week
 * console.log(gps.week10Bit); // 10-bit week (for legacy receivers)
 *
 * // Convert back to UTC
 * const utcAgain = gps.toUTC();
 * ```
 *
 * @see EpochUTC - Primary time class, use toGPS() to convert
 */
declare class EpochGPS {
    week: number;
    seconds: number;
    /**
     * Create a new GPS epoch given the [week] since reference epoch, and number
     * of [seconds] into the [week].
     * @param week Number of weeks since the GPS reference epoch.
     * @param seconds Number of seconds into the week.
     */
    constructor(week: number, seconds: number);
    /** Cached GPS reference epoch (1980-01-06T00:00:00.000Z) */
    private static reference_;
    /**
     * Gets the GPS reference epoch (1980-01-06T00:00:00.000Z).
     * Uses lazy initialization to avoid circular dependency issues.
     */
    static getReference(): EpochUTC;
    static readonly offset: Seconds;
    get week10Bit(): number;
    get week13Bit(): number;
    toString(): string;
    /** Convert this to a UTC epoch. */
    toUTC(): EpochUTC;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Represents an epoch in International Atomic Time (TAI).
 *
 * TAI is a continuous time scale maintained by atomic clocks worldwide. Unlike
 * UTC, TAI does **not** include leap seconds, making it ideal for applications
 * requiring uniform time intervals.
 *
 * ## Relationship to Other Time Scales
 * ```
 * TAI = UTC + leap_seconds
 * TT  = TAI + 32.184 seconds
 * ```
 *
 * As of 2024, TAI is ahead of UTC by 37 seconds. This offset increases
 * whenever a leap second is added to UTC (typically every few years).
 *
 * ## When to Use EpochTAI
 * - When you need continuous timekeeping without leap second discontinuities
 * - As an intermediate step when converting between UTC and TT/TDB
 * - For precise timing applications where uniform seconds are required
 * - When interfacing with systems that use atomic time
 *
 * ## When NOT to Use EpochTAI
 * - For user-facing timestamps (use EpochUTC instead)
 * - For TLE epoch parsing (TLEs use UTC)
 * - When civil time is expected
 *
 * ## Creating Instances
 * EpochTAI is typically created by converting from EpochUTC:
 * ```typescript
 * const utc = EpochUTC.now();
 * const tai = utc.toTAI();
 * ```
 *
 * @see EpochUTC - Primary time class, use toTAI() to convert
 * @see EpochTT - Terrestrial Time, derived from TAI + 32.184s
 */
declare class EpochTAI extends Epoch {
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Represents an epoch in Barycentric Dynamical Time (TDB).
 *
 * TDB is the time scale used for solar system barycentric calculations. It
 * accounts for relativistic time dilation effects due to Earth's motion
 * around the Sun and its position in the solar system's gravitational field.
 *
 * ## Relationship to Other Time Scales
 * ```
 * TDB ≈ TT + 0.001658·sin(M) + 0.000014·sin(2M)
 * ```
 * Where M is the mean anomaly of Earth's orbit. The difference between TDB
 * and TT is periodic with amplitude of approximately ±1.6 milliseconds.
 *
 * ## When to Use EpochTDB
 * - **JPL planetary ephemerides**: DE430, DE440, etc. use TDB as their
 *   time argument
 * - **Solar system body positions**: Calculating positions of planets,
 *   moons, and asteroids
 * - **Interplanetary mission planning**: Trajectories involving multiple
 *   solar system bodies
 * - **Barycentric coordinate systems**: ICRF/BCRS calculations
 *
 * ## When NOT to Use EpochTDB
 * - For Earth-centered calculations (use EpochTT)
 * - For user-facing timestamps (use EpochUTC)
 * - For satellite orbit propagation around Earth (use EpochTT or EpochUTC)
 *
 * ## Creating Instances
 * EpochTDB is typically created by converting from EpochUTC:
 * ```typescript
 * const utc = EpochUTC.now();
 * const tdb = utc.toTDB();
 *
 * // Use TDB for querying planetary ephemerides
 * const sunPosition = solarSystem.getSunPosition(tdb);
 * const moonPosition = solarSystem.getMoonPosition(tdb);
 * ```
 *
 * ## Technical Note
 * The conversion from TT to TDB uses a simplified formula based on Earth's
 * mean anomaly. For sub-microsecond precision, more complex models from
 * IERS conventions may be required.
 *
 * @see EpochUTC - Primary time class, use toTDB() to convert
 * @see EpochTT - Geocentric time scale, TDB differs by ~1.6ms periodic
 */
declare class EpochTDB extends Epoch {
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Represents an epoch in Terrestrial Time (TT).
 *
 * Terrestrial Time is the modern successor to Ephemeris Time (ET) and is the
 * primary time scale used for geocentric (Earth-centered) astronomical
 * calculations. It provides a uniform time scale tied to the Earth's geoid.
 *
 * ## Relationship to Other Time Scales
 * ```
 * TT = TAI + 32.184 seconds
 * TT = UTC + leap_seconds + 32.184 seconds
 * ```
 *
 * The 32.184 second offset is a fixed constant that was chosen to maintain
 * continuity with Ephemeris Time when TT was introduced in 1991.
 *
 * ## When to Use EpochTT
 * - **Earth-centered force models**: Precession, nutation, and polar motion
 *   calculations typically require TT
 * - **Astronomical almanacs**: Most published ephemerides for Earth-based
 *   observations use TT
 * - **High-precision Earth orientation**: IERS Earth Orientation Parameters
 *   are referenced to TT
 * - **Satellite orbit propagation**: When using force models that reference
 *   Earth's orientation
 *
 * ## When NOT to Use EpochTT
 * - For user-facing timestamps (use EpochUTC)
 * - For solar system barycentric calculations (use EpochTDB)
 * - For GPS applications (use EpochGPS)
 *
 * ## Creating Instances
 * EpochTT is typically created by converting from EpochUTC:
 * ```typescript
 * const utc = EpochUTC.now();
 * const tt = utc.toTT();
 *
 * // TT is used internally for Julian centuries calculations
 * const julianCenturies = tt.toJulianCenturies();
 * ```
 *
 * ## J2000.0 Epoch
 * The standard astronomical epoch J2000.0 (January 1, 2000, 12:00:00 TT) is
 * defined in Terrestrial Time. This is the reference point for many
 * astronomical coordinate systems and ephemerides.
 *
 * @see EpochUTC - Primary time class, use toTT() to convert
 * @see EpochTAI - TAI + 32.184s = TT
 * @see EpochTDB - For solar system barycentric calculations
 */
declare class EpochTT extends Epoch {
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/** Parameters for creating an EpochUTC from date components. */
type FromDateParams = {
    year: number;
    month: number;
    day: number;
    hour?: number;
    minute?: number;
    second?: number;
};
/**
 * Represents an epoch in Coordinated Universal Time (UTC).
 *
 * EpochUTC is the **primary time class** for ootk and should be used as the
 * default choice for most operations. It represents civil time with leap
 * second corrections and serves as the entry point for conversions to other
 * astronomical time scales.
 *
 * ## When to Use EpochUTC
 * - Parsing and working with TLE (Two-Line Element) epochs
 * - User-facing timestamps and I/O operations
 * - General satellite tracking and pass predictions
 * - Any operation where civil time is the natural choice
 *
 * ## Creating Instances
 * ```typescript
 * // Current time
 * const now = EpochUTC.now();
 *
 * // From date components
 * const epoch = EpochUTC.fromDate({ year: 2024, month: 6, day: 15, hour: 12 });
 *
 * // From JavaScript Date
 * const epoch = EpochUTC.fromDateTime(new Date());
 *
 * // From ISO 8601 string
 * const epoch = EpochUTC.fromDateTimeString('2024-06-15T12:00:00Z');
 *
 * // From definitive orbit format ("DDD/YYYY HH:MM:SS.sss")
 * const epoch = EpochUTC.fromDefinitiveString('166/2024 12:00:00.000');
 * ```
 *
 * ## Converting to Other Time Scales
 * ```typescript
 * const utc = EpochUTC.now();
 *
 * const tai = utc.toTAI();   // International Atomic Time
 * const tt  = utc.toTT();    // Terrestrial Time
 * const tdb = utc.toTDB();   // Barycentric Dynamical Time
 * const gps = utc.toGPS();   // GPS Time (week/seconds)
 * ```
 *
 * ## Time Arithmetic
 * ```typescript
 * const epoch = EpochUTC.now();
 * const oneHourLater = epoch.roll(3600 as Seconds);
 * const difference = oneHourLater.difference(epoch); // 3600 seconds
 * ```
 *
 * ## Sidereal Time
 * EpochUTC provides Greenwich Mean Sidereal Time (GMST) calculations,
 * essential for converting between Earth-fixed and inertial reference frames:
 * ```typescript
 * const gmstRadians = epoch.gmstAngle();
 * const gmstDegrees = epoch.gmstAngleDegrees();
 * ```
 *
 * @see Epoch - Base class with common functionality
 * @see EpochTAI - For continuous timekeeping without leap seconds
 * @see EpochTT - For Earth-based astronomical observations
 * @see EpochTDB - For planetary ephemerides
 * @see EpochGPS - For GPS/GNSS applications
 */
declare class EpochUTC extends Epoch {
    static now(): EpochUTC;
    static fromDate({ year, month, day, hour, minute, second }: FromDateParams): EpochUTC;
    static fromDateTime(dt: Date): EpochUTC;
    static fromDateTimeString(dateTimeString: string): EpochUTC;
    static fromJ2000TTSeconds(seconds: Seconds): EpochUTC;
    static fromDefinitiveString(definitiveString: string): EpochUTC;
    roll(seconds: Seconds): EpochUTC;
    toMjd(): number;
    toMjdGsfc(): number;
    toTAI(): EpochTAI;
    toTT(): EpochTT;
    toTDB(): EpochTDB;
    toGPS(): EpochGPS;
    gmstAngle(): number;
    gmstAngleDegrees(): number;
    private static readonly gmstPoly_;
    private static readonly dayOfYearLookup_;
    private static isLeapYear_;
    private static dayOfYear_;
    private static dateToPosix_;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

interface ClassicalElementsParams {
    epoch: EpochUTC;
    semimajorAxis: Kilometers;
    eccentricity: number;
    inclination: Radians;
    rightAscension: Radians;
    argPerigee: Radians;
    trueAnomaly: Radians;
    mu?: number;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

interface EquinoctialElementsParams {
    epoch: EpochUTC;
    h: number;
    k: number;
    lambda: Radians;
    a: Kilometers;
    p: number;
    q: number;
    mu?: number;
    /** Retrograde factor. 1 for prograde orbits, -1 for retrograde orbits. */
    I?: 1 | -1;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Equinoctial elements are a set of orbital elements used to describe the
 * orbits of celestial bodies, such as satellites around a planet. They provide
 * an alternative to the traditional Keplerian elements and are especially
 * useful for avoiding singularities and numerical issues in certain types of
 * orbits.
 *
 * Unlike Keplerian elements, equinoctial elements don't suffer from
 * singularities at zero eccentricity (circular orbits) or zero inclination
 * (equatorial orbits). This makes them more reliable for numerical simulations
 * and analytical studies, especially in these edge cases.
 * @see https://faculty.nps.edu/dad/orbital/th0.pdf
 */
declare class EquinoctialElements {
    epoch: EpochUTC;
    /** The semi-major axis of the orbit in kilometers. */
    a: Kilometers;
    /** The h component of the eccentricity vector. */
    h: number;
    /** The k component of the eccentricity vector. */
    k: number;
    /** The p component of the ascending node vector. */
    p: number;
    /** The q component of the ascending node vector. */
    q: number;
    /** The mean longitude of the orbit in radians. */
    lambda: Radians;
    /** The gravitational parameter of the central body in km³/s². */
    mu: number;
    /** The retrograde factor. 1 for prograde orbits, -1 for retrograde orbits. */
    I: 1 | -1;
    constructor({ epoch, h, k, lambda, a, p, q, mu, I }: EquinoctialElementsParams);
    /**
     * Returns a string representation of the EquinoctialElements object.
     * @returns A string representation of the EquinoctialElements object.
     */
    toString(): string;
    /**
     * Gets the semimajor axis.
     * @returns The semimajor axis in kilometers.
     */
    get semimajorAxis(): Kilometers;
    /**
     * Gets the mean longitude.
     * @returns The mean longitude in radians.
     */
    get meanLongitude(): Radians;
    /**
     * Calculates the mean motion of the celestial object.
     * @returns The mean motion in units of radians per second.
     */
    get meanMotion(): number;
    /**
     * Gets the retrograde factor.
     * @returns The retrograde factor.
     */
    get retrogradeFactor(): number;
    /**
     * Checks if the orbit is prograde.
     * @returns True if the orbit is prograde, false otherwise.
     */
    isPrograde(): boolean;
    /**
     * Checks if the orbit is retrograde.
     * @returns True if the orbit is retrograde, false otherwise.
     */
    isRetrograde(): boolean;
    /**
     * Gets the period of the orbit.
     * @returns The period in minutes.
     */
    get period(): Minutes;
    /**
     * Gets the number of revolutions per day.
     * @returns The number of revolutions per day.
     */
    get revsPerDay(): number;
    /**
     * Converts the equinoctial elements to classical elements.
     * @returns The classical elements.
     */
    toClassicalElements(): ClassicalElements;
    /**
     * Converts the equinoctial elements to position and velocity.
     * @returns The position and velocity in classical elements.
     */
    toPositionVelocity(): PositionVelocity;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * The ClassicalElements class represents the classical orbital elements of an object.
 * @example
 * ```ts
 * const epoch = EpochUTC.fromDateTime(new Date('2024-01-14T14:39:39.914Z'));
 * const elements = new ClassicalElements({
 *  epoch,
 *  semimajorAxis: 6943.547853722985 as Kilometers,
 *  eccentricity: 0.0011235968124658146,
 *  inclination: 0.7509087232045765 as Radians,
 *  rightAscension: 0.028239555738616327 as Radians,
 *  argPerigee: 2.5386411901807353 as Radians,
 *  trueAnomaly: 0.5931399364974058 as Radians,
 * });
 * ```
 */
declare class ClassicalElements {
    epoch: EpochUTC;
    semimajorAxis: Kilometers;
    eccentricity: number;
    inclination: Radians;
    rightAscension: Radians;
    argPerigee: Radians;
    trueAnomaly: Radians;
    /** Gravitational parameter in km³/s².  */
    mu: number;
    constructor({ epoch, semimajorAxis, eccentricity, inclination, rightAscension, argPerigee, trueAnomaly, mu, }: ClassicalElementsParams);
    /**
     * Creates a new instance of ClassicalElements from a StateVector.
     * @param state The StateVector to convert.
     * @param mu The gravitational parameter of the central body. Default value is Earth's gravitational parameter.
     * @returns A new instance of ClassicalElements.
     * @throws Error if the StateVector is not in an inertial frame.
     */
    static fromStateVector(state: StateVector, mu?: number): ClassicalElements;
    /**
     * Gets the inclination in degrees.
     * @returns The inclination in degrees.
     */
    get inclinationDegrees(): Degrees;
    /**
     * Gets the right ascension in degrees.
     * @returns The right ascension in degrees.
     */
    get rightAscensionDegrees(): Degrees;
    /**
     * Gets the argument of perigee in degrees.
     * @returns The argument of perigee in degrees.
     */
    get argPerigeeDegrees(): Degrees;
    /**
     * Gets the true anomaly in degrees.
     * @returns The true anomaly in degrees.
     */
    get trueAnomalyDegrees(): Degrees;
    /**
     * Gets the apogee of the classical elements. It is measured from the surface of the earth.
     * @returns The apogee in kilometers.
     */
    get apogee(): Kilometers;
    /**
     * Gets the perigee of the classical elements. The perigee is the point in an
     * orbit that is closest to the surface of the earth.
     * @returns The perigee distance in kilometers.
     */
    get perigee(): number;
    toString(): string;
    /**
     * Calculates the mean motion of the celestial object.
     * @returns The mean motion in radians.
     */
    get meanMotion(): Radians;
    /**
     * Calculates the period of the orbit.
     * @returns The period in seconds.
     */
    get period(): Minutes;
    /**
     * Compute the number of revolutions completed per day for this orbit.
     * @returns The number of revolutions per day.
     */
    get revsPerDay(): number;
    /**
     * Returns the orbit regime based on the classical elements.
     * @returns The orbit regime.
     */
    getOrbitRegime(): OrbitRegime;
    /**
     * Converts the classical orbital elements to position and velocity vectors.
     * @returns An object containing the position and velocity vectors.
     */
    toPositionVelocity(): PositionVelocity;
    /**
     * Converts the classical elements to J2000 state vector.
     * @return The J2000 state vector.
     */
    toJ2000(): J2000;
    /**
     * Converts the classical elements to equinoctial elements.
     * @returns The equinoctial elements.
     */
    toEquinoctialElements(): EquinoctialElements;
    /**
     * Propagates the classical elements to a given epoch.
     * @param propEpoch - The epoch to propagate the classical elements to.
     * @returns The classical elements at the propagated epoch.
     */
    propagate(propEpoch: EpochUTC): ClassicalElements;
    /**
     * Calculates the J2 nodal precession rate (RAAN drift rate).
     *
     * The nodal precession is caused by Earth's oblateness (J2 perturbation) and
     * causes the right ascension of the ascending node to drift over time.
     *
     * @returns Precession rate in radians per second.
     *
     * @example
     * ```ts
     * const elements = ClassicalElements.fromStateVector(state);
     * const raanDriftPerDay = elements.nodalPrecessionRate * 86400; // rad/day
     * const raanDriftDegreesPerDay = raanDriftPerDay * RAD2DEG; // deg/day
     * ```
     */
    get nodalPrecessionRate(): number;
    /**
     * Returns the RAAN normalized for J2 precession since the epoch.
     *
     * This accounts for the secular drift of the right ascension due to
     * Earth's oblateness, allowing comparison of RAAN values across different epochs.
     *
     * @param targetEpoch - The epoch to normalize the RAAN to.
     * @returns The normalized RAAN in radians, wrapped to [0, 2π).
     *
     * @example
     * ```ts
     * const elements = ClassicalElements.fromStateVector(state);
     * const futureEpoch = elements.epoch.roll(86400); // 1 day later
     * const normalizedRaan = elements.normalizedRaan(futureEpoch);
     * ```
     */
    normalizedRaan(targetEpoch: EpochUTC): Radians;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * A Vector is a mathematical object that has both magnitude and direction.
 */
declare class Vector<T extends number = number> {
    elements: T[] | Float64Array;
    /**
     * The length of the vector.
     */
    readonly length: number;
    /**
     * Represents a 3-dimensional vector.
     */
    static readonly origin3: Vector<0>;
    /**
     * Represents a vector with all elements set to zero.
     */
    static readonly origin6: Vector<0>;
    /**
     * Represents the x-axis vector.
     */
    static readonly xAxis: Vector<0 | 1>;
    /**
     * Represents the y-axis vector.
     */
    static readonly yAxis: Vector<0 | 1>;
    /**
     * Represents the z-axis vector.
     */
    static readonly zAxis: Vector<0 | 1>;
    /**
     * Represents a vector pointing along the negative x-axis.
     */
    static readonly xAxisNeg: Vector<0 | -1>;
    /**
     * Represents a vector pointing along the negative y-axis.
     */
    static readonly yAxisNeg: Vector<0 | -1>;
    /**
     * Represents a vector pointing along the negative z-axis.
     */
    static readonly zAxisNeg: Vector<0 | -1>;
    constructor(elements: T[] | Float64Array);
    /**
     * Creates a zero vector of the specified length.
     * @param length The length of the vector.
     * @returns A new Vector object representing the zero vector.
     */
    static zero(length: number): Vector;
    /**
     * Creates a new Vector with the specified length, filled with the specified
     * value.
     * @param length The length of the new Vector.
     * @param value The value to fill the Vector with.
     * @returns A new Vector filled with the specified value.
     */
    static filled(length: number, value: number): Vector;
    /**
     * Creates a new Vector instance from an array of elements.
     * @param elements - The array of elements to create the Vector from.
     * @returns A new Vector instance.
     */
    static fromList(elements: number[]): Vector;
    /**
     * Returns a string representation of the vector.
     * @param fixed - The number of digits to appear after the decimal point.
     * Defaults to -1.
     * @returns A string representation of the vector.
     */
    toString(fixed?: number): string;
    /**
     * Returns a string representation of the x value of the vector.
     * @returns A string representation of the x value of the vector.
     */
    get x(): number;
    /**
     * Returns a string representation of the y value of the vector.
     * @returns A string representation of the y value of the vector.
     */
    get y(): number;
    /**
     * Returns a string representation of the z value of the vector.
     * @returns A string representation of the z value of the vector.
     */
    get z(): number;
    /**
     * Converts the vector elements to an array.
     * @returns An array containing the vector elements.
     */
    toList(): number[];
    /**
     * Converts the vector to a Float64Array.
     * @returns The vector as a Float64Array.
     */
    toArray(): Float64Array;
    /**
     * Calculates the magnitude of the vector.
     * @returns The magnitude of the vector.
     */
    magnitude(): number;
    /**
     * Adds the elements of another vector to this vector and returns a new
     * vector.
     * @param v - The vector to add.
     * @returns A new vector containing the sum of the elements.
     */
    add(v: Vector): Vector;
    /**
     * Subtracts a vector from the current vector.
     * @param v The vector to subtract.
     * @returns A new vector representing the result of the subtraction.
     */
    subtract(v: Vector): Vector;
    /**
     * Scales the vector by a given factor.
     * @param n The scaling factor.
     * @returns A new Vector object representing the scaled vector.
     */
    scale(n: number): Vector;
    /**
     * Negates the vector by scaling it by -1.
     * @returns A new Vector object representing the negated vector.
     */
    negate(): Vector;
    /**
     * Return the Euclidean distance between this and another Vector.
     * @param v The vector to calculate the distance to.
     * @returns The distance between the two vectors.
     */
    distance(v: Vector): number;
    /**
     * Normalizes the vector, making it a unit vector with the same direction but
     * a magnitude of 1. If the vector has a magnitude of 0, it returns a zero
     * vector of the same length.
     * @returns The normalized vector.
     */
    normalize(): Vector;
    /**
     * Calculates the dot product of this vector and another vector.
     * @param v - The vector to calculate the dot product with.
     * @returns The dot product of the two vectors.
     */
    dot(v: Vector): number;
    /**
     * Calculates the outer product of this vector with another vector.
     * @param v The vector to calculate the outer product with.
     * @returns A matrix representing the outer product of the two vectors.
     */
    outer(v: Vector): Matrix;
    /**
     * Calculates the cross product of this vector and the given vector.
     * @param v - The vector to calculate the cross product with.
     * @returns The resulting vector.
     */
    cross(v: Vector): Vector;
    /**
     * Calculate the skew-symmetric matrix for this [Vector].
     * @returns The skew-symmetric matrix.
     * @throws [Error] if the vector is not of length 3.
     */
    skewSymmetric(): Matrix;
    /**
     * Rotates the vector around the X-axis by the specified angle.
     * @param theta The angle in radians.
     * @returns The rotated vector.
     */
    rotX(theta: Radians): Vector;
    /**
     * Rotates the vector around the Y-axis by the specified angle.
     * @param theta The angle of rotation in radians.
     * @returns A new Vector representing the rotated vector.
     */
    rotY(theta: Radians): Vector;
    /**
     * Rotates the vector around the Z-axis by the specified angle.
     * @param theta The angle of rotation in radians.
     * @returns A new Vector representing the rotated vector.
     */
    rotZ(theta: Radians): Vector;
    /**
     * Calculates the angle between this vector and another vector.
     * @param v The other vector.
     * @returns The angle between the two vectors in radians.
     */
    angle(v: Vector): Radians;
    /**
     * Calculates the angle between this vector and another vector in degrees.
     * @param v The other vector.
     * @returns The angle between the two vectors in degrees.
     */
    angleDegrees(v: Vector): Degrees;
    /**
     * Determines if there is line of sight between this vector and another vector
     * within a given radius.
     * @param v - The vector to check line of sight with.
     * @param radius - The radius within which line of sight is considered.
     * @returns True if there is line of sight, false otherwise.
     */
    sight(v: Vector, radius: number): boolean;
    /**
     * Returns the bisect vector between this vector and the given vector. The
     * bisect vector is calculated by scaling this vector's magnitude by the
     * magnitude of the given vector, adding the result to the product of scaling
     * the given vector's magnitude by this vector's magnitude, and then
     * normalizing the resulting vector.
     * @param v - The vector to calculate the bisect with.
     * @returns The bisect vector.
     */
    bisect(v: Vector): Vector;
    /**
     * Joins the current vector with another vector.
     * @param v The vector to join with.
     * @returns A new vector that contains the elements of both vectors.
     */
    join(v: Vector): Vector;
    /**
     * Returns a new Vector containing a portion of the elements from the
     * specified start index to the specified end index
     * @param start The start index of the slice (inclusive).
     * @param end The end index of the slice (exclusive).
     * @returns A new Vector containing the sliced elements.
     */
    slice(start: number, end: number): Vector;
    /**
     * Returns a new Matrix object representing the row vector.
     * @returns The row vector as a Matrix object.
     */
    row(): Matrix;
    /**
     * Returns a new Matrix object representing the column vector of this Vector.
     * @returns The column vector as a Matrix object.
     */
    column(): Matrix;
    /**
     * Converts the elements at the specified index to a Vector3D object.
     * @param index - The index of the elements to convert.
     * @returns A new Vector3D object containing the converted elements.
     */
    toVector3D(index: number): Vector3D;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * A matrix is a rectangular array of numbers or other mathematical objects for
 * which operations such as addition and multiplication are defined.
 */
declare class Matrix {
    elements: number[][];
    readonly rows: number;
    readonly columns: number;
    constructor(elements: number[][]);
    /**
     * Creates a matrix with all elements set to zero.
     * @param rows - The number of rows in the matrix.
     * @param columns - The number of columns in the matrix.
     * @returns A matrix with all elements set to zero.
     */
    static allZeros(rows: number, columns: number): Matrix;
    /**
     * Creates a new Matrix with the specified number of rows and columns, filled
     * with the specified value.
     * @param rows The number of rows in the matrix.
     * @param columns The number of columns in the matrix.
     * @param value The value to fill the matrix with. Default is 0.0.
     * @returns A new Matrix filled with the specified value.
     */
    static fill(rows: number, columns: number, value?: number): Matrix;
    /**
     * Creates a rotation matrix around the X-axis.
     * @param theta - The angle of rotation in radians.
     * @returns The rotation matrix.
     */
    static rotX(theta: Radians): Matrix;
    /**
     * Creates a rotation matrix around the y-axis.
     * @param theta - The angle of rotation in radians.
     * @returns The rotation matrix.
     */
    static rotY(theta: Radians): Matrix;
    /**
     * Creates a rotation matrix around the Z-axis.
     * @param theta The angle of rotation in radians.
     * @returns The rotation matrix.
     */
    static rotZ(theta: Radians): Matrix;
    /**
     * Creates a zero matrix with the specified number of rows and columns.
     * @param rows The number of rows in the matrix.
     * @param columns The number of columns in the matrix.
     * @returns A new Matrix object representing the zero matrix.
     */
    static zero(rows: number, columns: number): Matrix;
    /**
     * Creates an identity matrix of the specified dimension.
     * @param dimension The dimension of the identity matrix.
     * @returns The identity matrix.
     */
    static identity(dimension: number): Matrix;
    /**
     * Creates a diagonal matrix with the given diagonal elements.
     * @param d - An array of diagonal elements.
     * @returns A new Matrix object representing the diagonal matrix.
     */
    static diagonal(d: number[]): Matrix;
    /**
     * Adds the elements of another matrix to this matrix and returns the result.
     * @param m - The matrix to be added.
     * @returns The resulting matrix after addition.
     */
    add(m: Matrix): Matrix;
    /**
     * Subtracts the elements of another matrix from this matrix.
     * @param m - The matrix to subtract.
     * @returns A new matrix containing the result of the subtraction.
     */
    subtract(m: Matrix): Matrix;
    /**
     * Scales the matrix by multiplying each element by a scalar value.
     * @param n - The scalar value to multiply each element by.
     * @returns A new Matrix object representing the scaled matrix.
     */
    scale(n: number): Matrix;
    /**
     * Negates the matrix by scaling it by -1.
     * @returns The negated matrix.
     */
    negate(): Matrix;
    /**
     * Multiplies this matrix with another matrix.
     * @param m The matrix to multiply with.
     * @returns The resulting matrix.
     */
    multiply(m: Matrix): Matrix;
    /**
     * Computes the outer product of this matrix with another matrix.
     * @param m - The matrix to compute the outer product with.
     * @returns The resulting matrix.
     */
    outerProduct(m: Matrix): Matrix;
    /**
     * Multiplies the matrix by a vector.
     * @param v The vector to multiply by.
     * @returns A new vector representing the result of the multiplication.
     */
    multiplyVector(v: Vector): Vector;
    /**
     * Multiplies a 3D vector by the matrix.
     * @template T - The type of the vector elements.
     * @param v - The 3D vector to multiply.
     * @returns The resulting 3D vector after multiplication.
     */
    multiplyVector3D<T extends number>(v: Vector3D<T>): Vector3D<T>;
    /**
     * Returns a new Matrix object where each element is the reciprocal of the
     * corresponding element in the current matrix. If an element in the current
     * matrix is zero, the corresponding element in the output matrix will also be
     * zero.
     * @returns A new Matrix object representing the reciprocal of the current
     * matrix.
     */
    reciprocal(): Matrix;
    /**
     * Transposes the matrix by swapping rows with columns.
     * @returns A new Matrix object representing the transposed matrix.
     */
    transpose(): Matrix;
    /**
     * Performs the Cholesky decomposition on the matrix.
     * @returns A new Matrix object representing the Cholesky decomposition of the
     * original matrix.
     */
    cholesky(): Matrix;
    /**
     * Swaps two rows in the matrix.
     * @param i - The index of the first row.
     * @param j - The index of the second row.
     */
    private _swapRows;
    /**
     * Converts the matrix to reduced row echelon form using the Gaussian
     * elimination method. This method modifies the matrix in-place.
     */
    private toReducedRowEchelonForm_;
    /**
     * Calculates the inverse of the matrix.
     * @returns The inverse of the matrix.
     */
    inverse(): Matrix;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class Vector3D<T extends number = number> {
    x: T;
    y: T;
    z: T;
    constructor(x: T, y: T, z: T);
    /**
     * Create a new Vector3D object from the first three elements of a Vector
     * object.
     * @param v The Vector object to convert.
     * @returns A new Vector3D object.
     */
    static fromVector<U extends number>(v: Vector<U>): Vector3D<U>;
    static readonly origin: Vector3D<number>;
    static readonly xAxis: Vector3D<number>;
    static readonly yAxis: Vector3D<number>;
    static readonly zAxis: Vector3D<number>;
    static readonly xAxisNeg: Vector3D<number>;
    static readonly yAxisNeg: Vector3D<number>;
    static readonly zAxisNeg: Vector3D<number>;
    toList(): T[];
    toArray(): Float64Array<ArrayBuffer>;
    toVector(): Vector<T>;
    toString(fixed?: number): string;
    magnitude(): T;
    add(v: Vector3D<T>): Vector3D<T>;
    subtract(v: Vector3D<T>): Vector3D<T>;
    scale<U extends number>(n: U): Vector3D<U>;
    negate(): Vector3D<T>;
    /**
     * Return the Euclidean distance between this and another Vector3D.
     * @param v The other Vector3D.
     * @returns The distance between this and the other Vector3D.
     */
    distance(v: Vector3D<T>): T;
    /**
     * Convert this to a unit Vector3D.
     * @returns A unit Vector3D.
     */
    normalize(): Vector3D<T>;
    dot<T extends number>(v: Vector3D<T>): T;
    outer(v: Vector3D): Matrix;
    cross<U extends number>(v: Vector3D<U>): Vector3D<U>;
    skewSymmetric(): Matrix;
    rotX(theta: number): Vector3D;
    rotY(theta: Radians): Vector3D<T>;
    rotZ(theta: Radians): Vector3D<T>;
    angle<U extends number>(v: Vector3D<U>): Radians;
    angleDegrees(v: Vector3D<T>): number;
    sight(v: Vector3D<KilometersPerSecond>, radius: Kilometers): boolean;
    bisect(v: Vector3D<T>): Vector3D<T>;
    row(): Matrix;
    column(): Matrix;
    join(v: Vector3D): Vector;
    static readonly zero: Vector3D<number>;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * A state vector is a set of coordinates used to specify the position and
 * velocity of an object in a particular reference frame.
 */
declare abstract class StateVector {
    epoch: EpochUTC;
    position: Vector3D<Kilometers>;
    velocity: Vector3D<KilometersPerSecond>;
    constructor(epoch: EpochUTC, position: Vector3D<Kilometers>, velocity: Vector3D<KilometersPerSecond>);
    /**
     * The name of the reference frame in which the state vector is defined.
     * @returns The name of the reference frame.
     */
    abstract get name(): string;
    /**
     * Whether the state vector is defined in an inertial reference frame.
     * @returns True if the state vector is defined in an inertial reference
     */
    abstract get inertial(): boolean;
    /**
     * Returns a string representation of the StateVector object. The string includes the name, epoch, position, and
     * velocity.
     * @returns A string representation of the StateVector object.
     */
    toString(): string;
    /**
     * Calculates the mechanical energy of the state vector.
     * @returns The mechanical energy value.
     */
    get mechanicalEnergy(): number;
    /**
     * Calculates the semimajor axis of the state vector.
     * @returns The semimajor axis in kilometers.
     */
    get semimajorAxis(): Kilometers;
    /**
     * Gets the period of the state vector in minutes.
     * @returns The period in minutes.
     */
    get period(): Minutes;
    /**
     * Gets the angular rate of the state vector.
     * @returns The angular rate.
     */
    get angularRate(): number;
    /**
     * Converts the state vector to classical elements.
     * @param mu The gravitational parameter of the celestial body. Defaults to Earth's gravitational parameter.
     * @returns The classical elements corresponding to the state vector.
     * @throws Error if classical elements are undefined for fixed frames.
     */
    toClassicalElements(mu?: number): ClassicalElements;
}
/**
 * Represents a position and velocity in the J2000 coordinate system. This is an Earth-centered inertial (ECI)
 * coordinate system.
 *
 * Commonly used ECI frame is defined with the Earth's Mean Equator and Mean Equinox (MEME) at 12:00 Terrestrial Time on
 * 1 January 2000. It can be referred to as J2K, J2000 or EME2000. The x-axis is aligned with the mean vernal equinox.
 * The z-axis is aligned with the Earth's rotation axis (or equivalently, the celestial North Pole) as it was at that
 * time. The y-axis is rotated by 90° East about the celestial equator.
 * @see https://en.wikipedia.org/wiki/Earth-centered_inertial
 */
declare class J2000 extends StateVector {
    /**
     * Creates a J2000 coordinate from classical elements.
     * @param elements The classical elements.
     * @returns The J2000 coordinate.
     */
    static fromClassicalElements(elements: ClassicalElements): J2000;
    /**
     * Gets the name of the coordinate system.
     * @returns The name of the coordinate system.
     */
    get name(): string;
    /**
     * Gets a value indicating whether the coordinate system is inertial.
     * @returns A boolean value indicating whether the coordinate system is inertial.
     */
    get inertial(): boolean;
    /**
     * Converts the coordinates from J2000 to the International Terrestrial Reference Frame (ITRF).
     * This is an ECI to ECEF transformation.
     * @returns The ITRF coordinates.
     */
    toITRF(): ITRF;
    /**
     * Converts the J2000 coordinate to the TEME coordinate.
     * @returns The TEME coordinate.
     */
    toTEME(): TEME;
}
/**
 * The International Terrestrial Reference Frame (ITRF) is a geocentric reference frame for the Earth. It is the
 * successor to the International Terrestrial Reference System (ITRS). The ITRF definition is maintained by the
 * International Earth Rotation and Reference Systems Service (IERS). Several versions of ITRF exist, each with a
 * different epoch, to address the issue of crustal motion. The latest version is ITRF2014, based on data collected from
 * 1980 to 2014.
 * @see https://en.wikipedia.org/wiki/International_Terrestrial_Reference_Frame
 *
 * This is a geocentric coordinate system, also referenced as ECF/ECEF (Earth Centered Earth Fixed). It is a Cartesian
 * coordinate system with the origin at the center of the Earth. The x-axis intersects the sphere of the Earth at 0°
 * latitude (the equator) and 0° longitude (the Prime Meridian). The z-axis goes through the North Pole. The y-axis goes
 * through 90° East longitude.
 * @see https://en.wikipedia.org/wiki/Earth-centered,_Earth-fixed_coordinate_system
 */
declare class ITRF extends StateVector {
    /**
     * Gets the name of the ITRF coordinate system.
     * @returns The name of the coordinate system.
     */
    get name(): string;
    /**
     * Gets a value indicating whether the coordinate system is inertial.
     * @returns A boolean value indicating whether the coordinate system is inertial.
     */
    get inertial(): boolean;
    /**
     * Gets the height of the ITRF coordinate above the surface of the Earth in kilometers.
     * @returns The height in kilometers.
     */
    get height(): Kilometers;
    /**
     * Gets the altitude in kilometers.
     * @returns The altitude in kilometers.
     */
    get alt(): Kilometers;
    /**
     * Converts the current coordinate to the J2000 coordinate system. This is an Earth-Centered Inertial (ECI) coordinate
     * system with the origin at the center of the Earth.
     * @see https://en.wikipedia.org/wiki/Epoch_(astronomy)#Julian_years_and_J2000
     * @returns The coordinate in the J2000 coordinate system.
     */
    toJ2000(): J2000;
    /**
     * Converts the current ITRF coordinate to Geodetic coordinate. This is a coordinate system for latitude, longitude,
     * and altitude.
     * @returns The converted Geodetic coordinate.
     */
    toGeodetic(): Geodetic;
}
/**
 * True Equator Mean Equinox (TEME) is a coordinate system commonly used in satellite tracking and orbit prediction. It
 * is a reference frame that defines the position and orientation of an object relative to the Earth's equator and
 * equinox.
 *
 * By using the True Equator Mean Equinox (TEME) coordinate system, we can accurately describe the position and motion
 * of satellites relative to the Earth's equator and equinox. This is particularly useful for tracking and predicting
 * satellite orbits in various applications, such as satellite communication, navigation, and remote sensing.
 */
declare class TEME extends StateVector {
    /**
     * Gets the name of the coordinate system.
     * @returns The name of the coordinate system.
     */
    get name(): string;
    /**
     * Gets a value indicating whether the coordinate is inertial.
     * @returns A boolean value indicating whether the coordinate is inertial.
     */
    get inertial(): boolean;
    /**
     * Creates a TEME (True Equator Mean Equinox) object from classical orbital elements.
     * @param elements - The classical orbital elements.
     * @returns A new TEME object.
     */
    static fromClassicalElements(elements: ClassicalElements): TEME;
    /**
     * Converts the TEME (True Equator Mean Equinox) coordinates to J2000 coordinates.
     * @returns The J2000 coordinates.
     */
    toJ2000(): J2000;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

interface BaseObjectParams {
    id?: number;
    name?: string;
    type?: SpaceObjectType;
    active?: boolean;
    metadata?: Record<string, unknown>;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * Configuration options for history tracking.
 */
interface HistoryConfig {
    /** Maximum number of entries to store. Undefined means unlimited. */
    maxLength?: number;
    /** Minimum time between samples in milliseconds. */
    samplingInterval?: number;
    /** If true, automatically removes oldest entries when maxLength is reached. */
    autoClean?: boolean;
}
/**
 * A single entry in the history.
 */
interface HistoryEntry<T> {
    time: Date;
    data: T;
}
/**
 * Generic history tracking class for storing time-stamped data.
 * Used to track object state over time for visualization and analysis.
 */
declare class History<T> {
    private entries_;
    private config_;
    private lastSampleTime_;
    constructor(config?: HistoryConfig);
    /**
     * Adds a new entry to the history.
     * Respects sampling interval and max length constraints.
     * @param time - The timestamp for this entry
     * @param data - The data to store
     */
    add(time: Date, data: T): void;
    /**
     * Returns all history entries.
     */
    getAll(): HistoryEntry<T>[];
    /**
     * Returns entries within a time range (inclusive).
     * @param start - Start of the time range
     * @param end - End of the time range
     */
    getRange(start: Date, end: Date): HistoryEntry<T>[];
    /**
     * Returns the last n entries.
     * @param n - Number of entries to return
     */
    getLast(n: number): HistoryEntry<T>[];
    /**
     * Returns the first entry, or undefined if empty.
     */
    getFirst(): HistoryEntry<T> | undefined;
    /**
     * Returns the most recent entry, or undefined if empty.
     */
    getLatest(): HistoryEntry<T> | undefined;
    /**
     * Clears all history entries.
     */
    clear(): void;
    /**
     * Creates a deep copy of this history.
     * @returns A new History instance with cloned entries
     */
    clone(): History<T>;
    /**
     * Returns the number of entries in the history.
     */
    get length(): number;
    /**
     * Returns the current configuration.
     */
    get config(): HistoryConfig;
    /**
     * Returns true if the history is empty.
     */
    get isEmpty(): boolean;
    /**
     * Returns the time span covered by the history in milliseconds.
     * Returns 0 if there are fewer than 2 entries.
     */
    get timeSpan(): number;
    toString(): string;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * State data that can be recorded in history.
 */
interface HistoricalState {
    position: TemeVec3;
    velocity: TemeVec3<KilometersPerSecond>;
}
/**
 * Serialized representation of a BaseObject.
 * Used for persistence and data transfer.
 */
interface SerializedObject {
    /** The class name of the object */
    type: string;
    /** Unique identifier */
    id: number;
    /** Human-readable name */
    name: string;
    /** Additional type-specific data */
    [key: string]: unknown;
}
/**
 * Placeholder interface for sensors (will be defined in Phase 2).
 * This allows SpaceObject and GroundObject to reference sensors
 * without creating circular dependencies.
 */
interface SensorInterface {
    id: number;
    name: string;
}
/**
 * Placeholder interface for communication devices (will be defined in Phase 3).
 * This allows SpaceObject and GroundObject to reference comm devices
 * without creating circular dependencies.
 */
interface CommunicationDeviceInterface {
    id: number;
    name: string;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Abstract base class for all objects in the ootk system.
 * Provides common functionality for identification, type checking,
 * history tracking, and serialization.
 */
declare abstract class BaseObject {
    /** Unique identifier for the object */
    id: number;
    /** Human-readable name */
    name: string;
    /** Type classification of the object */
    type: SpaceObjectType;
    /** Whether the object is currently active */
    active: boolean;
    /** Additional metadata for the object */
    metadata?: Record<string, unknown>;
    /** History tracking (null until enabled) */
    private history_;
    constructor(info: BaseObjectParams);
    /**
     * Enables history tracking for this object.
     * @param config - Optional configuration for history behavior
     */
    enableHistory(config?: HistoryConfig): void;
    /**
     * Disables history tracking and clears existing history.
     */
    disableHistory(): void;
    /**
     * Returns the history object if enabled, null otherwise.
     */
    get history(): History<HistoricalState> | null;
    /**
     * Returns true if history tracking is enabled.
     */
    get isHistoryEnabled(): boolean;
    /**
     * Records a state to history if history tracking is enabled.
     * @param time - The timestamp for this state
     * @param state - The state to record
     */
    protected recordToHistory(time: Date, state: HistoricalState): void;
    /**
     * Serializes the object to a plain object for persistence.
     */
    serialize(): SerializedObject;
    /**
     * Returns type-specific serialization data.
     * Subclasses must implement this to add their specific properties.
     */
    protected abstract serializeSpecific(): Record<string, unknown>;
    /**
     * Checks if the object is a satellite.
     * @returns True if the object is a satellite, false otherwise.
     */
    isSatellite(): boolean;
    /**
     * Checks if the object is a ground object.
     * @returns True if the object is a ground object, false otherwise.
     */
    isGroundObject(): boolean;
    /**
     * Returns whether the object is a sensor.
     * @returns True if the object is a sensor, false otherwise.
     */
    isSensor(): boolean;
    /**
     * Checks if the object is a marker.
     * @returns True if the object is a marker, false otherwise.
     */
    isMarker(): boolean;
    /**
     * Returns whether the object's position is static.
     * @returns True if the object is static, false otherwise.
     */
    isStatic(): boolean;
    isPayload(): boolean;
    isRocketBody(): boolean;
    isDebris(): boolean;
    isStar(): boolean;
    isMissile(): boolean;
    isNotional(): boolean;
    getTypeString(): string;
    /**
     * Validates a parameter value against a minimum and maximum value.
     * @param value - The value to be validated.
     * @param minValue - The minimum allowed value.
     * @param maxValue - The maximum allowed value.
     * @param errorMessage - The error message to be thrown if the value is invalid.
     */
    validateParameter<T>(value: T, minValue: T | null, maxValue: T | null, errorMessage: string): void;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing a GroundObject.
 */
interface GroundObjectParams extends BaseObjectParams {
    lat: Degrees;
    lon: Degrees;
    alt: Kilometers;
}
/**
 * Abstract base class for all objects on Earth's surface.
 * Provides coordinate conversion methods and component attachment capabilities.
 */
declare abstract class GroundObject extends BaseObject {
    name: string;
    readonly lat: Degrees;
    readonly lon: Degrees;
    readonly alt: Kilometers;
    /** Sensors attached to this ground object */
    sensors: SensorInterface[];
    /** Communication devices attached to this ground object */
    commDevices: CommunicationDeviceInterface[];
    constructor(info: GroundObjectParams);
    /**
     * Calculates the relative azimuth, elevation, and range between this GroundObject and a Satellite.
     * @param satellite The Satellite object.
     * @param date The date for which to calculate the RAE values. Defaults to the current date.
     * @returns The relative azimuth, elevation, and range values in kilometers and degrees.
     */
    rae(satellite: Satellite, date?: Date): RaeVec3<Kilometers, Degrees> | null;
    /**
     * Calculates ECEF position at a given time.
     * @variation optimized version of this.toGeodetic().toITRF().position;
     * @returns The ECEF position vector of the ground object.
     */
    ecef(): EcefVec3<Kilometers>;
    /**
     * Calculates the Earth-Centered Inertial (ECI) position vector of the ground object at a given date.
     * @variation optimized version of this.toGeodetic().toITRF().toJ2000().position;
     * @param date The date for which to calculate the ECI position vector. Defaults to the current date.
     * @returns The ECI position vector of the ground object.
     */
    eci(date?: Date): TemeVec3<Kilometers>;
    /**
     * Returns the latitude, longitude, and altitude of the GroundObject.
     * @returns The latitude, longitude, and altitude as an LlaVec3 object.
     */
    lla(): LlaVec3<Degrees, Kilometers>;
    /**
     * Converts the latitude, longitude, and altitude of the GroundObject to radians and kilometers.
     * @variation optimized version of this.toGeodetic() without class instantiation for better performance and
     * serialization.
     * @returns An object containing the latitude, longitude, and altitude in radians and kilometers.
     */
    llaRad(): LlaVec3<Radians, Kilometers>;
    get latRad(): Radians;
    get lonRad(): Radians;
    /**
     * Converts the ground position to geodetic coordinates.
     * @returns The geodetic coordinates.
     */
    toGeodetic(): Geodetic;
    /**
     * Converts the ground position to J2000 inertial coordinates.
     * Ground objects have zero velocity in the inertial frame (ignoring Earth rotation).
     * @param date - The date for the conversion (defaults to now)
     * @returns J2000 state vector
     */
    toJ2000(date?: Date): J2000;
    /**
     * Adds a sensor to this ground object.
     * @param sensor - The sensor to add
     */
    addSensor(sensor: SensorInterface): void;
    /**
     * Removes a sensor from this ground object.
     * @param sensorId - The ID of the sensor to remove
     */
    removeSensor(sensorId: number): void;
    /**
     * Adds a communication device to this ground object.
     * @param device - The device to add
     */
    addCommDevice(device: CommunicationDeviceInterface): void;
    /**
     * Removes a communication device from this ground object.
     * @param deviceId - The ID of the device to remove
     */
    removeCommDevice(deviceId: number): void;
    isGroundObject(): boolean;
    /**
     * Validates the input data for the GroundObject.
     * @param info - The GroundPositionParams object containing the latitude,
     * longitude, and altitude.
     */
    private validateGroundObjectInputData_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing a GroundStation.
 */
interface GroundStationParams extends GroundObjectParams {
}
/**
 * A concrete ground station that can host sensors and communication devices.
 * Use this class for fixed ground locations like tracking stations, observatories, etc.
 */
declare class GroundStation extends GroundObject {
    constructor(info: GroundStationParams);
    /**
     * Creates a GroundStation from a Geodetic position.
     * @param geodetic - The geodetic coordinates
     * @param name - Optional name for the station
     * @param id - Optional unique identifier
     */
    static fromGeodetic(geodetic: Geodetic, name?: string, id?: number): GroundStation;
    /**
     * Creates a deep copy of this ground station.
     */
    clone(): GroundStation;
    /**
     * Creates a new GroundStation at a different position.
     * The original instance remains unchanged.
     * @param lat - New latitude in degrees
     * @param lon - New longitude in degrees
     * @param alt - Optional new altitude in kilometers (defaults to current altitude)
     * @returns A new GroundStation at the specified position
     */
    moveTo(lat: Degrees, lon: Degrees, alt?: Kilometers): GroundStation;
    /**
     * Returns true since GroundStation is always a ground object.
     */
    isGroundObject(): boolean;
    /**
     * Returns type-specific serialization data.
     */
    protected serializeSpecific(): Record<string, unknown>;
    toString(): string;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * This Geodetic class represents a geodetic coordinate in three-dimensional
 * space, consisting of latitude, longitude, and altitude. It provides various
 * methods to perform calculations and operations related to geodetic
 * coordinates.
 *
 * This is a class for geodetic coordinates. This is related to the GroundObject
 * class, which is used to represent an object on the surface of the Earth.
 */
declare class Geodetic {
    readonly lat: Radians;
    readonly lon: Radians;
    readonly alt: Kilometers;
    constructor(latitude: Radians, longitude: Radians, altitude: Kilometers);
    /**
     * Creates a Geodetic object from latitude, longitude, and altitude values in
     * degrees.
     * @param latitude The latitude value in degrees.
     * @param longitude The longitude value in degrees.
     * @param altitude The altitude value in kilometers.
     * @returns A Geodetic object representing the specified latitude, longitude,
     * and altitude.
     */
    static fromDegrees(latitude: Degrees, longitude: Degrees, altitude: Kilometers): Geodetic;
    /**
     * Returns a string representation of the Geodetic object.
     * @returns A string containing the latitude, longitude, and altitude of the Geodetic object.
     */
    toString(): string;
    /**
     * Gets the latitude in degrees.
     * @returns The latitude in degrees.
     */
    get latDeg(): number;
    /**
     * Gets the longitude in degrees.
     * @returns The longitude in degrees.
     */
    get lonDeg(): number;
    /**
     * Converts the geodetic coordinates to a ground station.
     * @returns The ground station object.
     */
    toGroundStation(): GroundStation;
    /**
     * Converts the geodetic coordinates to the International Terrestrial
     * Reference Frame (ITRF) coordinates.
     * @param epoch The epoch in UTC.
     * @returns The ITRF coordinates.
     */
    toITRF(epoch: EpochUTC): ITRF;
    /**
     * Calculates the angle between two geodetic coordinates.
     * @param g The geodetic coordinate to calculate the angle to.
     * @param method The method to use for calculating the angular distance (optional, default is Haversine).
     * @returns The angle between the two geodetic coordinates in radians.
     */
    angle(g: Geodetic, method?: AngularDistanceMethod): Radians;
    /**
     * Calculates the angle in degrees between two Geodetic coordinates.
     * @param g The Geodetic coordinate to calculate the angle with.
     * @param method The method to use for calculating the angular distance (optional, default is Haversine).
     * @returns The angle in degrees.
     */
    angleDeg(g: Geodetic, method?: AngularDistanceMethod): Degrees;
    /**
     * Calculates the distance between two geodetic coordinates.
     * @param g The geodetic coordinates to calculate the distance to.
     * @param method The method to use for calculating the angular distance. Default is Haversine.
     * @returns The distance between the two geodetic coordinates in kilometers.
     */
    distance(g: Geodetic, method?: AngularDistanceMethod): Kilometers;
    /**
     * Calculates the field of view based on the altitude of the Geodetic object.
     * @returns The field of view in radians.
     */
    fieldOfView(): Radians;
    /**
     * Determines if the current geodetic coordinate can see another geodetic coordinate.
     * @param g The geodetic coordinate to check for visibility.
     * @param method The method to use for calculating the angular distance (optional, default is Haversine).
     * @returns A boolean indicating if the current coordinate can see the other coordinate.
     */
    isInView(g: Geodetic, method?: AngularDistanceMethod): boolean;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * A class containing static methods for formatting TLEs (Two-Line Elements).
 */
declare abstract class FormatTle {
    private constructor();
    /**
     * Creates a TLE (Two-Line Element) string based on the provided TleParams.
     * @param tleParams - The parameters used to generate the TLE.
     * @returns An object containing the TLE strings tle1 and tle2.
     */
    static createTle(tleParams: TleParams): {
        tle1: TleLine1;
        tle2: TleLine2;
    };
    /**
     * Converts the argument of perigee to a stringified number.
     * @param argPe - The argument of perigee to be converted. Can be either a number or a string.
     * @returns The argument of perigee as a stringified number.
     * @throws Error if the length of the argument of perigee is not 8.
     */
    static argumentOfPerigee(argPe: number | string): StringifiedNumber;
    /**
     * Returns the eccentricity value formatted for TLE.
     * @param ecen - The eccentricity value (string or number).
     * @returns The eccentricity value formatted as 7 digits without leading "0.".
     * @throws Error if the length of the eccentricity string is not 7.
     */
    static eccentricity(ecen: string | number): string;
    /**
     * Converts the inclination value to a string representation.
     * @param inc - The inclination value to be converted.
     * @returns The string representation of the inclination value.
     * @throws Error if the length of the converted value is not 8.
     */
    static inclination(inc: number | string): StringifiedNumber;
    /**
     * Converts the mean anomaly to a string representation with 8 digits, padded with leading zeros.
     * @param meana - The mean anomaly to be converted. Can be either a number or a string.
     * @returns The mean anomaly as a string with 8 digits, padded with leading zeros.
     * @throws Error if the length of the mean anomaly is not 8.
     */
    static meanAnomaly(meana: number | string): StringifiedNumber;
    /**
     * Converts the mean motion value to a string representation with 8 decimal
     * places. If the input is a number, it is converted to a string. If the input
     * is already a string, it is parsed as a float and then converted to a string
     * with 8 decimal places. The resulting string is padded with leading zeros to
     * ensure a length of 11 characters. Throws an error if the resulting string
     * does not have a length of 11 characters.
     * @param meanmo - The mean motion value to be converted.
     * @returns The string representation of the mean motion value with 8 decimal
     * places and padded with leading zeros.
     * @throws Error if the resulting string does not have a length of 11
     * characters.
     */
    static meanMotion(meanmo: number | string): StringifiedNumber;
    /**
     * Converts the right ascension value to a stringified number.
     * @param rasc - The right ascension value to convert.
     * @returns The stringified number representation of the right ascension.
     * @throws Error if the length of the converted right ascension is not 8.
     */
    static rightAscension(rasc: number | string): StringifiedNumber;
    /**
     * Sets a character at a specific index in a string. If the index is out of range, the original string is returned.
     * @param str - The input string.
     * @param index - The index at which to set the character.
     * @param chr - The character to set at the specified index.
     * @returns The modified string with the character set at the specified index.
     */
    static setCharAt(str: string, index: number, chr: string): string;
    /**
     * Format mean motion dot (first derivative / 2) for TLE line 1.
     * Format: sign + ".NNNNNNNN" = 10 chars total.
     * @param value - Mean motion dot value (rev/day^2)
     * @returns Formatted 10-character string
     */
    static formatMeanMotionDot(value: number): string;
    /**
     * Format a value in TLE exponential notation for BSTAR or mean motion ddot.
     * Format: "sNNNNN±N" (8 chars) where mantissa has implied leading decimal point.
     * Example: 0.00017507 → " 17507-3" (i.e., .17507 × 10^-3)
     * @param value - The value to format
     * @returns Formatted 8-character string
     */
    static formatTleExponential(value: number): string;
    /**
     * Compute TLE line checksum (modulo 10 sum of digits, '-' counts as 1).
     * @param line - TLE line (first 68 characters are summed)
     * @returns Checksum digit (0-9)
     */
    static tleChecksum(line: string): number;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare abstract class Force {
    /**
     * Calculate the acceleration due to the perturbing force on a given
     * state vector.
     * @param state The state vector.
     * @throws If the force cannot be calculated.
     */
    abstract acceleration(state: J2000): Vector3D;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class Thrust implements Force {
    center: EpochUTC;
    radial: MetersPerSecond;
    intrack: MetersPerSecond;
    crosstrack: MetersPerSecond;
    durationRate: SecondsPerMeterPerSecond;
    constructor(center: EpochUTC, radial: MetersPerSecond, intrack: MetersPerSecond, crosstrack: MetersPerSecond, durationRate?: SecondsPerMeterPerSecond);
    deltaV: Vector3D<KilometersPerSecond>;
    get magnitude(): MetersPerSecond;
    get duration(): Seconds;
    get start(): EpochUTC;
    get stop(): EpochUTC;
    acceleration(state: J2000): Vector3D;
    apply(state: J2000): J2000;
    get isImpulsive(): boolean;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class EpochWindow {
    start: EpochUTC;
    end: EpochUTC;
    constructor(start: EpochUTC, end: EpochUTC);
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare abstract class Interpolator {
    abstract window(): EpochWindow;
    inWindow(epoch: EpochUTC): boolean;
    overlap(interpolator: Interpolator): EpochWindow | null;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare abstract class StateInterpolator extends Interpolator {
    /**
     * Interpolates the state at the given epoch.
     * @param epoch The epoch in UTC format.
     * @throws If the interpolator has not been initialized.
     */
    abstract interpolate(epoch: EpochUTC): J2000 | null;
    get sizeBytes(): number;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class ForceModel {
    private centralGravity_?;
    private thirdBodyGravity_?;
    private solarRadiationPressure_?;
    private atmosphericDrag_?;
    private maneuverThrust_;
    setGravity(mu?: number): this;
    setEarthGravity(degree: number, order: number): void;
    setThirdBodyGravity({ moon, sun }: {
        moon?: boolean | undefined;
        sun?: boolean | undefined;
    }): void;
    setSolarRadiationPressure(mass: number, area: number, coeff?: number): void;
    /**
     * Sets the atmospheric drag for the force model.
     * @deprecated This is still a work in progress!
     * @param mass - The mass of the object.
     * @param area - The cross-sectional area of the object.
     * @param coeff - The drag coefficient. Default value is 2.2.
     * @param cosine - The cosine of the angle between the object's velocity vector and the drag force vector.
     */
    setAtmosphericDrag(mass: number, area: number, coeff?: number, cosine?: number): void;
    loadManeuver(maneuver: Thrust): void;
    clearManeuver(): void;
    acceleration(state: J2000): Vector3D;
    derivative(state: J2000): Vector;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class Waypoint {
    epoch: EpochUTC;
    relativePosition: Vector3D<Kilometers>;
    constructor(epoch: EpochUTC, relativePosition: Vector3D<Kilometers>);
    /**
     * Return the perturbed error in a [maneuver] when compared against the
     * target [waypoint] given an initial [state], [forceModel],
     * [target] interpolator, and speculative relative maneuver
     * [components] _(m/s)_.
     * @param waypoint The waypoint to target.
     * @param maneuver The maneuver to perturb.
     * @param state The initial state of the interceptor.
     * @param forceModel The force model to use for propagation.
     * @param target The target interpolator.
     * @param components The speculative maneuver components.
     * @returns The perturbed error in the maneuver.
     */
    static _error(waypoint: Waypoint, maneuver: Thrust, state: J2000, forceModel: ForceModel, target: StateInterpolator, components: Float64Array): number;
    /**
     * Generate a score function for refining perturbed [waypoint] maneuvers.
     *
     * The score function takes an array of speculative radial, intrack, and
     * crosstrack components _(m/s)_ and returns the propagated error from the
     * desired waypoint target.
     * @param waypoint The waypoint to target.
     * @param maneuver The maneuver to perturb.
     * @param state The initial state of the interceptor.
     * @param forceModel The force model to use for propagation.
     * @param target The target interpolator.
     * @returns A score function for refining maneuvers.
     */
    static _refineManeuverScore(waypoint: Waypoint, maneuver: Thrust, state: J2000, forceModel: ForceModel, target: StateInterpolator): (components: Float64Array) => number;
    /**
     * Convert an array of [waypoints] into a maneuver sequence given an
     * [interceptor] state, [pivot] epoch for the first burn to arrive at the
     * first waypoint, and [target] ephemeris interpolator.
     *
     * Optional arguments are as follows:
     *  - `preManeuvers`: maneuvers to execute before the pivot burn
     * - `postManeuvers`: maneuvers to execute after the last pivot burn
     * - `durationRate`: thruster duration rate _(s/m/s)_
     * - `forceModel`: interceptor force model, defaults to two-body
     * - `refine`: refine maneuvers to account for perturbations if `true`
     * - `maxIter`: maximum refinement iterations per maneuver
     * - `printIter`: print debug information on each refinement iteration
     * @param interceptor The interceptor state.
     * @param pivot The epoch of the first burn.
     * @param waypoints The waypoints to target.
     * @param target The target interpolator.
     * @param preManeuvers The maneuvers to execute before the pivot burn.
     * @param postManeuvers The maneuvers to execute after the last pivot burn.
     * @param root0 The optional arguments.
     * @param root0.durationRate The thruster duration rate.
     * @param root0.forceModel The interceptor force model.
     * @param root0.refine Whether to refine maneuvers to account for perturbations.
     * @param root0.maxIter The maximum refinement iterations per maneuver.
     * @param root0.printIter Whether to print debug information on each refinement iteration.
     * @returns An array of maneuvers.
     */
    static toManeuvers(interceptor: J2000, pivot: EpochUTC, waypoints: Waypoint[], target: StateInterpolator, preManeuvers: Thrust[] | null, postManeuvers: Thrust[] | null, { durationRate, forceModel, refine, maxIter, printIter, }?: {
        durationRate?: number;
        forceModel?: ForceModel;
        refine?: boolean;
        maxIter?: number;
        printIter?: boolean;
    }): Thrust[];
    static _refineManeuvers(waypoints: Waypoint[], maneuvers: Thrust[], interceptor: J2000, forceModel: ForceModel, target: StateInterpolator, { maxIter, printIter, }?: {
        maxIter?: number;
        printIter?: boolean;
    }): Thrust[];
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class Hill {
    epoch: EpochUTC;
    position: Vector3D<Kilometers>;
    velocity: Vector3D<KilometersPerSecond>;
    private semimajorAxis_;
    private meanMotion_;
    constructor(epoch: EpochUTC, position: Vector3D<Kilometers>, velocity: Vector3D<KilometersPerSecond>, semimajorAxis: Kilometers);
    static fromState(origin: J2000, radialPosition: Kilometers, intrackPosition: Kilometers, nodeVelocity: KilometersPerSecond, nodeOffsetTime: Seconds): Hill;
    static fromNmc(origin: J2000, majorAxisRange: Kilometers, nodeVelocity: KilometersPerSecond, nodeOffsetTime: Seconds, translation?: number): Hill;
    static fromPerch(origin: J2000, perchRange: Kilometers, nodeVelocity: KilometersPerSecond, nodeOffsetTime: Seconds): Hill;
    get semimajorAxis(): Kilometers;
    set semimajorAxis(sma: Kilometers);
    get meanMotion(): RadiansPerSecond;
    toJ2000Matrix(origin: J2000, transform: Matrix): J2000;
    toJ2000(origin: J2000): J2000;
    static transitionMatrix(t: number, meanMotion: number): Matrix;
    transition(t: Seconds): Hill;
    transitionWithMatrix(stm: Matrix, t: Seconds): Hill;
    propagate(newEpoch: EpochUTC): Hill;
    propagateWithMatrix(stm: Matrix, newEpoch: EpochUTC): Hill;
    maneuver(maneuver: Thrust): Hill;
    ephemeris(start: EpochUTC, stop: EpochUTC, step?: Seconds): Hill[];
    get period(): Seconds;
    nextRadialTangent(): Hill;
    solveManeuver(waypoint: Waypoint, ignoreCrosstrack?: boolean): Thrust;
    maneuverSequence(pivot: EpochUTC, waypoints: Waypoint[], preManeuvers?: Thrust[], postManeuvers?: Thrust[]): Thrust[];
    maneuverOrigin(maneuver: Thrust): Hill;
    get name(): string;
    toString(): string;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Represents the relative state of an object in 3D space.
 */
declare abstract class RelativeState {
    position: Vector3D<Kilometers>;
    velocity: Vector3D<KilometersPerSecond>;
    constructor(position: Vector3D<Kilometers>, velocity: Vector3D<KilometersPerSecond>);
    /**
     * Gets the name of the coordinate system.
     * @returns The name of the coordinate system.
     */
    abstract get name(): string;
    /**
     * Returns a string representation of the RelativeState object. The string includes the name, position, and velocity
     * of the object.
     * @returns A string representation of the RelativeState object.
     */
    toString(): string;
    /**
     * Transforms the current RelativeState coordinate to the J2000 coordinate
     * @param origin The origin J2000 coordinate.
     * @returns The transformed J2000 coordinate.
     */
    abstract toJ2000(origin: J2000): J2000;
    /**
     * Creates a matrix based on the given position and velocity vectors. The matrix represents the relative state of an
     * object in 3D space.
     * @param position - The position vector.
     * @param velocity - The velocity vector.
     * @returns The matrix representing the relative state.
     */
    static createMatrix(position: Vector3D, velocity: Vector3D): Matrix;
    /**
     * Calculates the range of the relative state.
     * @returns The range in kilometers.
     */
    get range(): Kilometers;
    /**
     * Calculates the range rate of the relative state. Range rate is the dot product of the position and velocity divided
     * by the range.
     * @returns The range rate in Kilometers per second.
     */
    get rangeRate(): number;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Represents a position and velocity with x, y, z components.
 */
interface PosVelLike {
    position: {
        x: number;
        y: number;
        z: number;
    };
    velocity: {
        x: number;
        y: number;
        z: number;
    };
}
/**
 * Represents a Radial-Intrack-Crosstrack (RIC) coordinates.
 */
declare class RIC extends RelativeState {
    /**
     * Gets the name of the RIC coordinate system.
     * @returns The name of the RIC coordinate system.
     */
    get name(): string;
    /**
     * Creates a new RIC (Radial-Intrack-Crosstrack) coordinate from the J2000 state vectors.
     * @param state - The J2000 state vector.
     * @param origin - The J2000 state vector of the origin.
     * @param transform - The transformation matrix.
     * @returns The RIC coordinate.
     */
    static fromJ2000Matrix(state: J2000, origin: J2000, transform: Matrix): RIC;
    /**
     * Creates a RIC (Radial-Intrack-Crosstrack) coordinate system from a J2000 state and origin.
     * @param state The J2000 state.
     * @param origin The J2000 origin.
     * @returns The RIC coordinate system.
     */
    static fromJ2000(state: J2000, origin: J2000): RIC;
    /**
     * Creates a RIC coordinate from raw position/velocity objects.
     * This is a convenience method that wraps fromJ2000 for simpler usage.
     * @param state The state with position and velocity vectors.
     * @param origin The origin (reference) with position and velocity vectors.
     * @param epoch Optional epoch for the state vectors. Defaults to current time.
     * @returns The RIC coordinate.
     */
    static fromPosVel(state: PosVelLike, origin: PosVelLike, epoch?: Date): RIC;
    /**
     * Transforms the current RIC coordinate to the J2000 coordinate system using the provided origin and transform
     * matrix.
     * @param origin The origin J2000 coordinate.
     * @param transform The transformation matrix.
     * @returns The transformed J2000 coordinate.
     */
    toJ2000Matrix(origin: J2000, transform: Matrix): J2000;
    /**
     * Transforms the current RIC coordinate to the J2000 coordinate system using the provided origin.
     * @param origin The origin J2000 coordinate.
     * @returns The transformed J2000 coordinate.
     */
    toJ2000(origin: J2000): J2000;
}

/**
 * Represents the data format for orbital elements as provided by the OMM system.
 * Numeric fields accept both string and number to support CelesTrak's JSON format
 * (which sends numbers as numbers) and other sources that send them as strings.
 */
interface OmmDataFormat {
    OBJECT_NAME: string;
    OBJECT_ID: string;
    /** Date in YYYY-MM-DDTHH:MM:SS.SSSSSS UTC format */
    EPOCH: string;
    MEAN_MOTION: string | number;
    ECCENTRICITY: string | number;
    INCLINATION: string | number;
    RA_OF_ASC_NODE: string | number;
    ARG_OF_PERICENTER: string | number;
    MEAN_ANOMALY: string | number;
    EPHEMERIS_TYPE: string | number;
    CLASSIFICATION_TYPE: string;
    NORAD_CAT_ID: string | number;
    ELEMENT_SET_NO: string | number;
    REV_AT_EPOCH: string | number;
    BSTAR: string | number;
    MEAN_MOTION_DOT: string | number;
    MEAN_MOTION_DDOT: string | number;
}
/**
 * Represents the parsed data format for orbital elements as provided by the OMM system.
 * String fields are preserved from the original data; the `epoch` property contains
 * the parsed date/time values used for SGP4 initialization.
 */
interface OmmParsedDataFormat {
    OBJECT_NAME: string;
    OBJECT_ID: string;
    /** Date in YYYY-MM-DDTHH:MM:SS.SSSSSS UTC format */
    EPOCH: string;
    MEAN_MOTION: string;
    ECCENTRICITY: string;
    INCLINATION: string;
    RA_OF_ASC_NODE: string;
    ARG_OF_PERICENTER: string;
    MEAN_ANOMALY: string;
    EPHEMERIS_TYPE: string;
    CLASSIFICATION_TYPE: string;
    NORAD_CAT_ID: string;
    ELEMENT_SET_NO: string;
    REV_AT_EPOCH: string;
    BSTAR: string;
    MEAN_MOTION_DOT: string;
    MEAN_MOTION_DDOT: string;
    epoch: {
        year: number;
        month: number;
        day: number;
        hour: number;
        minute: number;
        second: number;
        doy: number;
    };
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * This class was ported from the python-sgp4 library by Brandon Rhodes. That library
 * is licensed under the MIT license and he maintains the copyright for that work.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare enum Sgp4GravConstants {
    wgs72old = "wgs72old",
    wgs72 = "wgs72",
    wgs84 = "wgs84"
}
declare class Sgp4 {
    private static angle_;
    private static asinh_;
    static createSatrec(tleLine1: string, tleLine2: string, whichconst?: Sgp4GravConstants, opsmode?: Sgp4OpsMode): SatelliteRecord;
    static createSatrecFromOmm(omm: OmmParsedDataFormat, whichconst?: Sgp4GravConstants, opsmode?: Sgp4OpsMode): SatelliteRecord;
    private static cross_;
    static days2mdhms(year: number, days: number): {
        mon: number;
        day: number;
        hr: number;
        min: number;
        sec: number;
    };
    private static dot_;
    static gstime(jdut1: number): GreenwichMeanSiderealTime;
    static invjday(jd: number, jdfrac: number): {
        year: number;
        mon: number;
        day: number;
        hr: number;
        min: number;
        sec: number;
    };
    static jday(year: number | Date, mon?: number, day?: number, hr?: number, min?: number, sec?: number, ms?: number): {
        jd: number;
        jdFrac: number;
    };
    private static mag_;
    private static newtonnu_;
    static propagate(satrec: SatelliteRecord, tsince: number): StateVectorSgp4;
    static rv2coe(r: Vec3Flat, v: Vec3Flat, mus: number): {
        p: number;
        a: number;
        ecc: number;
        incl: number;
        omega: number;
        argp: number;
        nu: number;
        m: number;
        arglat: number;
        truelon: number;
        lonper: number;
    };
    /**
     * Determines the sign of a given number.
     * @param x - The input number to evaluate.
     * @returns `-1.0` if the input number is less than `0.0`, otherwise `1.0`.
     */
    private static sgn_;
    /**
     * Computes the hyperbolic sine of a given number.
     *
     * The hyperbolic sine is calculated using the formula:
     * sinh(x) = (e^x - e^(-x)) / 2
     * @param x - The input number for which to calculate the hyperbolic sine.
     * @returns The hyperbolic sine of the input number.
     */
    private static sinh_;
    private static dpper_;
    private static dscom_;
    private static dsinit_;
    private static dspace_;
    private static getgravconst_;
    private static initl_;
    private static sgp4init_;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Classification of a satellite catalog number by its representation.
 *
 * - `numeric5` — 1-5 numeric digits, value 0-99 999.
 * - `alpha5` — 5 chars, leading letter (A-Z, excl. I/O), value 100 000-339 999.
 * - `numeric6` — 6 numeric digits, value 100 000-339 999.
 * - `extended` — 7+ numeric digits (e.g. CelesTrak supplemental 9-digit IDs).
 *   Cannot be encoded in TLE cols 3-7 without truncation; canonical ID lives
 *   on `Satellite.sccNum`.
 * - `invalid` — empty, malformed, or otherwise unclassifiable.
 */
type SatNumKind = 'numeric5' | 'alpha5' | 'numeric6' | 'extended' | 'invalid';
/**
 * Tle is a static class with a collection of methods for working with TLEs.
 */
declare class Tle {
    line1: TleLine1;
    line2: TleLine2;
    epoch: EpochUTC;
    satnum: number;
    private readonly satrec_;
    /**
     * Mapping of alpha-5 leading letters to their numeric values. Sourced from the
     * leaf `alpha5` module so TLE format helpers can share it without importing Tle.
     */
    private static readonly alpha5_;
    /** The argument of perigee field. */
    private static readonly argPerigee_;
    /** The BSTAR drag term field. */
    private static readonly bstar_;
    /** The checksum field. */
    private static readonly checksum_;
    /** The classification field. */
    private static readonly classification_;
    /** The eccentricity field. */
    private static readonly eccentricity_;
    /** The element set number field. */
    private static readonly elsetNum_;
    /** The ephemeris type field. */
    private static readonly ephemerisType_;
    /** The epoch day field. */
    private static readonly epochDay_;
    /** The epoch year field. */
    private static readonly epochYear_;
    /** The inclination field. */
    private static readonly inclination_;
    /** The international designator launch number field. */
    private static readonly intlDesLaunchNum_;
    /** The international designator launch piece field. */
    private static readonly intlDesLaunchPiece_;
    /** The international designator year field. */
    private static readonly intlDesYear_;
    /** The line number field. */
    private static readonly lineNumber_;
    /** The mean anomaly field. */
    private static readonly meanAnom_;
    /** The first derivative of the mean motion field. */
    private static readonly meanMoDev1_;
    /** The second derivative of the mean motion field. */
    private static readonly meanMoDev2_;
    /** The mean motion field. */
    private static readonly meanMo_;
    /** The right ascension of the ascending node field. */
    private static readonly rightAscension_;
    /** The revolution number field. */
    private static readonly revNum_;
    /** The satellite number field. */
    private static readonly satNum_;
    constructor(line1: string, line2: string, opsMode?: Sgp4OpsMode, gravConst?: Sgp4GravConstants);
    toString(): string;
    /**
     * Gets the semimajor axis of the TLE.
     * @returns The semimajor axis value.
     */
    get semimajorAxis(): number;
    /**
     * Gets the eccentricity of the TLE.
     * @returns The eccentricity value.
     */
    get eccentricity(): number;
    /**
     * Gets the inclination of the TLE.
     * @returns The inclination in degrees.
     */
    get inclination(): number;
    /**
     * Gets the inclination in degrees.
     * @returns The inclination in degrees.
     */
    get inclinationDegrees(): number;
    /**
     * Gets the apogee of the TLE (Two-Line Elements) object.
     * Apogee is the point in an orbit that is farthest from the Earth.
     * It is calculated as the product of the semimajor axis and (1 + eccentricity).
     * @returns The apogee value.
     */
    get apogee(): number;
    /**
     * Gets the perigee of the TLE (Two-Line Element Set).
     * The perigee is the point in the orbit of a satellite or other celestial body where it is closest to the Earth.
     * It is calculated as the product of the semimajor axis and the difference between 1 and the eccentricity.
     * @returns The perigee value.
     */
    get perigee(): number;
    /**
     * Gets the period of the TLE in minutes.
     * @returns The period of the TLE in minutes.
     */
    get period(): Minutes;
    /**
     * Parses the epoch string and returns the corresponding EpochUTC object.
     * @param epochStr - The epoch string to parse.
     * @returns The parsed EpochUTC object.
     */
    private static parseEpoch_;
    static calcElsetAge(tle1: TleLine1, nowInput?: Date, outputUnits?: 'days' | 'hours' | 'minutes' | 'seconds'): number;
    /**
     * Propagates the TLE (Two-Line Element Set) to a specific epoch and returns the TEME (True Equator Mean Equinox)
     * coordinates.
     * @param epoch The epoch to propagate the TLE to.
     * @returns The TEME coordinates at the specified epoch.
     * @throws Error if propagation fails.
     */
    propagate(epoch: EpochUTC): TEME;
    /**
     * Converts the state vector to position and velocity arrays.
     * @param stateVector - The state vector containing position and velocity information.
     * @param r - The array to store the position values.
     * @param v - The array to store the velocity values.
     */
    private static sv2rv_;
    /**
     * Returns the current state of the satellite in the TEME coordinate system.
     * @returns The current state of the satellite.
     */
    private currentState_;
    /**
     * Gets the state of the TLE in the TEME coordinate system.
     * @returns The state of the TLE in the TEME coordinate system.
     */
    get state(): TEME;
    /**
     * Calculates the Semi-Major Axis (SMA) from the second line of a TLE.
     * @param line2 The second line of the TLE.
     * @returns The Semi-Major Axis (SMA) in kilometers.
     */
    private static tleSma_;
    /**
     * Parses the eccentricity value from the second line of a TLE.
     * @param line2 The second line of the TLE.
     * @returns The eccentricity value.
     */
    private static tleEcc_;
    /**
     * Calculates the inclination angle from the second line of a TLE.
     * @param line2 The second line of the TLE.
     * @returns The inclination angle in radians.
     */
    private static tleInc_;
    /**
     * Creates a TLE (Two-Line Element) object from classical orbital elements.
     * @param elements - The classical orbital elements.
     * @returns A TLE object.
     */
    static fromClassicalElements(elements: ClassicalElements): Tle;
    /**
     * Argument of perigee.
     * @see https://en.wikipedia.org/wiki/Argument_of_perigee
     * @example 69.9862
     * @param tleLine2 The second line of the Tle to parse.
     * @returns The argument of perigee in degrees (0 to 360).
     */
    static argOfPerigee(tleLine2: TleLine2): Degrees;
    /**
     * BSTAR drag term (decimal point assumed).  Estimates the effects of atmospheric drag on the satellite's motion.
     * @see https://en.wikipedia.org/wiki/BSTAR
     * @example 0.000036771
     * @description ('36771-4' in the original Tle or 0.36771 * 10 ^ -4)
     * @param tleLine1 The first line of the Tle to parse.
     * @returns The drag coefficient.
     */
    static bstar(tleLine1: TleLine1): number;
    /**
     * Tle line 1 checksum (modulo 10), for verifying the integrity of this line of the Tle.
     * @example 3
     * @param tleLine The first line of the Tle to parse.
     * @returns The checksum value (0 to 9)
     */
    static checksum(tleLine: TleLine1 | TleLine2): number;
    /**
     * Returns the satellite classification.
     * Some websites like https://KeepTrack.space and Celestrak.org will embed
     * information in this field about the source of the Tle.
     * @example 'U'
     * unclassified
     * @example 'C'
     * confidential
     * @example 'S'
     * secret
     * @param tleLine1 The first line of the Tle to parse.
     * @returns The satellite classification.
     */
    static classification(tleLine1: TleLine1): string;
    /**
     * Orbital eccentricity, decimal point assumed. All artificial Earth satellites have an eccentricity between 0
     * (perfect circle) and 1 (parabolic orbit).
     * @example 0.0006317
     * (`0006317` in the original Tle)
     * @param tleLine2 The second line of the Tle to parse.
     * @returns The eccentricity of the satellite (0 to 1)
     */
    static eccentricity(tleLine2: TleLine2): number;
    /**
     * Tle element set number, incremented for each new Tle generated.
     * @see https://en.wikipedia.org/wiki/Two-line_element_set
     * @example 999
     * @param tleLine1 The first line of the Tle to parse.
     * @returns The element number (1 to 999)
     */
    static elsetNum(tleLine1: TleLine1): number;
    /**
     * Private value - used by United States Space Force to reference the orbit model used to generate the Tle. Will
     * almost always be seen as zero externally (e.g. by "us", unless you are "them" - in which case, hello!).
     *
     * A value of 1 is tolerated in addition to 0: the field is informational and does not change how SGP4/SDP4
     * propagate the element set, and a handful of archival TLEs carry a 1 (originally an SGP marker).
     *
     * A value of 4 indicates the SGP4-XP model. Until that source code is released there is no way to support that
     * format in JavaScript or TypeScript, so it is rejected explicitly. Any other value is treated as malformed.
     * @example 0
     * @param tleLine1 The first line of the Tle to parse.
     * @returns The ephemeris type (0 or 1).
     */
    static ephemerisType(tleLine1: TleLine1): 0 | 1;
    /**
     * Fractional day of the year when the Tle was generated (Tle epoch).
     * @example 206.18396726
     * @param tleLine1 The first line of the Tle to parse.
     * @returns The day of the year the Tle was generated. (1 to 365.99999999)
     */
    static epochDay(tleLine1: string): number;
    /**
     * Year when the Tle was generated (Tle epoch), last two digits.
     * @example 17
     * @param tleLine1 The first line of the Tle to parse.
     * @returns The year the Tle was generated. (0 to 99)
     */
    static epochYear(tleLine1: TleLine1): number;
    /**
     * Year when the Tle was generated (Tle epoch), four digits.
     * @example 2008
     * @param tleLine1 The first line of the Tle to parse.
     * @returns The year the Tle was generated. (1957 to 2056)
     */
    static epochYearFull(tleLine1: TleLine1): number;
    /**
     * Inclination relative to the Earth's equatorial plane in degrees. 0 to 90 degrees is a prograde orbit and 90 to 180
     * degrees is a retrograde orbit.
     * @example 51.6400
     * @param tleLine2 The second line of the Tle to parse.
     * @returns The inclination of the satellite. (0 to 180)
     */
    static inclination(tleLine2: TleLine2): Degrees;
    /**
     * International Designator (COSPAR ID)
     * @see https://en.wikipedia.org/wiki/International_Designator
     * @param tleLine1 The first line of the Tle to parse.
     * @returns The International Designator.
     */
    static intlDes(tleLine1: TleLine1): string;
    /**
     * International Designator (COSPAR ID): Launch number of the year.
     * @example 67
     * @param tleLine1 The first line of the Tle to parse.
     * @returns The launch number of the International Designator. (1 to 999)
     */
    static intlDesLaunchNum(tleLine1: string): number;
    /**
     * International Designator  (COSPAR ID): Piece of the launch.
     * @example 'A'
     * @param tleLine1 The first line of the Tle to parse.
     * @returns The launch piece of the International Designator. (A to ZZZ)
     */
    static intlDesLaunchPiece(tleLine1: TleLine1): string;
    /**
     * International Designator (COSPAR ID): Last 2 digits of launch year.
     * @example 98
     * @param tleLine1 The first line of the Tle to parse.
     * @returns The year of the International Designator. (0 to 99)
     */
    static intlDesYear(tleLine1: TleLine1): number;
    /**
     * This should always return a 1 or a 2.
     * @example 1
     * @param tleLine The first line of the Tle to parse.
     * @returns The line number of the Tle. (1 or 2)
     */
    static lineNumber(tleLine: TleLine1 | TleLine2): 1 | 2;
    /**
     * Mean anomaly. Indicates where the satellite was located within its orbit at the time of the Tle epoch.
     * @see https://en.wikipedia.org/wiki/Mean_Anomaly
     * @example 25.2906
     * @param tleLine2 The second line of the Tle to parse.
     * @returns The mean anomaly of the satellite. (0 to 360)
     */
    static meanAnomaly(tleLine2: TleLine2): Degrees;
    /**
     * First Time Derivative of the Mean Motion divided by two.  Defines how mean motion changes over time, so Tle
     * propagators can still be used to make reasonable guesses when times are distant from the original Tle epoch. This
     * is recorded in units of orbits per day per day.
     * @example 0.00001961
     * @param tleLine1 The first line of the Tle to parse.
     * @returns The first derivative of the mean motion.
     */
    static meanMoDev1(tleLine1: TleLine1): number;
    /**
     * Second Time Derivative of Mean Motion divided by six (decimal point assumed). Measures rate of change in the Mean
     * Motion Dot so software can make reasonable guesses when times are distant from the original Tle epoch. Usually
     * zero, unless the satellite is manuevering or in a decaying orbit. This is recorded in units of orbits per day per
     * day per day.
     * @example 0
     * '00000-0' in the original Tle or 0.00000 * 10 ^ 0
     * @param tleLine1 The first line of the Tle to parse.
     * @returns The second derivative of the mean motion.
     */
    static meanMoDev2(tleLine1: string): number;
    /**
     * Revolutions around the Earth per day (mean motion).
     * @see https://en.wikipedia.org/wiki/Mean_Motion
     * @example 15.54225995
     * @param tleLine2 The second line of the Tle to parse.
     * @returns The mean motion of the satellite. (0 to 18)
     */
    static meanMotion(tleLine2: TleLine2): number;
    /**
     * Calculates the period of a satellite orbit based on the given Tle line 2.
     * @example 92.53035747
     * @param tleLine2 The Tle line 2.
     * @returns The period of the satellite orbit in minutes.
     */
    static period(tleLine2: TleLine2): Minutes;
    /**
     * Right ascension of the ascending node in degrees. Essentially, this is the angle of the satellite as it crosses
     * northward (ascending) across the Earth's equator (equatorial plane).
     * @example 208.9163
     * @param tleLine2 The second line of the Tle to parse.
     * @returns The right ascension of the satellite. (0 to 360)
     */
    static rightAscension(tleLine2: TleLine2): Degrees;
    /**
     * NORAD catalog number. To support Alpha-5, the first digit can be a letter. This will NOT be converted to a number.
     * Use satNum() for that.
     * @see https://en.wikipedia.org/wiki/Satellite_Catalog_Number
     * @example 25544
     * @example B1234
     * @param tleLine The first line of the Tle to parse.
     * @returns NORAD catalog number.
     */
    static rawSatNum(tleLine: TleLine1 | TleLine2): string;
    /**
     * Total satellite revolutions when this Tle was generated. This number rolls over (e.g. 99999 -> 0).
     * @example 6766
     * @param tleLine2 The second line of the Tle to parse.
     * @returns The revolutions around the Earth per day (mean motion). (0 to 99999)
     */
    static revNum(tleLine2: TleLine2): number;
    /**
     * NORAD catalog number converted to a number.
     * @see https://en.wikipedia.org/wiki/Satellite_Catalog_Number
     * @example 25544
     * @example 111234
     * @param tleLine The first line of the Tle to parse.
     * @returns NORAD catalog number. (0 to 339999)
     */
    static satNum(tleLine: TleLine1 | TleLine2): number;
    /**
     * Parse the first line of the Tle.
     * @param tleLine1 The first line of the Tle to parse.
     * @returns Returns the data from the first line of the Tle.
     */
    static parseLine1(tleLine1: TleLine1): Line1Data;
    /**
     * Parse the second line of the Tle.
     * @param tleLine2 The second line of the Tle to parse.
     * @returns Returns the data from the second line of the Tle.
     */
    static parseLine2(tleLine2: TleLine2): Line2Data;
    /**
     * Parses the Tle into orbital data.
     *
     * If you want all of the data then use parseTleFull instead.
     * @param tleLine1 Tle line 1
     * @param tleLine2 Tle line 2
     * @returns Returns most commonly used orbital data from Tle
     */
    static parse(tleLine1: TleLine1, tleLine2: TleLine2): TleData;
    /**
     * Parses all of the data contained in the Tle.
     *
     * If you only want the most commonly used data then use parseTle instead.
     * @param tleLine1 The first line of the Tle to parse.
     * @param tleLine2 The second line of the Tle to parse.
     * @returns Returns all of the data from the Tle.
     */
    static parseAll(tleLine1: TleLine1, tleLine2: TleLine2): TleDataFull;
    /**
     * Classifies a satellite catalog number by representation. See {@link SatNumKind}.
     * Pure function; no side effects.
     * @param sccNum The catalog number string.
     * @returns The {@link SatNumKind} describing the input.
     */
    static classifySatNum(sccNum: string): SatNumKind;
    /**
     * Converts a 6-digit numeric SCC number to its 5-character alpha-5 form.
     *
     * Inputs shorter than 6 chars or already in alpha-5 form pass through unchanged.
     *
     * @param sccNum The SCC number to convert.
     * @returns The 5-character alpha-5 representation.
     * @throws {ValidationError} If `sccNum` exceeds the alpha-5 range (numeric value > 339 999,
     *   or length > 6). For such IDs the canonical value should be kept on
     *   `Satellite.sccNum` and the TLE column populated with the last 5 digits.
     */
    static convert6DigitToA5(sccNum: string): string;
    /**
     * Converts a 5-character alpha-5 SCC number to its 6-digit numeric form.
     *
     * Inputs shorter than 5 chars pass through unchanged. Numeric inputs without
     * an alpha-5 leading letter pass through unchanged (5-digit numeric, in-range
     * 6-digit numeric, and extended 7+ digit numeric IDs are all identity).
     *
     * @param sccNum The SCC number to convert.
     * @returns The 6-digit numeric representation, or the input itself if it
     *   is already a numeric form.
     * @throws {ValidationError} If `sccNum` is malformed: 6-digit numeric whose
     *   value exceeds 339 999, or contains stray letters in a non-leading position.
     */
    static convertA5to6Digit(sccNum: string): string;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Options for creating a propagator from a Satellite via `createPropagator()`.
 */
interface NumericalPropagatorOptions {
    /**
     * The propagator type to create. Defaults to PropagatorType.RK89.
     */
    type?: PropagatorType;
    /**
     * The force model for numerical propagators (RK4, DP54, RK89).
     * If not provided, defaults to point-mass gravity.
     * Ignored for SGP4 and KEPLER types.
     */
    forceModel?: ForceModel;
    /**
     * Tolerance for adaptive propagators (DP54, RK89).
     * Smaller values = more accurate but slower.
     * Defaults to 1e-9.
     * Ignored for SGP4, KEPLER, and RK4.
     */
    tolerance?: number;
    /**
     * Fixed step size in seconds for RK4 propagator.
     * Defaults to 15.0 seconds.
     * Ignored for other propagator types.
     */
    stepSize?: number;
}

interface OptionsParams {
    notes: string;
}

/**
 * Information about a space object.
 */
interface SatelliteParams extends LaunchDetails, SpaceCraftDetails, OperationsDetails {
    name?: string;
    rcs?: number | null;
    omm?: OmmDataFormat;
    tle1?: TleLine1;
    tle2?: TleLine2;
    type?: SpaceObjectType;
    vmag?: number | null;
    sccNum?: string;
    intlDes?: string;
    position?: TemeVec3;
    time?: Date;
    /** Unique identifier */
    id?: number;
    /** Whether the satellite is active */
    active?: boolean;
    /** Length in meters */
    length?: string;
    /** Diameter in meters */
    diameter?: string;
    /** Catalog source (e.g., VIMPEL) */
    source?: CatalogSource | string;
    /** Alternate catalog ID */
    altId?: string;
    /** Alternate name */
    altName?: string;
    /** Operational status */
    status?: PayloadStatus;
    /** Configuration for tracking position/velocity history during propagation */
    historyConfig?: HistoryConfig;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class RAE {
    epoch: EpochUTC;
    rng: Kilometers;
    azRad: Radians;
    elRad: Radians;
    /** The range rate of the satellite relative to the observer in kilometers per second. */
    rngRate?: number | undefined;
    /** The azimuth rate of the satellite relative to the observer in radians per second. */
    azRateRad?: number | undefined;
    /** The elevation rate of the satellite relative to the observer in radians per second. */
    elRateRad?: number | undefined;
    constructor(epoch: EpochUTC, rng: Kilometers, azRad: Radians, elRad: Radians, 
    /** The range rate of the satellite relative to the observer in kilometers per second. */
    rngRate?: number | undefined, 
    /** The azimuth rate of the satellite relative to the observer in radians per second. */
    azRateRad?: number | undefined, 
    /** The elevation rate of the satellite relative to the observer in radians per second. */
    elRateRad?: number | undefined);
    static fromDegrees(epoch: EpochUTC, range: Kilometers, azimuth: Degrees, elevation: Degrees, rangeRate?: number, azimuthRate?: number, elevationRate?: number): RAE;
    /**
     * Create a [Razel] object from an inertial [state] and [site] vector.
     * @param state The inertial [state] vector.
     * @param site The observer [site] vector.
     * @returns A new [Razel] object.
     */
    static fromStateVector(state: J2000, site: J2000): RAE;
    /**
     * Gets the azimuth in degrees.
     * @returns The azimuth in degrees.
     */
    get az(): Degrees;
    /**
     * Gets the elevation angle in degrees.
     * @returns The elevation angle in degrees.
     */
    get el(): Degrees;
    /**
     * Gets the azimuth rate in degrees per second.
     * @returns The azimuth rate in degrees per second, or undefined if it is not available.
     */
    get azRate(): number | undefined;
    /**
     * Gets the elevation rate in degrees per second.
     * @returns The elevation rate in degrees per second, or undefined if the elevation rate is not set.
     */
    get elRate(): number | undefined;
    toString(): string;
    /**
     * Return the position relative to the observer [site].
     *
     * An optional azimuth [az] _(rad)_ and elevation [el] _(rad)_ value can be
     * passed to override the values contained in this observation.
     * @param site The observer [site].
     * @param azRad Azimuth _(rad)_.
     * @param elRad Elevation _(rad)_.
     * @returns A [Vector3D] object.
     */
    position(site: J2000, azRad?: Radians, elRad?: Radians): Vector3D<Kilometers>;
    /**
     * Convert this observation into a [J2000] state vector.
     *
     * This will throw an error if the [rangeRate], [elevationRate], or
     * [azimuthRate] are not defined.
     * @param site The observer [site].
     * @returns A [J2000] state vector.
     */
    toStateVector(site: J2000): J2000;
    /**
     * Calculate the angular distance _(rad)_ between this and another [Razel]
     * object.
     * @param razel The other [Razel] object.
     * @param method The angular distance method to use.
     * @returns The angular distance _(rad)_.
     */
    angle(razel: RAE, method?: AngularDistanceMethod): number;
    /**
     * Calculate the angular distance _(°)_ between this and another [Razel]
     * object.
     * @param razel The other [Razel] object.
     * @param method The angular distance method to use.
     * @returns The angular distance _(°)_.
     */
    angleDegrees(razel: RAE, method?: AngularDistanceMethod): number;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class CubicSpline {
    t0: Seconds;
    p0: Vector3D;
    m0: Vector3D;
    t1: Seconds;
    p1: Vector3D;
    m1: Vector3D;
    constructor(t0: Seconds, p0: Vector3D, m0: Vector3D, t1: Seconds, p1: Vector3D, m1: Vector3D);
    private position_;
    private velocity_;
    /**
     * Interpolates the position and velocity at a given time.
     * (km) and velocity (km/s) vectors at the provided time.
     * @param t The time value to interpolate at _(POSIX seconds)_.
     * @returns An array containing the interpolated position and velocity as Vector3D objects.
     */
    interpolate(t: Seconds): Vector3D[];
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Cubic spline ephemeris interpolator.
 *
 * The [CubicSplineInterpolator] is a very fast and accurate interpolator
 * at the expense of memory due to the cached spline pairs used in the
 * interpolation operation. Accuracy is significantly impacted when using
 * sparse ephemerides.
 */
declare class CubicSplineInterpolator extends StateInterpolator {
    private readonly splines_;
    constructor(splines_: CubicSpline[]);
    static fromEphemeris(ephemeris: J2000[]): CubicSplineInterpolator;
    get sizeBytes(): number;
    private matchSpline_;
    interpolate(epoch: EpochUTC): J2000 | null;
    window(): EpochWindow;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class LagrangeInterpolator extends StateInterpolator {
    private readonly t_;
    private readonly x_;
    private readonly y_;
    private readonly z_;
    private readonly order;
    constructor(t: Float64Array, x: Float64Array, y: Float64Array, z: Float64Array, order?: number);
    /**
     * Creates a LagrangeInterpolator from an array of J2000 ephemeris data.
     * @param ephemeris - The array of J2000 ephemeris data.
     * @param order - The order of the LagrangeInterpolator. Default is 10.
     * @returns A new LagrangeInterpolator instance.
     */
    static fromEphemeris(ephemeris: J2000[], order?: number): LagrangeInterpolator;
    get sizeBytes(): number;
    interpolate(epoch: EpochUTC): J2000 | null;
    private static position_;
    private static velocity_;
    private static _getClosest;
    private slice_;
    window(): EpochWindow;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Two-body Velocity Verlet Blend interpolator.
 *
 * The [VerletBlendInterpolator] retains the original ephemerides, so the
 * original _"truth"_ states can be retrieved if needed without imparting any
 * additional error, so this can be used to build other interpolator types.
 * The implementation is simple and very tolerant when working with sparse
 * ephemerides.
 */
declare class VerletBlendInterpolator extends StateInterpolator {
    ephemeris: J2000[];
    constructor(ephemeris: J2000[]);
    get sizeBytes(): number;
    window(): EpochWindow;
    private static getClosest_;
    private matchState_;
    private static _gravity;
    private static integrate_;
    interpolate(epoch: EpochUTC): J2000 | null;
    getCachedState(epoch: EpochUTC): J2000 | null;
    toCubicSpline(): CubicSplineInterpolator;
    toLagrange(order?: number): LagrangeInterpolator;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare abstract class Propagator {
    abstract propagate(epoch: EpochUTC): J2000;
    ephemeris(start: EpochUTC, stop: EpochUTC, interval?: Seconds): VerletBlendInterpolator;
    abstract reset(): void;
    abstract checkpoint(): number;
    abstract restore(index: number): void;
    abstract clearCheckpoints(): void;
    abstract get state(): J2000;
    maneuver(maneuver: Thrust, interval?: Seconds): J2000[];
    ephemerisManeuver(start: EpochUTC, finish: EpochUTC, _maneuvers: Thrust[], interval?: Seconds): VerletBlendInterpolator;
    ascendingNodeEpoch(start: EpochUTC): EpochUTC;
    descendingNodeEpoch(start: EpochUTC): EpochUTC;
    apogeeEpoch(start: EpochUTC): EpochUTC;
    perigeeEpoch(start: EpochUTC): EpochUTC;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare abstract class RungeKuttaAdaptive extends Propagator {
    private readonly initState_;
    private forceModel_;
    private readonly tolerance_;
    /**
     * Create a new [RungeKuttaAdaptive] object from an initial state vector
     * along with an optional [ForceModel] and [tolerance].
     * @param initState_ Initial state vector.
     * @param forceModel_ Numerical integration force model.
     * @param tolerance_ Minimum allowable local error tolerance.
     */
    constructor(initState_: J2000, forceModel_?: ForceModel, tolerance_?: number);
    private _cacheState;
    private readonly _checkpoints;
    private _stepSize;
    private static readonly _minTolerance;
    protected abstract get a(): Float64Array;
    protected abstract get b(): Float64Array[];
    protected abstract get ch(): Float64Array;
    protected abstract get c(): Float64Array;
    protected abstract get order(): number;
    get state(): J2000;
    reset(): void;
    setForceModel(forceModel: ForceModel): void;
    private kfn_;
    private integrate_;
    propagate(epoch: EpochUTC): J2000;
    maneuver(maneuver: Thrust, interval?: Seconds): J2000[];
    ephemerisManeuver(start: EpochUTC, finish: EpochUTC, maneuvers: Thrust[], interval?: Seconds): VerletBlendInterpolator;
    checkpoint(): number;
    clearCheckpoints(): void;
    restore(index: number): void;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class RungeKutta89Propagator extends RungeKuttaAdaptive {
    private readonly a_;
    private readonly b_;
    private readonly ch_;
    private readonly c_;
    get a(): Float64Array;
    get b(): Float64Array[];
    get ch(): Float64Array;
    get c(): Float64Array;
    get order(): number;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Sgp4Propagator is a propagator that uses the SGP4 model to propagate the state of an object.
 * This class is useful for propagating multiple states with the same TLE, since it caches the
 * state of the TLE at different epochs.
 */
declare class Sgp4Propagator extends Propagator {
    private readonly tle_;
    constructor(tle_: Tle);
    private cacheState_;
    private checkpoints_;
    /**
     * Gets the state of the propagator in the J2000 coordinate system.
     * @returns The J2000 state of the propagator.
     */
    get state(): J2000;
    /**
     * Calculates the ephemeris maneuver using the SGP4 propagator.
     * @param start The start epoch in UTC.
     * @param finish The finish epoch in UTC.
     * @param maneuvers The array of thrust maneuvers.
     * @param interval The time interval in seconds.
     */
    ephemerisManeuver(_start: EpochUTC, _finish: EpochUTC, _maneuvers: Thrust[], _interval?: number): VerletBlendInterpolator;
    /**
     * Performs a maneuver with the given thrust.
     * @param maneuver - The thrust maneuver to perform.
     * @param interval - The time interval for the maneuver (default: 60.0 seconds).
     * @throws Error if maneuvers cannot be modeled with SGP4.
     */
    maneuver(_maneuver: Thrust, _interval?: number): J2000[];
    /**
     * Propagates the state of the Sgp4Propagator to a specified epoch in J2000 coordinates.
     * @param epoch - The epoch in UTC format.
     * @returns The propagated state in J2000 coordinates.
     */
    propagate(epoch: EpochUTC): J2000;
    /**
     * Resets the state of the Sgp4Propagator by updating the cache state
     * to the current J2000 state of the TLE.
     */
    reset(): void;
    /**
     * Saves the current state of the propagator and returns the index of the checkpoint.
     * @returns The index of the checkpoint.
     */
    checkpoint(): number;
    /**
     * Clears all the checkpoints in the propagator.
     */
    clearCheckpoints(): void;
    /**
     * Restores the state of the propagator to a previously saved checkpoint.
     * @param index - The index of the checkpoint to restore.
     */
    restore(index: number): void;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing a SpaceObject.
 */
interface SpaceObjectParams extends BaseObjectParams {
    /** Initial position in TEME frame */
    position?: TemeVec3;
    /** Initial velocity in TEME frame */
    velocity?: TemeVec3<KilometersPerSecond>;
}
/**
 * Abstract base class for all objects in space (satellites, debris, etc.).
 * Provides position/velocity state, coordinate conversion methods,
 * and component attachment capabilities.
 */
declare abstract class SpaceObject extends BaseObject {
    /**
     * Current position in TEME (True Equator Mean Equinox) frame.
     * This is a cache of the last computed state.
     */
    position: TemeVec3;
    /**
     * Current velocity in TEME (True Equator Mean Equinox) frame.
     * This is a cache of the last computed state.
     */
    velocity: TemeVec3<KilometersPerSecond>;
    /** Sensors attached to this space object */
    sensors: SensorInterface[];
    /** Communication devices attached to this space object */
    commDevices: CommunicationDeviceInterface[];
    constructor(info: SpaceObjectParams);
    /**
     * Returns the total velocity magnitude in km/s.
     */
    get totalVelocity(): number;
    /**
     * Returns the position and velocity in the TEME (True Equator Mean Equinox) frame at the given time.
     *
     * **Coordinate Frame: TEME (Earth-Centered Inertial)**
     *
     * TEME is the native output frame of SGP4/SDP4 propagation. It is an inertial frame
     * that uses the true equator of date and a simplified mean equinox. For standard J2000
     * ECI coordinates, use {@link toJ2000} instead.
     *
     * **Frame comparison:**
     * | Method | Frame | Inertial | Precision | Use Case |
     * |--------|-------|----------|-----------|----------|
     * | `eci()` | TEME | Yes | Lower | SGP4-native, visualization |
     * | `toJ2000()` | J2000 | Yes | Higher | Force models, interop |
     * | `ecef()` | ECEF | No | Lower | Quick Earth-fixed |
     * | `toITRF()` | ITRF | No | Higher | Precise Earth-fixed |
     *
     * @param date - The time to calculate position for (defaults to now)
     * @returns Position and velocity in TEME frame, or null if propagation fails
     */
    abstract eci(date?: Date): PosVel | null;
    /**
     * Returns the position in ECEF (Earth-Centered Earth-Fixed) coordinates at the given time.
     *
     * **Coordinate Frame: ECEF (Earth-Fixed)**
     *
     * ECEF coordinates rotate with the Earth. This uses a simplified transformation from TEME
     * based on GMST rotation. For higher precision Earth-fixed coordinates, use {@link toITRF}.
     *
     * @param date - The time to calculate position for (defaults to now)
     * @returns ECEF position, or null if propagation fails
     */
    abstract ecef(date?: Date): EcefVec3<Kilometers> | null;
    /**
     * Returns the geodetic position (latitude, longitude, altitude) at the given time.
     *
     * **Coordinate System: Geodetic (WGS84)**
     *
     * Returns geographic coordinates on the WGS84 ellipsoid. Derived from ECEF coordinates.
     *
     * @param date - The time to calculate position for (defaults to now)
     * @returns Geodetic coordinates (lat/lon in degrees, alt in km), or null if propagation fails
     */
    abstract lla(date?: Date): LlaVec3<Degrees, Kilometers> | null;
    /**
     * Returns the Range, Azimuth, and Elevation from a ground observer.
     * @param observer - The ground observer's position
     * @param date - The time to calculate for (defaults to now)
     * @returns RAE coordinates (range in km, az/el in degrees), or null if position cannot be calculated
     */
    rae(observer: GroundObject, date?: Date): RaeVec3<Kilometers, Degrees> | null;
    /**
     * Returns the azimuth angle from a ground observer.
     * @param observer - The ground observer's position
     * @param date - The time to calculate for (defaults to now)
     * @returns Azimuth in degrees (0-360), or null if position cannot be calculated
     */
    az(observer: GroundObject, date?: Date): Degrees | null;
    /**
     * Returns the elevation angle from a ground observer.
     * @param observer - The ground observer's position
     * @param date - The time to calculate for (defaults to now)
     * @returns Elevation in degrees (-90 to 90), or null if position cannot be calculated
     */
    el(observer: GroundObject, date?: Date): Degrees | null;
    /**
     * Returns the range (distance) from a ground observer.
     * @param observer - The ground observer's position
     * @param date - The time to calculate for (defaults to now)
     * @returns Range in kilometers, or null if position cannot be calculated
     */
    rng(observer: GroundObject, date?: Date): Kilometers | null;
    /**
     * Returns the state vector in J2000 (EME2000) frame at the given time.
     *
     * **Coordinate Frame: J2000 (Earth-Centered Inertial)**
     *
     * J2000 is the standard Earth-Centered Inertial frame defined at the J2000.0 epoch
     * (January 1, 2000, 12:00 TT). Use this frame for:
     * - Force modeling and numerical propagation
     * - Interoperability with external systems
     * - Precise astrodynamics calculations
     *
     * @param date - The time to calculate for (defaults to now)
     * @returns J2000 state vector with position and velocity
     */
    abstract toJ2000(date?: Date): J2000;
    /**
     * Returns the state vector in ITRF (International Terrestrial Reference Frame) at the given time.
     *
     * **Coordinate Frame: ITRF (Earth-Fixed)**
     *
     * ITRF is the standard Earth-fixed frame maintained by IERS. Unlike the simplified ECEF
     * from `ecef()`, ITRF includes full precession/nutation modeling. Use this frame for:
     * - Precise Earth-fixed coordinates
     * - GPS/GNSS interoperability
     * - Ground track calculations requiring high accuracy
     *
     * @param date - The time to calculate for (defaults to now)
     * @returns ITRF state vector with position and velocity
     */
    abstract toITRF(date?: Date): ITRF;
    /**
     * Returns classical orbital elements at the given time.
     *
     * Classical (Keplerian) elements define the orbit shape and orientation:
     * - Semi-major axis (a), Eccentricity (e), Inclination (i)
     * - Right Ascension of Ascending Node (Ω), Argument of Perigee (ω)
     * - True/Mean Anomaly (ν/M)
     *
     * @param date - The time to calculate for (defaults to now)
     * @returns Classical orbital elements
     */
    abstract toClassicalElements(date?: Date): ClassicalElements;
    /**
     * Creates a deep copy of this object.
     * @param options - Optional clone options (implementation-specific)
     */
    abstract clone(options?: Record<string, unknown>): SpaceObject;
    /**
     * Adds a sensor to this space object.
     * @param sensor - The sensor to add
     */
    addSensor(sensor: SensorInterface): void;
    /**
     * Removes a sensor from this space object.
     * @param sensorId - The ID of the sensor to remove
     */
    removeSensor(sensorId: number): void;
    /**
     * Adds a communication device to this space object.
     * @param device - The device to add
     */
    addCommDevice(device: CommunicationDeviceInterface): void;
    /**
     * Removes a communication device from this space object.
     * @param deviceId - The ID of the device to remove
     */
    removeCommDevice(deviceId: number): void;
    /**
     * Space objects are satellites by default.
     */
    isSatellite(): boolean;
    /**
     * Space objects are never static.
     */
    isStatic(): boolean;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Options for the Satellite.clone() method.
 */
interface SatelliteCloneOptions {
    /** If true, clone history entries. If false (default), start with empty history but same config. */
    cloneHistory?: boolean;
}
/**
 * Represents a satellite object with orbital information and methods for
 * calculating its position and other properties.
 */
declare class Satellite extends SpaceObject {
    apogee: Kilometers;
    argOfPerigee: Degrees;
    bstar: number;
    eccentricity: number;
    epochDay: number;
    epochYear: number;
    inclination: Degrees;
    intlDes: string;
    meanAnomaly: Degrees;
    meanMoDev1: number;
    meanMoDev2: number;
    meanMotion: number;
    options: OptionsParams;
    perigee: Kilometers;
    period: Minutes;
    rightAscension: Degrees;
    satrec: SatelliteRecord;
    /** The canonical satellite catalog number. May be a 5-digit numeric, alpha-5,
     * 6-digit numeric, or an extended (7+ digit) ID such as CelesTrak supplemental
     * 9-digit IDs. */
    sccNum: string;
    /** The 5-character alpha-5 representation, or `null` when {@link sccNum} is
     * an extended ID that exceeds the alpha-5 capacity (max numeric value 339 999). */
    sccNum5: string | null;
    /** The 6-digit numeric representation, or `null` when {@link sccNum} is
     * an extended ID that exceeds the alpha-5 capacity (max numeric value 339 999). */
    sccNum6: string | null;
    tle1: TleLine1;
    tle2: TleLine2;
    /** The semi-major axis of the satellite's orbit. */
    semiMajorAxis: Kilometers;
    /** The semi-minor axis of the satellite's orbit. */
    semiMinorAxis: Kilometers;
    /** Launch date (ISO string or human-readable) */
    launchDate: string;
    /** Launch mass in kg */
    launchMass: string;
    /** Launch site name/code */
    launchSite: string;
    /** Launch pad identifier */
    launchPad: string;
    /** Launch vehicle name */
    launchVehicle: string;
    /** Satellite bus/platform */
    bus: string;
    /** Satellite configuration */
    configuration: string;
    /** Dry mass in kg */
    dryMass: string;
    /** Equipment list */
    equipment: string;
    /** Expected lifetime */
    lifetime: string | number;
    /** Maneuver capability */
    maneuver: string;
    /** Manufacturer name */
    manufacturer: string;
    /** Propulsion motor */
    motor: string;
    /** Payload description */
    payload: string;
    /** Power system description */
    power: string;
    /** Primary purpose/mission type */
    purpose: string;
    /** Physical shape */
    shape: string;
    /** Solar panel span */
    span: string;
    /** Length in meters */
    length: string;
    /** Diameter in meters */
    diameter: string;
    /** Mission name */
    mission: string;
    /** Operating user/agency */
    user: string;
    /** Owner organization */
    owner: string;
    /** Country of origin/registration */
    country: string;
    /** Catalog source (e.g., VIMPEL) */
    source: string;
    /** Alternate catalog ID */
    altId: string;
    /** Alternate name */
    altName: string;
    /** Visual magnitude */
    vmag: number | null;
    /** Radar cross-section */
    rcs: number | null;
    /** Operational status */
    status: PayloadStatus;
    constructor(info: SatelliteParams, options?: OptionsParams);
    /**
     * Initializes detailed properties from params.
     */
    private initDetailedProperties_;
    /**
     * Zeroes out the SCC number in TLE for VIMPEL sources.
     */
    private static setSccNumTo0_;
    /**
     * Creates a Satellite from TLE lines.
     * @param tle1 - First line of TLE
     * @param tle2 - Second line of TLE
     * @param name - Optional satellite name
     */
    static fromTLE(tle1: TleLine1, tle2: TleLine2, name?: string): Satellite;
    /**
     * Creates a Satellite from a Tle object.
     * @param tle - The Tle object
     * @param name - Optional satellite name (overrides TLE name)
     */
    static fromTle(tle: Tle, name?: string): Satellite;
    /**
     * Creates a Satellite from an OMM (Orbit Mean-elements Message) data object.
     * @param omm - The OMM data in flat format
     * @param name - Optional satellite name (overrides OMM OBJECT_NAME)
     */
    static fromOmm(omm: OmmDataFormat, name?: string): Satellite;
    /**
     * Converts an OMM international designator (e.g. `"2026-114A"`) to the
     * TLE intl-des column format (cols 10-17, e.g. `"26114A"`). Inputs that
     * don't match the OMM `YYYY-NNNL...` pattern pass through unchanged.
     */
    private static ommObjectIdToTleIntlDes_;
    /**
     * Normalizes {@link sccNum} to the display-canonical numeric form and derives
     * {@link sccNum5} and {@link sccNum6}. The class invariant is that
     * `Satellite.sccNum` is always numeric — never an alpha-5 string. Alpha-5
     * inputs ("T0001") are converted to their 6-digit numeric equivalent
     * ("270001"); the alpha-5 form is preserved on {@link sccNum5}.
     *
     * Extended (7+ digit) IDs that exceed the alpha-5 capacity (max 339 999)
     * leave sccNum5/sccNum6 set to `null`.
     *
     * Invalid input (empty string, malformed token) is passed through unchanged
     * so callers can store placeholder sccNums on notional / debris stubs.
     */
    private assignAlpha5Forms_;
    private parseTleAndUpdateOrbit_;
    private parseOmmAndUpdateOrbit_;
    /**
     * Checks if the object is a satellite.
     * @returns True if the object is a satellite, false otherwise.
     */
    isSatellite(): boolean;
    /**
     * Returns whether the satellite is static or not.
     * @returns True if the satellite is static, false otherwise.
     */
    isStatic(): boolean;
    /**
     * Checks if the given SatelliteRecord object is valid by checking if its properties are all numbers.
     * @param satrec - The SatelliteRecord object to check.
     * @returns True if the SatelliteRecord object is valid, false otherwise.
     */
    static isValidSatrec(satrec: SatelliteRecord): boolean;
    ageOfElset(nowInput?: Date, outputUnits?: 'days' | 'hours' | 'minutes' | 'seconds'): number;
    editTle(tle1: TleLine1, tle2: TleLine2, sccNum?: string): void;
    /**
     * Converts the satellite object to a TLE (Two-Line Element) object.
     * @returns The TLE object representing the satellite.
     */
    toTle(): Tle;
    /**
     * Calculates the azimuth angle of the satellite relative to the given sensor at the specified date. If no date is
     * provided, the current time of the satellite is used.
     * @variation optimized
     * @param observer - The observer's position on the ground.
     * @param date - The date at which to calculate the azimuth angle. Optional, defaults to the current date.
     * @returns The azimuth angle of the satellite relative to the given sensor at the specified date.
     */
    az(observer: GroundObject, date?: Date): Degrees | null;
    /**
     * Calculates the RAE (Range, Azimuth, Elevation) values for a given sensor and date. If no date is provided, the
     * current time is used.
     * @variation expanded
     * @param observer - The observer's position on the ground.
     * @param date - The date at which to calculate the RAE values. Optional, defaults to the current date.
     * @returns The RAE values for the given sensor and date.
     */
    toRae(observer: GroundObject, date?: Date): RAE | null;
    /**
     * Calculates position in the ECEF (Earth-Centered Earth-Fixed) frame at a given time.
     *
     * **Coordinate Frame: ECEF (pseudo-ITRF)**
     *
     * Returns Earth-fixed coordinates that rotate with the Earth. The transformation
     * from TEME to ECEF uses a simplified rotation based on GMST (Greenwich Mean Sidereal Time).
     *
     * For higher precision Earth-fixed coordinates that account for precession, nutation,
     * and polar motion, use `toITRF()` instead.
     *
     * @variation optimized
     * @param date - The date at which to calculate the ECEF position. Optional, defaults to the current date.
     * @returns The ECEF position at the specified date, or null if propagation fails.
     */
    ecef(date?: Date): EcefVec3<Kilometers> | null;
    /**
     * Calculates position and velocity in the TEME (True Equator Mean Equinox) frame at a given time.
     *
     * **Coordinate Frame: TEME**
     *
     * TEME is the native output frame of SGP4/SDP4 propagation. It uses the true equator of date
     * and a mean equinox that accounts for precession but uses a simplified nutation model.
     *
     * **When to use TEME vs J2000:**
     * - Use TEME (`eci()`) for quick calculations, visualization, and when frame accuracy isn't critical
     * - Use J2000 (`toJ2000()`) for precise calculations, force modeling, and interoperability with
     *   other systems that expect J2000 coordinates
     *
     * To convert to other frames:
     * - J2000: Use `toJ2000()` method
     * - ITRF/ECEF: Use `toITRF()` or `ecef()` methods
     * - Geodetic: Use `lla()` or `toGeodetic()` methods
     *
     * @variation optimized
     * @param date - The date at which to calculate the position. Optional, defaults to the current date.
     * @param j - Julian date. Optional, defaults to null.
     * @param gmst - Greenwich Mean Sidereal Time. Optional, defaults to null.
     * @example
     * ```typescript
     * import { Satellite, Tle } from 'ootk';
     *
     * const tle = new Tle(
     *   '1 25544U 98067A   24001.50000000  .00016717  00000-0  10270-3 0  9002',
     *   '2 25544  51.6400 208.9163 0006730 358.5720 122.3372 15.50104550 10001'
     * );
     * const satellite = new Satellite({ tle });
     *
     * // Get current position in TEME frame
     * const pv = satellite.eci();
     * if (pv) {
     *   console.log(`Position: ${pv.position.x.toFixed(2)}, ${pv.position.y.toFixed(2)}, ${pv.position.z.toFixed(2)} km`);
     *   console.log(`Velocity: ${pv.velocity.x.toFixed(4)} km/s`);
     * }
     *
     * // For J2000 frame, use toJ2000() instead
     * const j2000 = satellite.toJ2000();
     * ```
     * @returns Position and velocity in TEME frame, or null if propagation fails.
     */
    eci(date?: Date, j?: number, gmst?: GreenwichMeanSiderealTime): PosVel | null;
    /**
     * Calculates the position and velocity in the J2000 (EME2000) frame at a given time.
     *
     * **Coordinate Frame: J2000**
     *
     * J2000 (also called EME2000) is an Earth-Centered Inertial (ECI) frame defined by:
     * - Origin: Earth's center of mass
     * - X-axis: Mean vernal equinox at J2000.0 epoch (Jan 1, 2000 12:00 TT)
     * - Z-axis: Earth's mean rotation axis at J2000.0
     * - Y-axis: Completes right-handed system
     *
     * This is the standard ECI frame for precise calculations and interoperability.
     *
     * **Internally:** SGP4 outputs TEME, which is then converted to J2000 via precession
     * and nutation transformations.
     *
     * @variation expanded
     * @param date - The date for which to calculate the J2000 coordinates, defaults to the current date.
     * @returns The J2000 state vector (position and velocity).
     * @throws Error if propagation fails.
     */
    toJ2000(date?: Date): J2000;
    /**
     * Returns the elevation angle of the satellite as seen by the given sensor at the specified time.
     * @variation optimized
     * @param observer - The observer's position on the ground.
     * @param date - The date at which to calculate the elevation angle. Optional, defaults to the current date.
     * @returns The elevation angle of the satellite as seen by the given sensor at the specified time.
     */
    el(observer: GroundObject, date?: Date): Degrees | null;
    /**
     * Calculates LLA position at a given time.
     * @variation optimized
     * @param date - The date at which to calculate the LLA position. Optional, defaults to the current date.
     * @param j - Julian date. Optional, defaults to null.
     * @param gmst - Greenwich Mean Sidereal Time. Optional, defaults to null.
     * @returns The LLA position at the specified date.
     */
    lla(date?: Date, j?: number, gmst?: GreenwichMeanSiderealTime): LlaVec3<Degrees, Kilometers> | null;
    /**
     * Converts the satellite's position to geodetic coordinates.
     * @variation expanded
     * @param date The date for which to calculate the geodetic coordinates. Defaults to the current date.
     * @returns The geodetic coordinates of the satellite.
     */
    toGeodetic(date?: Date): Geodetic;
    /**
     * Converts the satellite's position to the ITRF (International Terrestrial Reference Frame) at the specified date.
     *
     * **Coordinate Frame: ITRF (Earth-Fixed)**
     *
     * ITRF is the standard Earth-fixed geocentric reference frame. Unlike the simplified ECEF
     * transformation in `ecef()`, this method performs the full transformation chain:
     * TEME → J2000 → ITRF, accounting for precession, nutation, and Earth rotation.
     *
     * Use ITRF when you need:
     * - Precise Earth-fixed coordinates
     * - Interoperability with GPS/GNSS systems
     * - Accurate ground track calculations
     *
     * @variation expanded
     * @param date The date for which to convert the position. Defaults to the current date.
     * @returns The satellite's position in the ITRF at the specified date.
     */
    toITRF(date?: Date): ITRF;
    /**
     * Converts the current satellite's position to the Reference-Inertial-Celestial (RIC) frame
     * relative to the specified reference satellite at the given date.
     * @variation expanded
     * @param reference The reference satellite.
     * @param date The date for which to calculate the RIC frame. Defaults to the current date.
     * @returns The RIC frame representing the current satellite's position relative to the reference satellite.
     */
    toRIC(reference: Satellite, date?: Date): RIC;
    /**
     * Converts the satellite's position to classical orbital elements.
     * @param date The date for which to calculate the classical elements. Defaults to the current date.
     * @returns The classical orbital elements of the satellite.
     */
    toClassicalElements(date?: Date): ClassicalElements;
    /**
     * Calculates the RAE (Range, Azimuth, Elevation) vector for a given sensor and time.
     * @variation optimized
     * @param observer - The observer's position on the ground.
     * @param date - The date at which to calculate the RAE vector. Optional, defaults to the current date.
     * @param j - Julian date. Optional, defaults to null.
     * @param gmst - Greenwich Mean Sidereal Time. Optional, defaults to null.
     * @example
     * ```typescript
     * import { Satellite, GroundObject, Tle, Degrees, Kilometers } from 'ootk';
     *
     * const tle = new Tle(line1, line2);
     * const satellite = new Satellite({ tle });
     *
     * // Define ground observer
     * const observer = new GroundObject({
     *   lat: 40.0 as Degrees,
     *   lon: -75.0 as Degrees,
     *   alt: 0.1 as Kilometers,
     * });
     *
     * // Get look angles
     * const rae = satellite.rae(observer);
     * if (rae) {
     *   console.log(`Range: ${rae.rng.toFixed(1)} km`);
     *   console.log(`Azimuth: ${rae.az.toFixed(2)}°`);
     *   console.log(`Elevation: ${rae.el.toFixed(2)}°`);
     *
     *   // Check if above horizon
     *   if (rae.el > 0) {
     *     console.log('Satellite is visible!');
     *   }
     * }
     * ```
     * @returns The RAE vector for the given sensor and time.
     */
    rae(observer: GroundObject, date?: Date, j?: number, gmst?: GreenwichMeanSiderealTime): RaeVec3<Kilometers, Degrees> | null;
    /**
     * Returns the range of the satellite from the given sensor at the specified time.
     * @variation optimized
     * @param observer - The observer's position on the ground.
     * @param date - The date at which to calculate the range. Optional, defaults to the current date.
     * @returns The range of the satellite from the given sensor at the specified time.
     */
    rng(observer: GroundObject, date?: Date): Kilometers | null;
    /**
     * Applies the Doppler effect to the given frequency based on the observer's position and the date.
     * @param freq - The frequency to apply the Doppler effect to.
     * @param observer - The observer's position on the ground.
     * @param date - The date at which to calculate the Doppler effect. Optional, defaults to the current date.
     * @returns The frequency after applying the Doppler effect.
     */
    applyDoppler(freq: number, observer: GroundObject, date?: Date): number | null;
    /**
     * Calculates the Doppler factor for the satellite.
     * @param observer The observer's ground position.
     * @param date The optional date for which to calculate the Doppler factor. If not provided, the current date is used.
     * @returns The calculated Doppler factor.
     */
    dopplerFactor(observer: GroundObject, date?: Date): number | null;
    /**
     * Returns the launch details of the satellite.
     * @returns An object containing the launch date, launch mass, launch site, launch pad, and launch vehicle.
     */
    getLaunchDetails(): LaunchDetails;
    /**
     * Returns the operations details of the satellite.
     * @returns An object containing the user, mission, owner, and country details.
     */
    getOperationsDetails(): OperationsDetails;
    /**
     * Returns the spacecraft details.
     * @returns An object containing spacecraft configuration and physical details.
     */
    getSpaceCraftDetails(): SpaceCraftDetails;
    /**
     * Creates a deep copy of this satellite.
     *
     * By default, history configuration is preserved but starts empty.
     * Pass `{ cloneHistory: true }` to also clone the history entries.
     *
     * Sensors and communication devices are deep cloned with their
     * parent references updated to point to the cloned satellite.
     *
     * @param options - Clone options
     * @returns A new Satellite instance
     */
    clone(options?: SatelliteCloneOptions): Satellite;
    /**
     * Returns type-specific serialization data.
     */
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Calculates ECI positions along the satellite's current orbit.
     *
     * @param startDate - The start date for the orbit calculation.
     * @param points - Number of points to calculate (default: 180).
     * @param orbits - Number of orbits to calculate (default: 1).
     * @returns Array of ECI position vectors.
     * @example
     * ```typescript
     * const orbitPoints = satellite.getOrbitPointsEci(new Date(), 360);
     * orbitPoints.forEach(pt => console.log(`${pt.x}, ${pt.y}, ${pt.z}`));
     * ```
     */
    getOrbitPointsEci(startDate?: Date, points?: number, orbits?: number): Vector3D<Kilometers>[];
    /**
     * Calculates ECEF positions along the satellite's current orbit.
     *
     * @param startDate - The start date for the orbit calculation.
     * @param points - Number of points to calculate (default: 180).
     * @param orbits - Number of orbits to calculate (default: 1).
     * @returns Array of ECEF position vectors.
     */
    getOrbitPointsEcef(startDate?: Date, points?: number, orbits?: number): Vector3D<Kilometers>[];
    /**
     * Calculates LLA positions along the satellite's current orbit.
     *
     * @param startDate - The start date for the orbit calculation.
     * @param points - Number of points to calculate (default: 180).
     * @param orbits - Number of orbits to calculate (default: 1).
     * @returns Array of LLA positions with timestamps.
     * @example
     * ```typescript
     * const groundTrack = satellite.getOrbitPointsLla(new Date(), 360);
     * groundTrack.forEach(pt => console.log(`${pt.lat}°, ${pt.lon}° at ${pt.time}`));
     * ```
     */
    getOrbitPointsLla(startDate?: Date, points?: number, orbits?: number): {
        lat: Degrees;
        lon: Degrees;
        alt: Kilometers;
        time: Date;
    }[];
    /**
     * Calculates RIC (Radial, In-track, Cross-track) positions relative to another satellite along the orbit.
     *
     * @param reference - The reference satellite for RIC calculations.
     * @param startDate - The start date for the orbit calculation.
     * @param points - Number of points to calculate (default: 180).
     * @param orbits - Number of orbits to calculate (default: 1).
     * @returns Array of RIC state vectors.
     * @example
     * ```typescript
     * const relativeOrbit = sat1.getOrbitPointsRic(sat2, new Date(), 360);
     * relativeOrbit.forEach(ric => console.log(`R: ${ric.position.x}, I: ${ric.position.y}, C: ${ric.position.z}`));
     * ```
     */
    getOrbitPointsRic(reference: Satellite, startDate?: Date, points?: number, orbits?: number): RIC[];
    /**
     * Determines if the satellite is moving northward or southward.
     * @param date - The date at which to calculate the direction.
     * @returns 'N' for northward, 'S' for southward.
     * @throws Error if direction cannot be determined.
     * @example
     * ```typescript
     * const direction = satellite.getDirection(new Date());
     * console.log(`Satellite is moving ${direction === 'N' ? 'North' : 'South'}`);
     * ```
     */
    getDirection(date?: Date): 'N' | 'S';
    /**
     * Calculates the nodal precession rate of the satellite's orbit.
     *
     * The nodal precession is caused by Earth's oblateness (J2 effect) and causes
     * the orbital plane to rotate around Earth's axis over time.
     *
     * @returns The nodal precession rate in degrees per day.
     * @example
     * ```typescript
     * const rate = satellite.getNodalPrecessionRate();
     * console.log(`RAAN precesses at ${rate.toFixed(4)} deg/day`);
     * ```
     */
    getNodalPrecessionRate(): DegreesPerDay;
    /**
     * Calculates the normalized RAAN (Right Ascension of Ascending Node) accounting for nodal precession.
     *
     * This adjusts the RAAN from the TLE epoch to the specified date by applying
     * the precession rate over the elapsed time.
     *
     * @param date - The date for which to calculate the normalized RAAN.
     * @returns The normalized RAAN in degrees (0-360 range).
     * @example
     * ```typescript
     * const raan = satellite.normalizeRaan(new Date());
     * console.log(`Current RAAN: ${raan.toFixed(2)}°`);
     * ```
     */
    normalizeRaan(date?: Date): Degrees;
    /**
     * Calculates the angular separation between this satellite and another.
     *
     * Returns the azimuth and elevation angles of the relative position vector
     * in the orbital plane reference frame.
     *
     * @param other - The other satellite.
     * @param date - The date for the calculation.
     * @returns Object containing azimuth and elevation angles in degrees.
     * @throws Error if positions are undefined.
     * @example
     * ```typescript
     * const angle = sat1.angleTo(sat2, new Date());
     * console.log(`Az: ${angle.az.toFixed(2)}°, El: ${angle.el.toFixed(2)}°`);
     * ```
     */
    angleTo(other: Satellite, date?: Date): {
        az: Degrees;
        el: Degrees;
    };
    /**
     * Calculates the angle between this satellite, another satellite, and the Sun.
     *
     * Returns the angle at this satellite between the vector to the other satellite
     * and the vector to the Sun.
     *
     * @param other - The other satellite.
     * @param sunPosition - The Sun's ECI position vector.
     * @param date - The date for the calculation.
     * @returns The angle in radians.
     * @throws Error if positions are undefined.
     */
    sunAngleTo(other: Satellite, sunPosition: Vector3D<Kilometers>, date?: Date): Radians;
    /**
     * Determines the illumination status of the satellite (sunlit, penumbra, or umbra).
     *
     * Uses the Sun's lighting ratio to determine if the satellite is in Earth's shadow.
     *
     * @param date - The date for the calculation.
     * @returns The sun status (UMBRAL, PENUMBRAL, SUN, or UNKNOWN).
     * @example
     * ```typescript
     * const status = satellite.getSunStatus(new Date());
     * if (status === SunStatus.SUN) {
     *   console.log('Satellite is sunlit');
     * } else if (status === SunStatus.UMBRAL) {
     *   console.log('Satellite is in full eclipse');
     * }
     * ```
     */
    getSunStatus(date?: Date): SunStatus;
    /**
     * Result of closest approach calculation.
     */
    /**
     * Finds the closest approach between this satellite and another within a search window.
     *
     * Searches through the specified duration to find the minimum distance between
     * the two satellites using RIC (Radial, In-track, Cross-track) coordinates.
     *
     * @param other - The other satellite.
     * @param startDate - The start date for the search.
     * @param duration - Search duration in seconds (default: 86400 = 1 day).
     * @param stepSize - Time step in seconds (default: 1).
     * @returns Object containing offset, distance, RIC state, and date of closest approach.
     * @throws Error if no valid approach found.
     * @example
     * ```typescript
     * const result = sat1.findClosestApproach(sat2, new Date(), 86400);
     * console.log(`Closest: ${result.distance.toFixed(2)} km at ${result.date}`);
     * console.log(`RIC: R=${result.ric.position.x}, I=${result.ric.position.y}, C=${result.ric.position.z}`);
     * ```
     */
    findClosestApproach(other: Satellite, startDate?: Date, duration?: number, stepSize?: number): {
        offset: number;
        distance: Kilometers;
        ric: RIC;
        date: Date;
    };
    /**
     * Creates a Propagator instance initialized from this satellite's state at the given date.
     *
     * Returns a fully-featured Propagator with the complete API including propagate(),
     * ephemeris(), maneuver(), checkpoint/restore, and orbital event finding.
     *
     * @param date - The date to initialize the propagator state. Defaults to current date.
     * @param options - Propagator configuration options.
     * @returns A Propagator instance.
     * @example
     * ```typescript
     * // Quick default (RK89 with point-mass gravity)
     * const prop = satellite.createPropagator();
     * const futureState = prop.propagate(futureEpoch);
     *
     * // Full customization
     * const forceModel = new ForceModel()
     *   .setGravity()
     *   .setThirdBodyGravity({ moon: true, sun: true });
     *
     * const prop = satellite.createPropagator(new Date(), {
     *   type: PropagatorType.DP54,
     *   forceModel,
     *   tolerance: 1e-12,
     * });
     *
     * const ephemeris = prop.ephemeris(start, stop, 60 as Seconds);
     * ```
     */
    createPropagator(date?: Date, options?: NumericalPropagatorOptions): Propagator;
    /**
     * Creates an Sgp4Propagator from this satellite's TLE.
     *
     * @returns An Sgp4Propagator instance.
     * @example
     * ```typescript
     * const prop = satellite.createSgp4Propagator();
     * const state = prop.propagate(futureEpoch);
     * ```
     */
    createSgp4Propagator(): Sgp4Propagator;
    /**
     * Creates a high-accuracy numerical propagator (RK89) from this satellite's state.
     *
     * For other propagator types or RK4, use `createPropagator()` with options.
     *
     * @param date - The date to initialize the propagator state. Defaults to current date.
     * @param forceModel - The force model. Defaults to point-mass gravity.
     * @param tolerance - Adaptive step tolerance. Defaults to 1e-9.
     * @returns A RungeKutta89Propagator instance.
     * @example
     * ```typescript
     * const fm = new ForceModel()
     *   .setGravity()
     *   .setThirdBodyGravity({ moon: true, sun: true })
     *   .setSolarRadiationPressure(500, 10, 1.2);
     *
     * const prop = satellite.createNumericalPropagator(new Date(), fm);
     * const state = prop.propagate(futureEpoch);
     * ```
     */
    createNumericalPropagator(date?: Date, forceModel?: ForceModel, tolerance?: number): RungeKutta89Propagator;
    /**
     * Calculates the time variables for a given date relative to the TLE epoch.
     * @param date Date to calculate
     * @param satrec Satellite orbital information
     * @param j Julian date
     * @param gmst Greenwich Mean Sidereal Time
     * @returns Time variables
     */
    private static calculateTimeVariables_;
    /** Single-entry memo for calculateTimeVariables_, keyed on Date.getTime() */
    private static timeVariablesCacheMs_;
    private static timeVariablesCacheJ_;
    private static timeVariablesCacheGmst_;
}

/**
 * Improved error handling for SGP4
 */
declare enum Sgp4ErrorCode {
    NO_ERROR = 0,
    MEAN_ELEMENTS_INVALID = 1,// ecc >= 1.0 or ecc < -0.001 or a < 0.95 er
    MEAN_MOTION_NEGATIVE = 2,// mean motion less than 0.0
    PERT_ELEMENTS_INVALID = 3,// pert elements, ecc < 0.0 or ecc > 1.0
    SEMI_LATUS_RECTUM_NEGATIVE = 4,// semi-latus rectum < 0.0
    EPOCH_ELEMENTS_SUBORBITAL = 5,// epoch elements are sub-orbital
    SATELLITE_DECAYED = 6
}
declare class Sgp4Error extends Error {
    code: Sgp4ErrorCode;
    constructor(code: Sgp4ErrorCode, message?: string);
    static getDefaultMessage(code: Sgp4ErrorCode): string;
}
interface Sgp4Result<T> {
    success: boolean;
    value?: T;
    error?: Sgp4Error;
}

/**
 * @author @thkruz Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Represents a distinct type.
 *
 * This type is used to create new types based on existing ones, but with a
 * unique identifier. This can be useful for creating types that are
 * semantically different but structurally the same.
 * @template T The base type from which the distinct type is created.
 * @template DistinctName A unique identifier for the distinct type.
 * __TYPE__ A property that holds the unique identifier for the
 * distinct type.
 */
type Distinct<T, DistinctName> = T & {
    __TYPE__: DistinctName;
};
/**
 * Represents a quantity of days.
 */
type Days = Distinct<number, 'Days'>;
/**
 * Represents a quantity of hours.
 *
 * This type is based on the number type, but is distinct and cannot be used
 * interchangeably with other number-based types.
 */
type Hours = Distinct<number, 'Hours'>;
/**
 * Represents a quantity of minutes.
 */
type Minutes = Distinct<number, 'Minutes'>;
/**
 * Represents a quantity of seconds.
 */
type Seconds = Distinct<number, 'Seconds'>;
/**
 * Represents a quantity of milliseconds.
 */
type Milliseconds = Distinct<number, 'Milliseconds'>;
/**
 * Represents a quantity of degrees.
 */
type Degrees = Distinct<number, 'Degrees'>;
/**
 * Represents a quantity of radians.
 */
type Radians = Distinct<number, 'Radians'>;
/**
 * Represents a quantity of kilometers.
 */
type Kilometers = Distinct<number, 'Kilometers'>;
/**
 * Represents a quantity of meters.
 */
type Meters = Distinct<number, 'Meters'>;
/**
 * Represents the type for seconds per meter per second.
 */
type SecondsPerMeterPerSecond = Distinct<number, 'SecondsPerMeterPerSecond'>;
/**
 * Represents a value in kilometers per second.
 */
type KilometersPerSecond = Distinct<number, 'KilometersPerSecond'>;
/**
 * Represents a value in Radians per second.
 */
type RadiansPerSecond = Distinct<number, 'RadiansPerSecond'>;
/**
 * Represents a value in degrees per second.
 */
type DegreesPerSecond = Distinct<number, 'DegreesPerSecond'>;
/**
 * Represents a value in degrees per day.
 */
type DegreesPerDay = Distinct<number, 'DegreesPerDay'>;
/**
 * Represents a value in meters per second.
 */
type MetersPerSecond = Distinct<number, 'MetersPerSecond'>;
/**
 * Reference frame type for coordinate systems.
 * This is a phantom type - it exists only at compile time for type safety.
 *
 * - TEME: True Equator Mean Equinox (SGP4 output frame)
 * - J2000: J2000 Earth-Centered Inertial (mean equator and equinox of J2000.0)
 * - GCRF: Geocentric Celestial Reference Frame (ICRF aligned)
 * - ITRF: International Terrestrial Reference Frame (Earth-fixed)
 */
type ReferenceFrame = 'TEME' | 'J2000' | 'GCRF' | 'ITRF';
/**
 * Represents a three-dimensional vector.
 *
 * This type is used to represent a point in space in terms of x, y, and z
 * coordinates. It is a generic type that allows for flexibility in the units of
 * measure used for each dimension. The default unit of measure is Kilometers.
 * @template Units The unit of measure used for the dimensions. This is
 * typically a type representing a distance, such as kilometers or meters. The
 * default is Kilometers.
 * @template Frame The reference frame for the coordinates. This is a phantom type
 * that exists only at compile time for type safety. Defaults to 'TEME' since
 * SGP4 outputs TEME coordinates.
 * x The x dimension of the vector, representing the distance from the
 * origin to the point in the x direction.
 * y The y dimension of the vector, representing the distance from the
 * origin to the point in the y direction. @property z The z dimension of the
 * vector, representing the distance from the origin to the point in the z
 * direction.
 */
type Vec3<Units = Kilometers, Frame extends ReferenceFrame = 'TEME'> = {
    x: Units;
    y: Units;
    z: Units;
    /** Phantom type for reference frame - not present at runtime */
    readonly __frame?: Frame;
};
/**
 * TEME (True Equator Mean Equinox) frame vector.
 * This is the native output frame of SGP4/SDP4 propagation.
 */
type TemeVec3<Units = Kilometers> = Vec3<Units, 'TEME'>;
/**
 * J2000 frame vector (Mean equator and equinox of J2000.0).
 */
type J2000Vec3<Units = Kilometers> = Vec3<Units, 'J2000'>;
/**
 * GCRF (Geocentric Celestial Reference Frame) vector.
 * This is aligned with the ICRF (International Celestial Reference Frame).
 */
type GcrfVec3<Units = Kilometers> = Vec3<Units, 'GCRF'>;
/**
 * ITRF (International Terrestrial Reference Frame) vector.
 * This is an Earth-fixed frame that rotates with the Earth.
 */
type ItrfVec3<Units = Kilometers> = Vec3<Units, 'ITRF'>;
/**
 * Represents a three-dimensional vector in Earth-Centered Earth Fixed (ECEF)
 * coordinates.
 *
 * NOTE: ECF (Earth-Centered Fixed) and ECEF (Earth-Centered, Earth-Fixed) are
 * essentially the same thing. Both refer to a coordinate system that is fixed
 * with respect to the Earth, meaning that the coordinates of a point in this
 * system do not change even as the Earth rotates.
 *
 * This type is used to represent a point in space in terms of x, y, and z
 * coordinates. It is a generic type that allows for flexibility in the units of
 * measure used for each dimension. The default unit of measure is Kilometers.
 */
type EcefVec3<Units = Kilometers> = Vec3<Units>;
/**
 * Represents a three-dimensional vector in East, North, Up (ENU) coordinates.
 *
 * East–west tangent to parallels, North–south tangent to meridians, and Up–down
 * in the direction normal to the oblate spheroid used as Earth's ellipsoid,
 * which does not generally pass through the center of Earth.
 *
 * In many targeting and tracking applications the local East, North, Up (ENU)
 * Cartesian coordinate system is far more intuitive and practical than ECEF or
 * Geodetic coordinates. The local ENU coordinates are formed from a plane
 * tangent to the Earth's surface fixed to a specific location and hence it is
 * sometimes known as a "Local Tangent" or "local geodetic" plane. By convention
 * the east axis is labeled x, the north y, and the up z.
 * @see https://en.wikipedia.org/wiki/Local_tangent_plane_coordinates
 * @template Units The unit of measure used for the dimensions. This is
 * typically a type representing a distance, such as kilometers or meters. The
 * default is Kilometers.
 * e The east dimension of the vector, representing the distance from
 * the origin to the point in the east direction.
 * n The north dimension of the vector, representing the distance from
 * the origin to the point in the north direction. @property u The up dimension
 * of the vector, representing the distance from the origin to the point in the
 * upward direction.
 */
type EnuVec3<Units = Kilometers> = Vec3<Units>;
/**
 * Represents a three-dimensional vector in geographical coordinates.
 *
 * This type is used to represent a point in space in terms of latitude,
 * longitude, and altitude. It is a generic type that allows for flexibility in
 * the units of measure used for each dimension.
 * @template A The unit of measure used for the latitude and longitude
 * dimensions. This is typically a type representing an angle, such as degrees
 * or radians. The default is Radians.
 * @template D The unit of measure used for the altitude dimension. This is
 * typically a type representing a distance, such as kilometers or meters. The
 * default is Kilometers.
 */
type LlaVec3<A = Degrees, D = Kilometers> = {
    lat: A;
    lon: A;
    alt: D;
};
/**
 * Represents a three-dimensional vector in Range, Azimuth, and Elevation (RAE)
 * coordinates.
 *
 * This type is used to represent a point in space in terms of range, azimuth,
 * and elevation. It is a generic type that allows for flexibility in the units
 * of measure used for each dimension.
 * @template DistanceUnit The unit of measure used for the altitude dimension.
 * This is typically a type representing a distance, such as kilometers or
 * meters. The default is Kilometers.
 * @template AngleUnit The unit of measure used for the latitude and longitude
 * dimensions. This is typically a type representing an angle, such as degrees
 * or radians. The default is Radians.
 * rng The range dimension of the vector, representing the distance
 * from the origin to the point.
 * az The azimuth dimension of the vector, representing the angle in
 * the horizontal plane from a reference direction. @property el The elevation
 * dimension of the vector, representing the angle from the horizontal plane to
 * the point.
 */
type RaeVec3<DistanceUnit = Kilometers, AngleUnit = Degrees> = {
    rng: DistanceUnit;
    az: AngleUnit;
    el: AngleUnit;
};
/**
 * Represents a three-dimensional vector in South, East, and Zenith (SEZ)
 * coordinates.
 *
 * This type is used to represent a point in space in terms of south, east, and
 * zenith. It is a generic type that allows for flexibility in the units of
 * measure used for each dimension.
 * s The south dimension of the vector
 * e The east dimension of the vector @property z The zenith dimension
 * of the vector
 */
type SezVec3<D = Kilometers> = {
    s: D;
    e: D;
    z: D;
};
/**
 * SatelliteRecord contains all of the orbital parameters necessary for running SGP4. It is generated by Sgp4.
 */
interface SatelliteRecord {
    Om: number;
    PInco: number;
    a: number;
    alta: number;
    altp: number;
    am: number;
    argpdot: number;
    argpo: number;
    atime: number;
    aycof: number;
    bstar: number;
    cc1: number;
    cc4: number;
    cc5: number;
    con41: number;
    d2: number;
    d2201: number;
    d2211: number;
    d3: number;
    d3210: number;
    d3222: number;
    d4: number;
    d4410: number;
    d4422: number;
    d5220: number;
    d5232: number;
    d5421: number;
    d5433: number;
    dedt: number;
    del1: number;
    del2: number;
    del3: number;
    delmo: number;
    didt: number;
    dmdt: number;
    dnodt: number;
    domdt: number;
    e3: number;
    ecco: number;
    ee2: number;
    em: number;
    epochdays: number;
    epochyr: number;
    error: Sgp4ErrorCode;
    eta: number;
    gsto: number;
    im: number;
    inclo: number;
    init: boolean;
    irez: number;
    /** is imprecise flag */
    isimp: boolean;
    j2: number;
    j3: number;
    j3oj2: number;
    j4: number;
    jdsatepoch: number;
    mdot: number;
    method: string;
    mm: number;
    mo: number;
    mus: number;
    nddot: number;
    ndot: number;
    nm: number;
    no: number;
    nodecf: number;
    nodedot: number;
    nodeo: number;
    om: number;
    omgcof: number;
    operationmode: string;
    peo: number;
    pgho: number;
    pho: number;
    plo: number;
    radiusearthkm: number;
    satnum: string;
    se2: number;
    se3: number;
    sgh2: number;
    sgh3: number;
    sgh4: number;
    sh2: number;
    sh3: number;
    si2: number;
    si3: number;
    sinmao: number;
    sl2: number;
    sl3: number;
    sl4: number;
    t: number;
    t2cof: number;
    t3cof: number;
    t4cof: number;
    t5cof: number;
    tumin: number;
    vkmpersec: number;
    x1mth2: number;
    x7thm1: number;
    xfact: number;
    xgh2: number;
    xgh3: number;
    xgh4: number;
    xh2: number;
    xh3: number;
    xi2: number;
    xi3: number;
    xke: number;
    xl2: number;
    xl3: number;
    xl4: number;
    xlamo: number;
    xlcof: number;
    xli: number;
    xmcof: number;
    xni: number;
    zmol: number;
    zmos: number;
}
/**
 * The StateVector is a type that represents the output from the Sgp4.propagate
 * function. It consists of two main properties: position and velocity, each of
 * which is a three-dimensional vector.
 *
 * **IMPORTANT: Both position and velocity are in the TEME (True Equator Mean Equinox)
 * reference frame.** TEME is the native output frame of the SGP4/SDP4 propagator.
 *
 * The position and velocity vectors are represented as objects with x, y, and z
 * properties, each of which is a number. Alternatively, they can be false if
 * propagation fails.
 *
 * This type is primarily used in the context of satellite tracking and
 * prediction, where it is crucial to know both the current position and
 * velocity of a satellite.
 */
type StateVectorSgp4 = {
    /** Position in TEME (True Equator Mean Equinox) frame in kilometers */
    position: TemeVec3<Kilometers> | false;
    /** Velocity in TEME (True Equator Mean Equinox) frame in km/s */
    velocity: TemeVec3<KilometersPerSecond> | false;
};
/**
 * Position and velocity state vector.
 * @template PosUnits Unit of measure for position (default: Kilometers)
 * @template VelUnits Unit of measure for velocity (default: KilometersPerSecond)
 * @template Frame Reference frame for the coordinates (default: 'TEME')
 */
type PosVel<PosUnits = Kilometers, VelUnits = KilometersPerSecond, Frame extends ReferenceFrame = 'TEME'> = {
    position: Vec3<PosUnits, Frame>;
    velocity: Vec3<VelUnits, Frame>;
};
/**
 * A type that represents a three-dimensional vector in a flat array format.
 * This type is used in vector mathematics and physics calculations.
 *
 * It is an array of three numbers, where each number represents a coordinate in
 * 3D space:
 * - The first number represents the x-coordinate.
 * - The second number represents the y-coordinate.
 * - The third number represents the z-coordinate.
 *
 * This format is particularly useful in scenarios where you need to perform
 * operations on vectors, such as addition, subtraction, scalar multiplication,
 * dot product, and cross product.
 */
type Vec3Flat<T = number> = [T, T, T];
/**
 * A type that represents a two-line element set (TLE). A TLE is a data format
 * used to convey sets of orbital elements that describe the orbits of
 * Earth-orbiting objects. It consists of two lines of text, each of which is 69
 * characters long.
 * @see https://en.wikipedia.org/wiki/Two-line_element_set
 */
type TleLine1 = Distinct<string, 'TLE Line 1'>;
/**
 * A type that represents a two-line element set (TLE). A TLE is a data format
 * used to convey sets of orbital elements that describe the orbits of
 * Earth-orbiting objects. It consists of two lines of text, each of which is 69
 * characters long.
 * @see https://en.wikipedia.org/wiki/Two-line_element_set
 */
type TleLine2 = Distinct<string, 'TLE Line 2'>;
/**
 * The Line1Data type represents the first line of a two-line element set (TLE).
 * A TLE is a data format used to convey sets of orbital elements that describe
 * the orbits of Earth-orbiting objects.
 *
 * The properties of this type include:
 * - lineNumber1: The line number of the TLE (should be 1 for this line).
 * - satNum: The satellite number.
 * - satNumRaw: The raw string representation of the satellite number.
 * - classification: The classification of the satellite (e.g., "U" for
 * unclassified).
 * - intlDes: The international designator for the satellite.
 * - intlDesYear: The year of the international designator.
 * - intlDesLaunchNum: The launch number of the international designator.
 * - intlDesLaunchPiece: The piece of the launch of the international
 * designator.
 * - epochYear: The last two digits of the year of the epoch.
 * - epochYearFull: The full four-digit year of the epoch.
 * - epochDay: The day of the year of the epoch.
 * - meanMoDev1: The first derivative of the Mean Motion.
 * - meanMoDev2: The second derivative of the Mean Motion.
 * - bstar: The BSTAR drag term.
 * - ephemerisType: The type of ephemeris used.
 * - elsetNum: The element set number.
 * - checksum1: The checksum of the first line of the TLE.
 * @see https://en.wikipedia.org/wiki/Two-line_element_set
 */
type Line1Data = {
    lineNumber1: number;
    satNum: number;
    satNumRaw: string;
    classification: string;
    intlDes: string;
    intlDesYear: number;
    intlDesLaunchNum: number;
    intlDesLaunchPiece: string;
    epochYear: number;
    epochYearFull: number;
    epochDay: number;
    meanMoDev1: number;
    meanMoDev2: number;
    bstar: number;
    ephemerisType: number;
    elsetNum: number;
    checksum1: number;
};
/**
 * The Line2Data type represents the second line of a two-line element set
 * (TLE). A TLE is a data format used to convey sets of orbital elements that
 * describe the orbits of Earth-orbiting objects.
 *
 * The properties of this type include:
 * - lineNumber2: The line number of the TLE (should be 2 for this line).
 * - satNum: The satellite number.
 * - satNumRaw: The raw string representation of the satellite number.
 * - inclination: The inclination of the satellite's orbit.
 * - rightAscension: The Right Ascension of the Ascending Node.
 * - eccentricity: The eccentricity of the satellite's orbit.
 * - argOfPerigee: The argument of perigee.
 * - meanAnomaly: The mean anomaly of the satellite.
 * - meanMotion: The mean motion of the satellite.
 * - revNum: The revolution number at epoch.
 * - checksum2: The checksum of the second line of the TLE.
 * - period: The period of the satellite's orbit, derived from the mean motion.
 * @see https://en.wikipedia.org/wiki/Two-line_element_set
 */
type Line2Data = {
    lineNumber2: number;
    satNum: number;
    satNumRaw: string;
    inclination: Degrees;
    rightAscension: Degrees;
    eccentricity: number;
    argOfPerigee: Degrees;
    meanAnomaly: Degrees;
    meanMotion: number;
    revNum: number;
    checksum2: number;
    period: Minutes;
};
/**
 * Enum representing different types of objects.
 */
declare enum SpaceObjectType {
    UNKNOWN = 0,
    PAYLOAD = 1,
    ROCKET_BODY = 2,
    DEBRIS = 3,
    SPECIAL = 4,
    BALLISTIC_MISSILE = 8,
    STAR = 9,
    INTERGOVERNMENTAL_ORGANIZATION = 10,
    SUBORBITAL_PAYLOAD_OPERATOR = 11,
    PAYLOAD_OWNER = 12,
    METEOROLOGICAL_ROCKET_LAUNCH_AGENCY_OR_MANUFACTURER = 13,
    PAYLOAD_MANUFACTURER = 14,
    LAUNCH_AGENCY = 15,
    LAUNCH_SITE = 16,
    LAUNCH_POSITION = 17,
    LAUNCH_FACILITY = 18,
    CONTROL_FACILITY = 19,
    GROUND_SENSOR_STATION = 20,
    OPTICAL = 21,
    MECHANICAL = 22,
    PHASED_ARRAY_RADAR = 23,
    OBSERVER = 24,
    BISTATIC_RADIO_TELESCOPE = 25,
    COUNTRY = 26,
    LAUNCH_VEHICLE_MANUFACTURER = 27,
    ENGINE_MANUFACTURER = 28,
    NOTIONAL = 29,
    FRAGMENT = 30,
    SHORT_TERM_FENCE = 31,
    EPHEMERIS_SATELLITE = 32,
    TERRESTRIAL_PLANET = 33,
    GAS_GIANT = 34,
    ICE_GIANT = 35,
    DWARF_PLANET = 36,
    MOON = 37,
    DYNAMIC_GROUND_OBJECT = 38,
    MAX_SPACE_OBJECT_TYPE = 40
}
/**
 * Represents the Greenwich Mean Sidereal Time (GMST).
 *
 * GMST is a time system that is a measure of the angle, on the celestial
 * equator, from the Greenwich meridian to the meridian that passes through the
 * vernal equinox.
 */
type GreenwichMeanSiderealTime = Distinct<number, 'Greenwich Mean Sidereal Time'>;
/**
 * Represents the azimuth and elevation of an object in the sky. Azimuth and
 * elevation are the two coordinates that define the position of a celestial
 * body (sun, moon, planet, star, etc.) in the sky as observed from a specific
 * location on the Earth's surface.
 * @template Units The units in which the azimuth and elevation are expressed.
 * By default, this is radians.
 * az The azimuth of the object. This is the angle between the
 * observer's north vector and the perpendicular projection of the object onto
 * the observer's local horizon.
 * el The elevation of the object. This is the angle between the
 * object and the observer's local horizon.
 */
type AzEl<Units = Radians> = {
    az: Units;
    el: Units;
};
/**
 * Represents the coordinates of a celestial object in Right Ascension (RA) and
 * Declination (Dec).
 */
type RaDec = {
    dec: Radians;
    ra: Radians;
    dist: Kilometers;
};
/**
 * Represents the solar noon and nadir times.
 * solarNoon The time at which the sun is at its highest point in the
 * sky (directly above the observer's head). This is the midpoint of the day.
 * nadir The time at which the sun is at its lowest point, directly
 * below the observer. This is the midpoint of the night.
 */
type SunTime = {
    solarNoon: Date;
    nadir: Date;
    goldenHourDuskStart: Date;
    goldenHourDawnEnd: Date;
    sunsetStart: Date;
    sunriseEnd: Date;
    sunsetEnd: Date;
    sunriseStart: Date;
    goldenHourDuskEnd: Date;
    goldenHourDawnStart: Date;
    blueHourDuskStart: Date;
    blueHourDawnEnd: Date;
    civilDusk: Date;
    civilDawn: Date;
    blueHourDuskEnd: Date;
    blueHourDawnStart: Date;
    nauticalDusk: Date;
    nauticalDawn: Date;
    amateurDusk: Date;
    amateurDawn: Date;
    astronomicalDusk: Date;
    astronomicalDawn: Date;
};
type LaunchDetails = {
    launchDate?: string;
    launchMass?: string;
    launchSite?: string;
    launchVehicle?: string;
    launchPad?: string;
};
type SpaceCraftDetails = {
    lifetime?: string | number;
    maneuver?: string;
    manufacturer?: string;
    motor?: string;
    power?: string;
    payload?: string;
    purpose?: string;
    shape?: string;
    span?: string;
    bus?: string;
    configuration?: string;
    equipment?: string;
    dryMass?: string;
};
type OperationsDetails = {
    user?: string;
    mission?: string;
    owner?: string;
    country?: string;
};
type Lookangle = {
    type: PassType;
    time: Date;
    az: Degrees;
    el: Degrees;
    rng: Kilometers;
    maxElPass?: Degrees;
};
/**
 * Two-line element set data for a satellite.
 */
type TleData = {
    satNum: number;
    intlDes: string;
    epochYear: number;
    epochDay: number;
    meanMoDev1: number;
    meanMoDev2: number;
    bstar: number;
    inclination: Degrees;
    rightAscension: Degrees;
    eccentricity: number;
    argOfPerigee: Degrees;
    meanAnomaly: Degrees;
    meanMotion: number;
    period: Minutes;
};
/**
 * Represents a set of data containing both Line 1 and Line 2 TLE information.
 */
type TleDataFull = Line1Data & Line2Data;
type StringifiedNumber = `${number}.${number}`;
/**
 * Represents a set of data containing both Line 1 and Line 2 TLE information.
 */
type TleParams = {
    sat?: Satellite;
    inc: string | number;
    meanmo: string | number;
    rasc: string | number;
    argPe: string | number;
    meana: string | number;
    ecen: string | number;
    epochyr: string | number;
    epochday: string | number;
    /** COSPAR International Designator */
    intl: string;
    /** alpha 5 satellite number */
    scc: string;
    /** B* drag term (1/Earth radii). Used when `sat` is not provided. */
    bstar?: number;
    /** First derivative of mean motion / 2 (rev/day^2). Used when `sat` is not provided. */
    meanMotionDot?: number;
    /** Second derivative of mean motion / 6 (rev/day^3). Used when `sat` is not provided. */
    meanMotionDdot?: number;
    /** Classification type (default 'U'). Used when `sat` is not provided. */
    classification?: string;
    /** Revolution number at epoch. Used when `sat` is not provided. */
    revAtEpoch?: number;
    /** Element set number (default 999). Used when `sat` is not provided. */
    elementSetNo?: number;
    /** Ephemeris type (default 0). Used when `sat` is not provided. */
    ephemerisType?: number;
};
type PositionVelocity = {
    position: Vector3D<Kilometers>;
    velocity: Vector3D<KilometersPerSecond>;
};
declare enum ZoomValue {
    LEO = 0.45,
    GEO = 0.82,
    MAX = 1
}
/**
 * The RUV coordinate system is a spherical coordinate system with the origin at
 * the radar. The RUV coordinate system is defined with respect to the radar
 * boresight. The R-axis points outward along the boresight with the origin at
 * the radar. The U-axis is in the horizontal plane and points to the right of
 * the boresight. The V-axis is in the vertical plane and points down from the
 * boresight.
 * @template DistanceUnit The unit of measure used for the altitude dimension.
 * This is typically a type representing a distance, such as kilometers or
 * meters. The default is Kilometers.
 * @template AngleUnit The unit of measure used for the latitude and longitude
 * dimensions. This is typically a type representing an angle, such as degrees
 * or radians. The default is Radians.
 */
type RuvVec3<DistanceUnit = Kilometers> = {
    rng: DistanceUnit;
    u: number;
    v: number;
};
/**
 * Phased Array Radar Face Cartesian Coordinates The cartesian coordinates (XRF,
 * YRF ZRF) are defined with respect to the phased array radar face. The radar
 * face lies in the XRF-YRF plane, with the XRF-axis horizontal and the YRF-axis
 * pointing upward. The ZRF-axis points outward along the normal to the array
 * face.
 *
 * The orientation of the phased array face is defined by the azimuth and the
 * elevation of the phased array boresight (i.e., the phased array Z-axis).
 */
type RfVec3<Units = Kilometers> = Vec3<Units>;
/**
 * Represents a function that calculates the Jacobian matrix.
 * @param xs - The input values as a Float64Array. @returns The Jacobian matrix
 * as a Float64Array.
 */
type JacobianFunction = (xs: Float64Array) => Float64Array;
/**
 * Represents a differentiable function.
 * @param x The input value. @returns The output value.
 */
type DifferentiableFunction = (x: number) => number;

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

interface GroundPositionParams {
    lat: Degrees;
    lon: Degrees;
    alt: Kilometers;
}

interface StarObjectParams extends BaseObjectParams {
    ra: Radians;
    dec: Radians;
    bf?: string;
    h?: string;
    pname?: string;
    vmag?: number;
    constellation?: string;
    colorTemp?: number;
    hr?: number;
    flamsteed?: string;
    bayer?: string;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class TimeStamped<T> {
    /**
     * Timestamped value.
     */
    private readonly value_;
    /**
     * Timestamp epoch.
     */
    readonly epoch_: EpochUTC;
    /**
     * Create a new time stamped value container at the provided epoch.
     * @param epoch The timestamp epoch.
     * @param value The timestamped value.
     */
    constructor(epoch: EpochUTC, value: T);
    /**
     * Get the timestamped value.
     * @returns The timestamped value.
     */
    get value(): T;
    /**
     * Set the timestamped value.
     * @param _ The timestamped value.
     * @throws Cannot set value of TimeStamped object; it is readonly.
     */
    set value(_: T);
    /**
     * Get the timestamp epoch.
     * @returns The timestamp epoch.
     */
    get epoch(): EpochUTC;
    /**
     * Set the timestamp epoch.
     * @param _ The timestamp epoch.
     * @throws Cannot set epoch of TimeStamped object; it is readonly.
     */
    set epoch(_: EpochUTC);
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Converts radians to degrees.
 * @param radians The value in radians to be converted.
 * @returns The value in degrees.
 */
declare function rad2deg(radians: Radians): Degrees;
/**
 * Converts degrees to radians.
 * @param degrees The value in degrees to be converted.
 * @returns The value in radians.
 */
declare function deg2rad(degrees: Degrees): Radians;
/**
 * Converts radians to degrees latitude.
 * @param radians The radians value to convert.
 * @returns The corresponding degrees latitude.
 * @throws RangeError if the radians value is outside the range [-PI/2; PI/2].
 */
declare function getDegLat(radians: Radians): Degrees;
/**
 * Converts radians to degrees for longitude.
 * @param radians The value in radians to be converted.
 * @returns The converted value in degrees.
 * @throws {RangeError} If the input radians is not within the range [-PI; PI].
 */
declare function getDegLon(radians: Radians): Degrees;
/**
 * Converts degrees to radians for latitude.
 * @param degrees The degrees value to convert.
 * @returns The equivalent radians value.
 * @throws {RangeError} If the degrees value is not within the range [-90, 90].
 */
declare function getRadLat(degrees: Degrees): Radians;
/**
 * Converts degrees to radians.
 * @param degrees The value in degrees to be converted.
 * @returns The value in radians.
 * @throws {RangeError} If the input degrees are not within the range [-180; 180].
 */
declare function getRadLon(degrees: Degrees): Radians;

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Azimuth-dependent elevation mask for terrain/obstructions.
 * Used to define regions where the minimum elevation is higher than the global minimum
 * due to buildings, mountains, or other obstructions.
 */
interface ElevationMask {
    /** Start of azimuth range in degrees (inclusive) */
    startAz: Degrees;
    /** End of azimuth range in degrees (inclusive), handles wraparound */
    stopAz: Degrees;
    /** Minimum elevation in degrees for this azimuth range */
    minEl: Degrees;
}
/**
 * Parameters for constructing a FieldOfView.
 */
interface FieldOfViewParams {
    /** Boresight azimuth in degrees (default: 0° = North) */
    boresightAz?: Degrees;
    /** Boresight elevation in degrees (default: 90° = zenith) */
    boresightEl?: Degrees;
    /** Half-angle of FOV cone in degrees (major axis for elliptical) */
    halfAngle: Degrees;
    /** Minor half-angle for elliptical cone (defaults to halfAngle for circular) */
    minorHalfAngle?: Degrees;
    /** Roll angle for elliptical cone orientation in degrees (default: 0°) */
    rollAngle?: Degrees;
    /** Minimum range in kilometers */
    minRange: Kilometers;
    /** Maximum range in kilometers */
    maxRange: Kilometers;
    /** Global minimum elevation in degrees (default: 0°) */
    minElevation?: Degrees;
    /** Azimuth-specific elevation masks for terrain/buildings */
    elevationMasks?: ElevationMask[];
    /** FOV shape type (default: ELLIPTICAL_CONE) */
    shape?: FovShape;
    /** Reference frame for boresight (default: TOPOCENTRIC) */
    frame?: FovFrame;
}
/**
 * Orthonormal basis representing the boresight frame.
 * Used for transforming target directions into boresight-relative coordinates.
 */
interface BoresightFrame {
    /** Boresight direction (unit vector) */
    b: Vector3D;
    /** Major axis direction (unit vector, perpendicular to boresight) */
    u: Vector3D;
    /** Minor axis direction (unit vector, perpendicular to both b and u) */
    v: Vector3D;
}
/**
 * Constructs a boresight frame from azimuth, elevation, and roll angles.
 *
 * The frame is constructed using the ENU (East-North-Up) convention:
 * - Azimuth 0° is North, 90° is East
 * - Elevation 0° is horizontal, 90° is zenith
 * - Roll 0° means major axis aligns with the projection of "up" onto the
 *   plane perpendicular to boresight
 *
 * @param az - Boresight azimuth in radians
 * @param el - Boresight elevation in radians
 * @param roll - Roll angle in radians
 * @returns Orthonormal boresight frame
 */
declare function boresightFrameFromAzElRoll(az: Radians, el: Radians, roll: Radians): BoresightFrame;
/**
 * Boresight-centric field of view using elliptical cone geometry.
 *
 * Defines a sensor's FOV as an elliptical cone around a boresight direction,
 * with optional azimuth-dependent elevation masking for terrain/obstructions.
 *
 * @example
 * ```typescript
 * // Circular cone pointing at zenith
 * const fov = new FieldOfView({
 *   halfAngle: 45 as Degrees,
 *   minRange: 100 as Kilometers,
 *   maxRange: 50000 as Kilometers,
 * });
 *
 * // Elliptical fan-shaped FOV (phased array radar)
 * const fanFov = new FieldOfView({
 *   boresightEl: 90 as Degrees,
 *   halfAngle: 90 as Degrees,       // 90° in major direction
 *   minorHalfAngle: 2 as Degrees,   // 2° in minor direction
 *   rollAngle: 0 as Degrees,        // Major axis aligned N-S
 *   minRange: 100 as Kilometers,
 *   maxRange: 50000 as Kilometers,
 * });
 *
 * // Check if target is visible
 * const rae = { rng: 1000, az: 45, el: 30 };
 * if (fov.contains(rae)) {
 *   console.log('Target is in FOV');
 * }
 * ```
 */
declare class FieldOfView {
    /** Boresight azimuth in degrees */
    readonly boresightAz: Degrees;
    /** Boresight elevation in degrees */
    readonly boresightEl: Degrees;
    /** Major half-angle in degrees */
    readonly halfAngle: Degrees;
    /** Minor half-angle in degrees */
    readonly minorHalfAngle: Degrees;
    /** Roll angle in degrees */
    readonly rollAngle: Degrees;
    /** Minimum range in kilometers */
    readonly minRange: Kilometers;
    /** Maximum range in kilometers */
    readonly maxRange: Kilometers;
    /** Global minimum elevation in degrees */
    readonly minElevation: Degrees;
    /** Azimuth-specific elevation masks */
    readonly elevationMasks: ElevationMask[];
    /** FOV shape type */
    readonly shape: FovShape;
    /** Reference frame for boresight */
    readonly frame: FovFrame;
    /** Cached boresight frame for performance */
    private readonly boresightFrame_;
    /** Cached half angles in radians */
    private readonly halfAngleRad_;
    private readonly minorHalfAngleRad_;
    constructor(params: FieldOfViewParams);
    /**
     * Creates a hemisphere FOV (all-sky coverage above minimum elevation).
     * @param minRange - Minimum range in kilometers
     * @param maxRange - Maximum range in kilometers
     * @param minEl - Minimum elevation (default: 0°)
     * @returns FieldOfView covering the hemisphere
     */
    static hemisphere(minRange: Kilometers, maxRange: Kilometers, minEl?: Degrees): FieldOfView;
    /**
     * Creates a circular cone FOV.
     * @param boresightAz - Boresight azimuth in degrees
     * @param boresightEl - Boresight elevation in degrees
     * @param halfAngle - Cone half-angle in degrees
     * @param minRange - Minimum range in kilometers
     * @param maxRange - Maximum range in kilometers
     * @returns FieldOfView with circular cone
     */
    static circularCone(boresightAz: Degrees, boresightEl: Degrees, halfAngle: Degrees, minRange: Kilometers, maxRange: Kilometers): FieldOfView;
    /**
     * Checks if the given RAE coordinates are within this field of view.
     *
     * Performs the following checks in order:
     * 1. Range bounds
     * 2. Elevation masking (global and azimuth-specific)
     * 3. Elliptical cone containment
     *
     * @param rae - The RAE coordinates to check
     * @returns True if the coordinates are within the FOV
     */
    contains(rae: RaeVec3<Kilometers, Degrees>): boolean;
    /**
     * Checks if a direction vector is within the FOV angular bounds.
     * For body-frame sensors receiving body-frame directions.
     *
     * @param direction - Direction vector to target (will be normalized)
     * @param range - Range to target in kilometers
     * @returns True if within FOV
     */
    containsDirection(direction: Vector3D, range: Kilometers): boolean;
    /**
     * Gets the effective minimum elevation at a given azimuth.
     * Considers all applicable elevation masks and returns the most restrictive.
     *
     * @param az - Azimuth in degrees
     * @returns Effective minimum elevation in degrees
     */
    getMinElevation(az: Degrees): Degrees;
    /**
     * Returns the boresight as a unit vector in the topocentric (ENU) frame.
     */
    get boresightVector(): Vector3D;
    /**
     * Calculates the angular offset from boresight to a target.
     * @param az - Target azimuth in degrees
     * @param el - Target elevation in degrees
     * @returns Angular offset in degrees
     */
    angularOffset(az: Degrees, el: Degrees): Degrees;
    /**
     * Returns true if the FOV is circular (major = minor half-angle).
     */
    get isCircular(): boolean;
    /**
     * Gets the full angular coverage (2 * halfAngle) in degrees.
     * For scanning radars, this represents the sweep width.
     */
    get angularCoverage(): Degrees;
    /**
     * Checks if this FOV is configured for deep space observation.
     * Deep space is defined as max range > 6000 km.
     */
    isDeepSpace(): boolean;
    /**
     * Checks if this FOV is configured for near-Earth observation.
     * Near Earth is defined as max range <= 6000 km.
     */
    isNearEarth(): boolean;
    /**
     * Creates a serializable representation of this FOV.
     */
    serialize(): FieldOfViewParams;
    /**
     * Returns a string representation of this FOV.
     */
    toString(): string;
    /**
     * Checks if an azimuth falls within an elevation mask's range.
     * Handles wraparound (e.g., 350° to 10°).
     */
    private isAzimuthInMaskRange;
    /**
     * Core containment check for cone geometry using az/el.
     */
    private isWithinCone;
    /**
     * Core containment check for cone geometry using direction vector.
     */
    private isDirectionWithinCone;
    /**
     * Validates FOV parameters.
     */
    private validate;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class RandomGaussianSource {
    private readonly boxMuller_;
    constructor(seed?: number);
    nextGauss(): number;
    gaussVector(n: number): Vector;
    gaussSphere(radius?: number): Vector3D;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class PropagatorPairs {
    private readonly posStep_;
    private readonly velStep_;
    constructor(posStep_: number, velStep_: number);
    private _high;
    private _low;
    set(index: number, high: Propagator, low: Propagator): void;
    get(index: number): [Propagator, Propagator];
    /**
     * Get the step size at the provided index.
     * @param index The index.
     * @returns The step size.
     */
    step(index: number): number;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Observation data.
 */
declare abstract class Observation {
    /** Observation epoch. */
    abstract get epoch(): EpochUTC;
    /** Inertial observer location. */
    abstract get site(): J2000;
    /** Observation noise matrix. */
    abstract get noise(): Matrix;
    /**
     * Return range-normalized cross line-of-sight residual for the observation
     * when compared against a nominal state propagator.
     * @param propagator Propagator to compare against.
     * @throws Not implemented.
     */
    abstract clos(propagator: Propagator): number;
    /**
     * Return relative state residual for the observation when compared against
     * a nominal state propagator.
     * @param propagator Propagator to compare against.
     * @throws Not implemented.
     */
    abstract ricDiff(propagator: Propagator): Vector3D;
    /**
     * Convert this observation to vector form.
     * @throws Not implemented.
     */
    abstract toVector(): Vector;
    /**
     * Compute the state derivative matrix for this observation.
     * @param propPairs Propagator pairs to compare against.
     * @throws Not implemented.
     */
    abstract jacobian(propPairs: PropagatorPairs): Matrix;
    /**
     * Compute the state residual matrix for this observation.
     * @param propagator Propagator to compare against.
     * @throws Not implemented.
     */
    abstract residual(propagator: Propagator): Matrix;
    /**
     * Convert this observation's noise matrix into a covariance matrix.
     * @returns A matrix representing the noise covariance.
     */
    noiseCovariance(): Matrix;
    /**
     * Generates a noise sample from the noise covariance matrix.
     * @param sigma - The scaling factor for the noise covariance matrix.
     * @returns A matrix representing the noise sample.
     */
    noiseSample_(sigma: number): Matrix;
    /**
     * Randomly sample this observation in vector form within the
     * observation noise.
     * @param random Random number generator.
     * @param sigma Sigma value to scale the noise by.
     * @returns Sampled observation.
     */
    sampleVector(random: RandomGaussianSource, sigma: number): Vector;
    /**
     * Randomly sample this observation within the observation noise, scaled to
     * the provided sigma value.
     * @param random Random number generator.
     * @param sigma Sigma value to scale the noise by.
     * @throws Not implemented.
     */
    abstract sample(random: RandomGaussianSource, sigma: number): Observation;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class ObservationRadar extends Observation {
    private readonly site_;
    observation: RAE;
    private readonly noise_;
    constructor(site_: J2000, observation: RAE, noise_?: Matrix);
    private static readonly defaultNoise;
    get epoch(): EpochUTC;
    get site(): J2000;
    get noise(): Matrix;
    toVector(): Vector;
    clos(propagator: Propagator): number;
    ricDiff(propagator: Propagator): Vector3D;
    sample(random: RandomGaussianSource, sigma?: number): Observation;
    jacobian(propPairs: PropagatorPairs): Matrix;
    residual(propagator: Propagator): Matrix;
    /**
     * Create a noise matrix from the range, azimuth, and elevation standard
     * deviations _(kilometers/radians)_.
     * @param rngSigma - The range standard deviation _(kilometers)_.
     * @param azSigma - The azimuth standard deviation _(radians)_.
     * @param elSigma - The elevation standard deviation _(radians)_.
     * @returns The noise matrix.
     */
    static noiseFromSigmas(rngSigma: Kilometers, azSigma: Radians, elSigma: Radians): Matrix;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Union type representing valid sensor platforms.
 * Sensors can be mounted on ground objects (stations) or space objects (satellites).
 */
type SensorPlatform = GroundObject | SpaceObject;
/**
 * Parameters for constructing a Sensor.
 */
interface SensorParams {
    /** Unique identifier for the sensor */
    id: number;
    /** Human-readable name */
    name: string;
    /** Type of sensor */
    sensorType: SensorType;
    /** Field of view constraints */
    fieldOfView: FieldOfViewParams;
    /** Short name or abbreviation */
    shortName?: string;
    /** Sensor system identifier */
    system?: string;
    /** Country of operation */
    country?: string;
    /** Operating organization */
    operator?: string;
    /** Dwell time for target acquisition */
    dwellTime?: Milliseconds;
    /** Frequency band (for RF sensors) */
    freqBand?: string;
    /** Whether sensor is volumetric */
    isVolumetric?: boolean;
    /** URL for more information */
    url?: string;
    /** Additional metadata */
    metadata?: Record<string, unknown>;
}
/**
 * Serialized representation of a sensor.
 */
interface SerializedSensor {
    id: number;
    name: string;
    sensorType: SensorType;
    fieldOfView: ReturnType<FieldOfView['serialize']>;
    shortName?: string;
    system?: string;
    country?: string;
    operator?: string;
    dwellTime?: Milliseconds;
    freqBand?: string;
    isVolumetric?: boolean;
    url?: string;
    metadata?: Record<string, unknown>;
    [key: string]: unknown;
}
/**
 * Abstract base class for all sensor types.
 *
 * Sensors are components that attach to platforms (ground stations or satellites)
 * rather than being location-based objects themselves. Position is delegated to
 * the parent platform.
 *
 * @example
 * ```typescript
 * // Create a sensor attached to a ground station
 * const radar = new PhasedArrayRadar({
 *   id: 'eglin-radar',
 *   name: 'Eglin SSPARS',
 *   sensorType: SensorType.PHASED_ARRAY_RADAR,
 *   fieldOfView: { ... },
 * });
 *
 * groundStation.addSensor(radar);
 * radar.setParent(groundStation);
 *
 * // Check if satellite is in FOV
 * if (radar.canObserve(satellite)) {
 *   const observation = radar.observe(satellite);
 * }
 * ```
 */
declare abstract class Sensor {
    /** Unique identifier */
    readonly id: number;
    /** Human-readable name */
    name: string;
    /** Type of sensor */
    readonly sensorType: SensorType;
    /** Field of view constraints */
    fieldOfView: FieldOfView;
    /** Short name or abbreviation */
    shortName?: string;
    /** Sensor system identifier */
    system?: string;
    /** Country of operation */
    country?: string;
    /** Operating organization */
    operator?: string;
    /** Dwell time for target acquisition */
    dwellTime?: Milliseconds;
    /** Frequency band (for RF sensors) */
    freqBand?: string;
    /** Whether sensor is volumetric */
    isVolumetric?: boolean;
    /** URL for more information */
    url?: string;
    /** Additional metadata */
    metadata?: Record<string, unknown>;
    /** Parent platform this sensor is attached to */
    private parent_?;
    constructor(params: SensorParams);
    /**
     * Gets the parent platform this sensor is attached to.
     * @throws {ValidationError} If sensor has no parent assigned
     */
    get parent(): SensorPlatform;
    /**
     * Sets the parent platform for this sensor.
     * @param platform - The ground object or space object to attach to
     */
    setParent(platform: SensorPlatform): void;
    /**
     * Checks if this sensor has a parent platform assigned.
     */
    hasParent(): boolean;
    /**
     * Validates that this sensor has a parent platform.
     * Call at the start of methods that require a parent.
     * @param methodName - Name of the calling method (for error context)
     * @throws {ValidationError} If no parent is assigned
     */
    protected requireParent(methodName: string): SensorPlatform;
    /**
     * Gets the sensor's position in J2000 coordinates.
     * Delegates to the parent platform.
     * @param date - Time for position calculation (defaults to now)
     * @returns J2000 state vector
     * @throws {ValidationError} If sensor has no parent platform assigned
     */
    getJ2000(date?: Date): J2000;
    /**
     * Checks if RAE coordinates are within the sensor's field of view.
     * @param rae - Range, azimuth, elevation coordinates
     * @returns True if within FOV
     */
    isInFov(rae: RaeVec3<Kilometers, Degrees>): boolean;
    /**
     * Checks if a target can be observed by this sensor at the given time.
     * @param target - The space object to check
     * @param date - Time for the calculation (defaults to now)
     * @returns True if target is in FOV
     */
    canObserve(target: SpaceObject, date?: Date): boolean;
    /**
     * Gets the RAE (Range, Azimuth, Elevation) of a target relative to this sensor.
     * @param target - The space object to observe
     * @param date - Time for the calculation (defaults to now)
     * @returns RAE coordinates or null if calculation fails
     * @throws {ValidationError} If sensor has no parent platform assigned
     */
    getRae(target: SpaceObject, date?: Date): RaeVec3<Kilometers, Degrees> | null;
    /**
     * Calculates satellite passes over a planning interval.
     * Identifies when a satellite enters and exits the sensor's FOV.
     *
     * @param target - The satellite to track
     * @param planningInterval - Duration in seconds to plan
     * @param date - Start time (defaults to now)
     * @example
     * ```typescript
     * import { Sensor, Satellite, GroundObject, FieldOfView, PassType, Degrees, Kilometers } from 'ootk';
     *
     * // Create ground station with sensor
     * const station = new GroundObject({
     *   lat: 40.0 as Degrees,
     *   lon: -75.0 as Degrees,
     *   alt: 0.1 as Kilometers,
     * });
     *
     * const sensor = new Sensor({
     *   id: 'radar-1',
     *   name: 'Tracking Radar',
     *   fov: new FieldOfView({
     *     boresightEl: 45 as Degrees,
     *     halfAngle: 30 as Degrees,
     *     maxRange: 5000 as Kilometers,
     *   }),
     * });
     * sensor.setParent(station);
     *
     * // Find all passes in next 24 hours (86400 seconds)
     * const passes = sensor.calculatePasses(satellite, 86400);
     *
     * // Process pass events
     * passes.forEach(event => {
     *   if (event.type === PassType.ENTER) {
     *     console.log(`Pass starts at ${event.time.toISOString()}`);
     *     console.log(`  AOS Az/El: ${event.az.toFixed(1)}° / ${event.el.toFixed(1)}°`);
     *   } else if (event.type === PassType.EXIT) {
     *     console.log(`Pass ends at ${event.time.toISOString()}`);
     *     console.log(`  Max elevation: ${event.maxElPass?.toFixed(1)}°`);
     *   }
     * });
     * ```
     * @returns Array of lookangle events (ENTER/EXIT with RAE data)
     * @throws {ValidationError} If sensor has no parent platform assigned
     */
    calculatePasses(target: Satellite, planningInterval: number, date?: Date): Lookangle[];
    /**
     * Creates an observation of a target space object.
     * Each sensor type implements this to return the appropriate observation type.
     * @param target - The space object to observe
     * @param date - Time of observation (defaults to now)
     * @returns Observation data or null if observation not possible
     */
    abstract observe(target: SpaceObject, date?: Date): unknown | null;
    /**
     * Creates a deep copy of this sensor.
     * The cloned sensor will not have a parent assigned.
     * @returns A new Sensor instance with the same properties
     */
    abstract clone(): Sensor;
    /**
     * Checks if this sensor is configured for deep space observation.
     */
    isDeepSpace(): boolean;
    /**
     * Checks if this sensor is configured for near-Earth observation.
     */
    isNearEarth(): boolean;
    /**
     * Creates a serializable representation of this sensor.
     */
    serialize(): SerializedSensor;
    /**
     * Returns sensor-type-specific serialization data.
     * Override in subclasses to add additional fields.
     */
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Returns a string representation of this sensor.
     */
    toString(): string;
    /**
     * Determines the pass type based on current and previous visibility.
     */
    private static getPassType_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing a RadarSensor.
 */
interface RadarSensorParams extends SensorParams {
    /** Radar beamwidth in degrees */
    beamwidth: Degrees;
    /** Radar frequency band (e.g., "X-band", "S-band") */
    frequency?: string;
    /** Peak transmit power in watts */
    peakPower?: number;
}
/**
 * Abstract base class for radar sensors.
 *
 * Provides common radar functionality including beamwidth handling
 * and default RAE-based observation generation.
 *
 * @example
 * ```typescript
 * // Concrete radar implementations extend this class
 * class MyRadar extends RadarSensor {
 *   observe(target: SpaceObject, date?: Date): ObservationRadar | null {
 *     return super.observe(target, date);
 *   }
 * }
 * ```
 */
declare abstract class RadarSensor extends Sensor {
    /** Radar beamwidth in degrees */
    readonly beamwidth: Degrees;
    /** Radar frequency band */
    frequency?: string;
    /** Peak transmit power in watts */
    peakPower?: number;
    constructor(params: RadarSensorParams);
    /**
     * Gets the beamwidth in radians.
     */
    get beamwidthRad(): Radians;
    /**
     * Creates a radar observation (RAE) of a target.
     * @param target - The space object to observe
     * @param date - Time of observation (defaults to now)
     * @returns ObservationRadar or null if target not in FOV
     */
    observe(target: SpaceObject, date?: Date): ObservationRadar | null;
    /**
     * Creates a RAE observation without wrapping in ObservationRadar.
     * Useful for simpler use cases that don't need the full observation class.
     * @param target - The space object to observe
     * @param date - Time of observation (defaults to now)
     * @returns RAE or null if target not in FOV
     */
    observeRae(target: SpaceObject, date?: Date): RAE | null;
    /**
     * Creates a RAE object from epoch and raw values.
     * Convenience factory for creating observations programmatically.
     * @param epoch - Observation epoch
     * @param range - Range in kilometers
     * @param azimuth - Azimuth in degrees
     * @param elevation - Elevation in degrees
     * @returns RAE observation
     */
    protected createRae(epoch: EpochUTC, range: number, azimuth: Degrees, elevation: Degrees): RAE;
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Creates a deep copy of this radar sensor.
     * The cloned sensor will not have a parent assigned.
     * @returns A new RadarSensor instance with the same properties
     */
    abstract clone(): RadarSensor;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing a PhasedArrayRadar.
 */
interface PhasedArrayRadarParams extends RadarSensorParams {
    /** Boresight azimuth angles for each face (degrees) */
    boresightAz: Degrees[];
    /** Boresight elevation angles for each face (degrees) */
    boresightEl: Degrees[];
}
/**
 * Phased array radar sensor with electronic beam steering.
 *
 * Supports multi-face configurations with UV coordinate transformations
 * relative to boresight directions. Ported from the legacy RfSensor class.
 *
 * @example
 * ```typescript
 * const radar = new PhasedArrayRadar({
 *   id: 'pave-paws',
 *   name: 'PAVE PAWS',
 *   sensorType: SensorType.PHASED_ARRAY_RADAR,
 *   beamwidth: 2.0 as Degrees,
 *   boresightAz: [0 as Degrees, 180 as Degrees],  // Two faces
 *   boresightEl: [45 as Degrees, 45 as Degrees],
 *   fieldOfView: { ... },
 * });
 *
 * // Convert target Az/El to UV coordinates
 * const uv = radar.uvFromAzEl(45 as Degrees, 30 as Degrees, 0);
 * ```
 */
declare class PhasedArrayRadar extends RadarSensor {
    /** Boresight azimuth angles for each face */
    readonly boresightAz: Degrees[];
    /** Boresight elevation angles for each face */
    readonly boresightEl: Degrees[];
    /** Number of radar faces */
    readonly faceCount: number;
    /** Field of view for each face */
    readonly faceFovs: FieldOfView[];
    constructor(params: PhasedArrayRadarParams);
    /**
     * Checks if RAE coordinates are within any face's field of view.
     * @param rae - Range, azimuth, elevation coordinates
     * @returns True if within any face's FOV
     */
    isInFov(rae: RaeVec3<Kilometers, Degrees>): boolean;
    /**
     * Gets the indices of faces that can see the given RAE coordinates.
     * @param rae - Range, azimuth, elevation coordinates
     * @returns Array of face indices where target is in FOV
     */
    getFacesInFov(rae: RaeVec3<Kilometers, Degrees>): number[];
    /**
     * Converts azimuth and elevation angles to UV coordinates relative to boresight.
     *
     * UV coordinates represent the angular deviation from the radar's boresight
     * direction, normalized by the beamwidth.
     *
     * @param az - Azimuth angle in degrees
     * @param el - Elevation angle in degrees
     * @param face - Face number (0-indexed), defaults to 0
     * @returns UV coordinates { u, v }
     * @throws Error if face number is invalid
     */
    uvFromAzEl(az: Degrees, el: Degrees, face?: number): {
        u: number;
        v: number;
    };
    /**
     * Converts UV coordinates back to azimuth and elevation angles.
     *
     * @param u - U coordinate
     * @param v - V coordinate
     * @param face - Face number (0-indexed), required for multi-face sensors
     * @returns Az/El in degrees { az, el }
     * @throws Error if face number not specified for multi-face sensors
     */
    azElFromUV(u: number, v: number, face?: number): {
        az: Degrees;
        el: Degrees;
    };
    /**
     * Gets the boresight azimuth in radians for the specified face.
     * @param face - Face number (0-indexed)
     * @returns Boresight azimuth in radians
     */
    boresightAzRad(face?: number): Radians;
    /**
     * Gets the boresight elevation in radians for the specified face.
     * @param face - Face number (0-indexed)
     * @returns Boresight elevation in radians
     */
    boresightElRad(face?: number): Radians;
    /**
     * Generates an RUV (Range-U-V) observation vector for a target.
     *
     * RUV observations are commonly used in radar tracking as they
     * linearize near the boresight direction.
     *
     * @param range - Range to target in kilometers
     * @param az - Azimuth to target in degrees
     * @param el - Elevation to target in degrees
     * @param face - Face number for multi-face radar (defaults to 0)
     * @returns RUV vector { rng, u, v }
     */
    generateRuv(range: Kilometers, az: Degrees, el: Degrees, face?: number): RuvVec3<Kilometers>;
    /**
     * Converts RUV observation back to RAE (Range-Azimuth-Elevation).
     *
     * @param ruv - RUV observation vector
     * @param face - Face number for multi-face radar
     * @returns RAE values { rng, az, el }
     */
    ruvToRae(ruv: RuvVec3<Kilometers>, face?: number): {
        rng: Kilometers;
        az: Degrees;
        el: Degrees;
    };
    /**
     * Determines which face(s) can see a target at the given azimuth/elevation.
     *
     * A face can see a target if the angular deviation from its boresight
     * is within some multiple of the beamwidth (typically 60° for phased arrays).
     *
     * @param az - Target azimuth in degrees
     * @param el - Target elevation in degrees
     * @param maxAngle - Maximum angle from boresight in degrees (default: 60°)
     * @returns Array of face indices that can see the target
     */
    getVisibleFaces(az: Degrees, el: Degrees, maxAngle?: Degrees): number[];
    /**
     * Gets the face with the smallest angular deviation from the target.
     * @param az - Target azimuth in degrees
     * @param el - Target elevation in degrees
     * @returns Best face index, or -1 if no face is within 90° of target
     */
    getBestFace(az: Degrees, el: Degrees): number;
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Creates a deep copy of this phased array radar.
     * The cloned sensor will not have a parent assigned.
     * @returns A new PhasedArrayRadar instance with the same properties
     */
    clone(): PhasedArrayRadar;
    toString(): string;
    /**
     * Validates that a face index is within bounds.
     */
    private validateFace_;
}

/**
 * Converts ECEF (Earth-Centered Earth-Fixed) to TEME (True Equator Mean Equinox) coordinates.
 *
 * **Coordinate Frame Transformation: ECEF → TEME**
 *
 * This is a simplified transformation that rotates by GMST (Greenwich Mean Sidereal Time)
 * around the Z-axis. It does not account for precession, nutation, or polar motion.
 *
 * For high-precision transformations, use the ITRF class methods instead.
 *
 * [X]     [C -S  0][X]
 * [Y]  =  [S  C  0][Y]
 * [Z]eci  [0  0  1][Z]ecef
 *
 * @param ecef - ECEF coordinates (Earth-fixed)
 * @param gmst - Greenwich Mean Sidereal Time in radians
 * @returns TEME coordinates (inertial)
 */
declare function ecef2eci<T extends number>(ecef: EcefVec3<T>, gmst: number): TemeVec3<T>;
/**
 * Converts ECEF coordinates to ENU coordinates.
 * @param ecef - The ECEF coordinates.
 * @param lla - The LLA coordinates.
 * @returns The ENU coordinates.
 */
declare function ecef2enu<T extends number>(ecef: EcefVec3<T>, lla: LlaVec3): EnuVec3<T>;
/**
 * Converts TEME (True Equator Mean Equinox) to ECEF (Earth-Centered Earth-Fixed) coordinates.
 *
 * **Coordinate Frame Transformation: TEME → ECEF**
 *
 * This is a simplified transformation that rotates by GMST (Greenwich Mean Sidereal Time)
 * around the Z-axis. It does not account for precession, nutation, or polar motion.
 *
 * For high-precision transformations, use J2000.toITRF() instead.
 *
 * [X]     [C  S  0][X]
 * [Y]  =  [-S C  0][Y]
 * [Z]ecef [0  0  1][Z]eci
 *
 * @param eci - TEME coordinates (inertial, from SGP4)
 * @param gmst - Greenwich Mean Sidereal Time in radians
 * @returns ECEF coordinates (Earth-fixed)
 */
declare function eci2ecef<T extends number>(eci: TemeVec3<T>, gmst: number): EcefVec3<T>;
/**
 * Converts TEME (True Equator Mean Equinox) coordinates to geodetic (lat/lon/alt) coordinates.
 *
 * **Coordinate Frame Transformation: TEME → Geodetic (WGS84)**
 *
 * Internally converts TEME to ECEF via GMST rotation, then iteratively solves
 * for geodetic latitude on the WGS84 ellipsoid.
 *
 * @variation cached - results are cached
 * @param eci - TEME coordinates (inertial, from SGP4)
 * @param gmst - Greenwich Mean Sidereal Time in radians
 * @returns Geodetic coordinates (lat/lon in degrees, alt in km on WGS84)
 */
declare function eci2lla(eci: TemeVec3, gmst: number): LlaVec3<Degrees, Kilometers>;
/**
 * Converts geodetic coordinates (longitude, latitude, altitude) to Earth-Centered Earth-Fixed (ECEF) coordinates.
 * @param lla The geodetic coordinates in radians and meters.
 * @returns The ECEF coordinates in meters.
 */
declare function llaRad2ecef<AltitudeUnits extends number>(lla: LlaVec3<Radians, AltitudeUnits>): EcefVec3<AltitudeUnits>;
/**
 * Converts geodetic coordinates (longitude, latitude, altitude) to Earth-Centered Earth-Fixed (ECEF) coordinates.
 * @param lla The geodetic coordinates in degrees and meters.
 * @returns The ECEF coordinates in meters.
 */
declare function lla2ecef<AltitudeUnits extends number>(lla: LlaVec3<Degrees, AltitudeUnits>): EcefVec3<AltitudeUnits>;
/**
 * Converts geodetic coordinates (lat/lon/alt) to TEME (True Equator Mean Equinox) coordinates.
 *
 * **Coordinate Frame Transformation: Geodetic → TEME**
 *
 * Converts WGS84 geodetic coordinates to inertial TEME coordinates via ECEF
 * and GMST rotation. Uses spherical Earth approximation (Earth.radiusMean).
 *
 * @variation cached - results are cached
 * @param lla - Geodetic coordinates (lat/lon in radians, alt in km)
 * @param gmst - Greenwich Mean Sidereal Time in radians
 * @returns TEME coordinates (inertial)
 */
declare function lla2eci(lla: LlaVec3<Radians, Kilometers>, gmst: GreenwichMeanSiderealTime): TemeVec3<Kilometers>;
/**
 * Converts LLA to SEZ coordinates.
 * @see http://www.celestrak.com/columns/v02n02/
 * @param lla The LLA coordinates.
 * @param ecef The ECEF coordinates.
 * @returns The SEZ coordinates.
 */
declare function lla2sez<D extends number>(lla: LlaVec3<Radians, D>, ecef: EcefVec3<D>): SezVec3<D>;
/**
 * Converts a vector in Right Ascension, Elevation, and Range (RAE) coordinate system
 * to a vector in South, East, and Zenith (SEZ) coordinate system.
 * @param rae The vector in RAE coordinate system.
 * @returns The vector in SEZ coordinate system.
 */
declare function rae2sez<D extends number>(rae: RaeVec3<D, Radians>): SezVec3<D>;
/**
 * Converts a vector in Right Ascension, Elevation, and Range (RAE) coordinate system
 * to Earth-Centered Earth-Fixed (ECEF) coordinate system.
 * @template D - The dimension of the RAE vector.
 * @template A - The dimension of the LLA vector.
 * @param rae - The vector in RAE coordinate system.
 * @param lla - The vector in LLA coordinate system.
 * @returns The vector in ECEF coordinate system.
 */
declare function rae2ecef<D extends number>(rae: RaeVec3<D, Degrees>, lla: LlaVec3<Degrees, D>): EcefVec3<D>;
/**
 * Converts a vector from RAE (Range, Azimuth, Elevation) coordinates to ECI (Earth-Centered Inertial) coordinates.
 * @variation cached - results are cached
 * @param rae The vector in RAE coordinates.
 * @param lla The vector in LLA (Latitude, Longitude, Altitude) coordinates.
 * @param gmst The Greenwich Mean Sidereal Time.
 * @returns The vector in ECI coordinates.
 */
declare function rae2eci<D extends number>(rae: RaeVec3<D, Degrees>, lla: LlaVec3<Degrees, D>, gmst: number): TemeVec3<D>;
/**
 * Converts a vector in RAE (Range, Azimuth, Elevation) coordinates to ENU (East, North, Up) coordinates.
 * @param rae - The vector in RAE coordinates.
 * @returns The vector in ENU coordinates.
 */
declare function rae2enu(rae: RaeVec3): EnuVec3<Kilometers>;
/**
 * Converts South, East, and Zenith (SEZ) coordinates to Right Ascension, Elevation, and Range (RAE) coordinates.
 * @param sez The SEZ coordinates.
 * @returns Rng, Az, El array
 */
declare function sez2rae<D extends number>(sez: SezVec3<D>): RaeVec3<D, Radians>;
/**
 * Converts Earth-Centered Earth-Fixed (ECEF) coordinates to Right Ascension (RA),
 * Elevation (E), and Azimuth (A) coordinates.
 * @param lla The Latitude, Longitude, and Altitude (LLA) coordinates.
 * @param ecef The Earth-Centered Earth-Fixed (ECEF) coordinates.
 * @returns The Right Ascension (RA), Elevation (E), and Azimuth (A) coordinates.
 */
declare function ecefRad2rae<D extends number>(lla: LlaVec3<Radians, D>, ecef: EcefVec3<D>): RaeVec3<D, Degrees>;
/**
 * Converts Earth-Centered Earth-Fixed (ECEF) coordinates to Right Ascension (RA),
 * Elevation (E), and Azimuth (A) coordinates.
 * @variation cached - results are cached
 * @param lla The Latitude, Longitude, and Altitude (LLA) coordinates.
 * @param ecef The Earth-Centered Earth-Fixed (ECEF) coordinates.
 * @returns The Right Ascension (RA), Elevation (E), and Azimuth (A) coordinates.
 */
declare function ecef2rae<D extends number>(lla: LlaVec3<Degrees, D>, ecef: EcefVec3<D>): RaeVec3<D, Degrees>;
declare const jday: (year?: number, mon?: number, day?: number, hr?: number, minute?: number, sec?: number) => number;
/**
 * Calculates the Greenwich Mean Sidereal Time (GMST) for a given date.
 * @param date - The date for which to calculate the GMST.
 * @returns An object containing the GMST value and the Julian date.
 */
declare function calcGmst(date: Date): {
    gmst: GreenwichMeanSiderealTime;
    j: number;
};
/**
 * Converts ECI coordinates to RAE (Right Ascension, Azimuth, Elevation) coordinates.
 * @variation cached - results are cached
 * @param now - Current date and time.
 * @param eci - ECI coordinates of the satellite.
 * @param observer - Ground object or LLA coordinates of the observer.
 * @returns Object containing azimuth, elevation and range in degrees and kilometers respectively.
 */
declare function eci2rae(now: Date, eci: TemeVec3<Kilometers>, observer: GroundObject | LlaVec3<Degrees, Kilometers>): RaeVec3<Kilometers, Degrees>;
/**
 * Calculates the inertial azimuth of a satellite given its latitude and inclination.
 * @param lat - The latitude of the satellite in degrees.
 * @param inc - The inclination of the satellite in degrees.
 * @returns The inertial azimuth of the satellite in degrees.
 */
declare function calcInertAz(lat: Degrees, inc: Degrees): Degrees;
/**
 * Calculates the inclination angle of a satellite from its launch azimuth and latitude.
 * @param lat - The latitude of the observer in degrees.
 * @param az - The launch azimuth angle of the satellite in degrees clockwise from north.
 * @returns The inclination angle of the satellite in degrees.
 */
declare function calcIncFromAz(lat: number, az: number): number;
/**
 * Converts Azimuth and Elevation to U and V.
 * Azimuth is the angle off of boresight in the horizontal plane.
 * Elevation is the angle off of boresight in the vertical plane.
 * Cone half angle is the angle of the cone of the radar max field of view.
 * @param az - Azimuth in radians
 * @param el - Elevation in radians
 * @param coneHalfAngle - Cone half angle in radians
 * @returns U and V in radians
 */
declare function azel2uv(az: Radians, el: Radians, coneHalfAngle: Radians): {
    u: number;
    v: number;
};
/**
 * Determine azimuth and elevation off of boresight based on sensor orientation and RAE.
 * @param rae Range, Azimuth, Elevation
 * @param sensor Phased array radar sensor object
 * @param face Face number of the sensor
 * @param maxSensorAz Maximum sensor azimuth
 * @returns Azimuth and Elevation off of boresight
 */
declare function rae2raeOffBoresight(rae: RaeVec3, sensor: PhasedArrayRadar, face: number, maxSensorAz: Degrees): {
    az: Radians;
    el: Radians;
};
/**
 * Converts Range Az El to Range U V.
 * @param rae Range, Azimuth, Elevation
 * @param sensor Phased array radar sensor object
 * @param face Face number of the sensor
 * @param maxSensorAz Maximum sensor azimuth
 * @returns Range, U, V
 */
declare function rae2ruv(rae: RaeVec3, sensor: PhasedArrayRadar, face: number, maxSensorAz: Degrees): RuvVec3;
/**
 * Converts U and V to Azimuth and Elevation off of boresight.
 * @param u The U coordinate.
 * @param v The V coordinate.
 * @param coneHalfAngle The cone half angle of the radar.
 * @returns Azimuth and Elevation off of boresight.
 */
declare function uv2azel(u: number, v: number, coneHalfAngle: Radians): {
    az: Radians;
    el: Radians;
};
/**
 * Converts coordinates from East-North-Up (ENU) to Right-Front-Up (RF) coordinate system.
 * @param enu - The ENU coordinates to be converted.
 * @param enu.x - The east coordinate.
 * @param enu.y - The north coordinate.
 * @param enu.z - The up coordinate.
 * @param az - The azimuth angle in radians.
 * @param el - The elevation angle in radians.
 * @returns The converted RF coordinates.
 */
declare function enu2rf<D extends number, A extends number = Radians>({ x, y, z }: EnuVec3<D>, az: A, el: A): RfVec3<D>;

/**
 * Full circle in radians (PI * 2)
 *
 * https://tauday.com/tau-manifesto
 */
declare const TAU: Radians;
/**
 * Represents half of the mathematical constant PI.
 */
declare const halfPi: Radians;
/**
 * Converts degrees to radians.
 */
declare const DEG2RAD: Radians;
/**
 * Converts radians to degrees.
 */
declare const RAD2DEG: Degrees;
/**
 * Conversion factor from seconds to degrees.
 */
declare const sec2deg: Degrees;
/**
 * Conversion factor from seconds to days.
 */
declare const sec2day: number;
/**
 * Conversion factor from arcseconds to radians.
 */
declare const asec2rad: Radians;
/**
 * Convert ten-thousandths of an arcsecond to radians.
 */
declare const ttasec2rad: Radians;
/**
 * Convert milliarcseconds to radians.
 */
declare const masec2rad: Radians;
/**
 * The angular velocity of the Earth in radians per second.
 */
declare const angularVelocityOfEarth = 0.00007292115;
/**
 * Astronomical unit in kilometers.
 */
declare const KM_PER_AU = 149597870;
declare const msec2sec: Seconds;
declare const cMPerSec = 299792458;
declare const cKmPerSec: number;
declare const cKmPerMs: number;
declare const MS_PER_DAY = 86400000;
declare const secondsPerDay = 86400;
declare const sec2min: Minutes;
declare const secondsPerSiderealDay = 86164.0905;
declare const secondsPerWeek: number;
/**
 * Half the number of radians in a circle.
 */
declare const PI: Radians;
declare const x2o3: number;
declare const temp4 = 1.5e-12;
/**
 * The number of minutes in a day.
 */
declare const MINUTES_PER_DAY: Minutes;
/**
 * The number of milliseconds in a day.
 */
declare const MILLISECONDS_TO_DAYS = 1.15741e-8;
/**
 * The number of milliseconds in a day.
 */
declare const MILLISECONDS_PER_DAY: number;
/**
 * The number of milliseconds in a second.
 */
declare const MILLISECONDS_PER_SECOND: Milliseconds;
declare const RADIUS_OF_EARTH = 6371;
declare const earthGravityParam = 398600.4415;

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/** Covariance Frame */
declare enum CovarianceFrame {
    /** Earth-centered inertial */
    ECI = "eci",
    /** Radial-Intrack-Crosstrack */
    RIC = "ric"
}
declare class StateCovariance {
    matrix: Matrix;
    frame: CovarianceFrame;
    /**
     * Create a new [StateCovariance] object given its covariance [matrix] and
     * [CovarianceFrame].
     * @param matrix The covariance matrix.
     * @param frame The covariance frame.
     * @returns A new [StateCovariance] object.
     */
    constructor(matrix: Matrix, frame: CovarianceFrame);
    static fromSigmas(sigmas: number[], frame: CovarianceFrame): StateCovariance;
    /**
     * Calculates the standard deviations (sigmas) of each element in the covariance matrix.
     * @returns A vector containing the standard deviations of each element in the covariance matrix.
     */
    sigmas(): Vector;
}

/**
 * Creates a 6x6 state covariance matrix from a TLE
 * @param tleLine1 The first line of the TLE
 * @param tleLine2 The second line of the TLE
 * @param frame The covariance frame (CovarianceFrame.ECI or CovarianceFrame.RIC)
 * @param sigmaScale Scaling factor for the sigmas (default: 1.0)
 * @returns A StateCovariance object containing the 6x6 covariance matrix
 */
declare function createCovarianceFromTle(tleLine1: string, tleLine2: string, frame?: CovarianceFrame, sigmaScale?: number): StateCovariance;
/**
 * Creates a sample-based covariance from a TLE with more realistic uncertainties
 * @param tleLine1 The first line of the TLE
 * @param tleLine2 The second line of the TLE
 * @param frame The covariance frame (CovarianceFrame.ECI or CovarianceFrame.RIC)
 * @returns A StateCovariance object
 */
declare function createSampleCovarianceFromTle(tleLine1: string, tleLine2: string, frame?: CovarianceFrame): StateCovariance;
/**
 * Build a position covariance for conjunction screening from a TLE.
 *
 * Starts from {@link createSampleCovarianceFromTle}, converts the radial,
 * in-track and cross-track *variances* on the diagonal into 1-sigma values
 * scaled by `confidenceLevel`, and caps each so a single bad TLE cannot produce
 * an enormous covariance bubble. The capped sigmas are written to the [0][0]
 * (radial), [1][1] (cross-track) and [2][2] (in-track) diagonal slots; all
 * other matrix terms are preserved.
 *
 * Note the cross-track / in-track slots are intentionally swapped relative to
 * the source RIC ordering. The original sigmas are cached before any write so
 * the swap reads source values, not values it just overwrote.
 * @param tleLine1 First line of the TLE
 * @param tleLine2 Second line of the TLE
 * @param confidenceLevel Sigma multiplier (e.g. settingsManager.covarianceConfidenceLevel)
 * @param caps Optional [radial, crossTrack, inTrack] sigma caps in km
 * @returns A StateCovariance in the ECI frame, or a safe fallback if the
 * TLE-based computation fails or yields a degenerate diagonal.
 */
declare function cappedScreeningCovarianceFromTle(tleLine1: string, tleLine2: string, confidenceLevel: number, caps?: readonly [number, number, number]): StateCovariance;

/**
 * Converts magnitude to decibels.
 * @param magnitude - The magnitude to convert (must be positive).
 * @returns The value in decibels.
 * @throws Error if magnitude is not positive.
 * @example
 * ```typescript
 * const db = mag2db(1000); // Returns 30
 * const db2 = mag2db(100); // Returns 20
 * ```
 */
declare function mag2db(magnitude: number): number;
/**
 * Calculates the relative velocity between two velocity vectors.
 * @param vel1 - First velocity vector in km/s.
 * @param vel2 - Second velocity vector in km/s.
 * @returns The magnitude of the relative velocity in km/s.
 * @example
 * ```typescript
 * const v1 = { x: 7.0, y: 0.5, z: 0.1 };
 * const v2 = { x: 6.8, y: 0.6, z: 0.2 };
 * const relVel = relativeVelocity(v1, v2); // ~0.24 km/s
 * ```
 */
declare function relativeVelocity<T extends number>(vel1: Vec3<T>, vel2: Vec3<T>): T;
/**
 * Shape type for RCS estimation.
 */
type RcsShape = 'sphere' | 'cylinder' | 'cone' | 'hexagon' | 'cube';
/**
 * Estimates the Radar Cross Section (RCS) of an object based on its dimensions and shape.
 * @param length - Length in meters.
 * @param width - Width in meters.
 * @param height - Height in meters.
 * @param shape - The shape type ('sphere', 'cylinder', 'cone', 'hexagon', 'cube').
 * @returns Estimated RCS in square meters.
 * @example
 * ```typescript
 * const rcs = estimateRcs(2.0, 1.5, 1.5, 'cylinder');
 * console.log(`Estimated RCS: ${rcs.toFixed(2)} m²`);
 * ```
 */
declare function estimateRcs(length: number, width: number, height: number, shape: string): number;
/**
 * Calculates the factorial of a given number.
 * @param n - The number to calculate the factorial for.
 * @returns The factorial of the given number.
 */
declare function factorial(n: number): number;
/**
 * Calculates the base 10 logarithm of a number.
 * @param x - The number to calculate the logarithm for.
 * @returns The base 10 logarithm of the input number.
 */
declare function log10(x: number): number;
/**
 * Calculates the hyperbolic secant of a number.
 * @param x - The number to calculate the hyperbolic secant of.
 * @returns The hyperbolic secant of the given number.
 */
declare function sech(x: number): number;
/**
 * Calculates the hyperbolic cosecant of a number.
 * @param x - The number for which to calculate the hyperbolic cosecant.
 * @returns The hyperbolic cosecant of the given number.
 */
declare function csch(x: number): number;
/**
 * Returns the inverse hyperbolic cosecant of a number.
 * @param x - The number to calculate the inverse hyperbolic cosecant of.
 * @returns The inverse hyperbolic cosecant of the given number.
 */
declare function acsch(x: number): number;
/**
 * Calculates the inverse hyperbolic secant (asech) of a number.
 * @param x - The number to calculate the inverse hyperbolic secant of.
 * @returns The inverse hyperbolic secant of the given number.
 */
declare function asech(x: number): number;
/**
 * Calculates the inverse hyperbolic cotangent (acoth) of a number.
 * @param x - The number to calculate the acoth of.
 * @returns The inverse hyperbolic cotangent of the given number.
 */
declare function acoth(x: number): number;
/**
 * Copies the sign of the second number to the first number.
 * @param mag - The magnitude of the number.
 * @param sgn - The sign of the number.
 * @returns The number with the magnitude of `mag` and the sign of `sgn`.
 */
declare function copySign(mag: number, sgn: number): number;
/**
 * Evaluates a polynomial function at a given value.
 * @param x - The value at which to evaluate the polynomial.
 * @param coeffs - The coefficients of the polynomial.
 * @returns The result of evaluating the polynomial at the given value.
 */
declare function evalPoly(x: number, coeffs: Float64Array): number;
/**
 * Concatenates two Float64Arrays into a new Float64Array.
 * @param a - The first Float64Array.
 * @param b - The second Float64Array.
 * @returns A new Float64Array containing the concatenated values of `a` and `b`.
 */
declare function concat(a: Float64Array, b: Float64Array): Float64Array;
/**
 * Calculates the angle in the half-plane that best matches the given angle.
 * @param angle - The angle to be matched.
 * @param match - The angle to be matched against.
 * @returns The angle in the half-plane that best matches the given angle.
 */
declare function matchHalfPlane(angle: number, match: number): number;
/**
 * Wraps an angle to the range [-π, π].
 * @param theta - The angle to wrap.
 * @returns The wrapped angle.
 */
declare function wrapAngle(theta: Radians): Radians;
/**
 * Calculates the angular distance between two points on a sphere.
 * @param lam1 The longitude of the first point.
 * @param phi1 The latitude of the first point.
 * @param lam2 The longitude of the second point.
 * @param phi2 The latitude of the second point.
 * @param method The method to use for calculating the angular distance. Defaults to AngularDistanceMethod.Cosine.
 * @returns The angular distance between the two points.
 * @throws Error if an invalid angular distance method is provided.
 */
declare function angularDistance(lam1: number, phi1: number, lam2: number, phi2: number, method?: AngularDistanceMethod): Radians;
/**
 * Calculates the angular diameter of an object.
 * @param diameter - The diameter of the object.
 * @param distance - The distance to the object.
 * @param method - The method used to calculate the angular diameter. Defaults to AngularDiameterMethod.Sphere.
 * @returns The angular diameter of the object.
 * @throws Error if an invalid angular diameter method is provided.
 */
declare function angularDiameter(diameter: number, distance: number, method?: AngularDiameterMethod): number;
/**
 * Performs linear interpolation between two points.
 * @param x - The x-coordinate to interpolate.
 * @param x0 - The x-coordinate of the first point.
 * @param y0 - The y-coordinate of the first point.
 * @param x1 - The x-coordinate of the second point.
 * @param y1 - The y-coordinate of the second point.
 * @returns The interpolated y-coordinate corresponding to the given x-coordinate.
 */
declare function linearInterpolate(x: number, x0: number, y0: number, x1: number, y1: number): number;
/**
 * Calculates the mean value of an array of numbers.
 * @param values - The array of numbers.
 * @returns The mean value of the numbers.
 */
declare function mean(values: number[]): number;
/**
 * Calculates the standard deviation of an array of numbers.
 * @param values - The array of numbers.
 * @param isSample - Optional. Specifies whether the array represents a sample. Default is false.
 * @returns The standard deviation of the array.
 */
declare function std(values: number[], isSample?: boolean): number;
/**
 * Calculates the covariance between two arrays.
 * @param a - The first array.
 * @param b - The second array.
 * @param isSample - Optional. Specifies whether the arrays represent a sample. Default is false.
 * @returns The covariance between the two arrays.
 */
declare function covariance(a: number[], b: number[], isSample?: boolean): number;
/**
 * Calculates the gamma function of a number.
 * @param n - The input number.
 * @returns The gamma function value.
 */
declare function gamma(n: number): number;
/**
 * Calculates the eccentric anomaly (e0) and true anomaly (nu) using Newton's method
 * for a given eccentricity (ecc) and mean anomaly (m).
 * @param ecc - The eccentricity of the orbit.
 * @param m - The mean anomaly.
 * @returns An object containing the eccentric anomaly (e0) and true anomaly (nu).
 */
declare function newtonM(ecc: number, m: number): {
    e0: number;
    nu: number;
};
/**
 * Calculates the eccentric anomaly (e0) and mean anomaly (m) using Newton's method
 * for a given eccentricity (ecc) and true anomaly (nu).
 * @param ecc - The eccentricity of the orbit.
 * @param nu - The true anomaly.
 * @returns An object containing the calculated eccentric anomaly (e0) and mean anomaly (m).
 */
declare function newtonNu(ecc: number, nu: number): {
    e0: number;
    m: Radians;
};
/**
 * Creates a 2D array with the specified number of rows and columns, filled with the same given value.
 * @template T The type of elements in the array.
 * @param rows The number of rows in the 2D array.
 * @param columns The number of columns in the 2D array.
 * @param value The value to fill the array with.
 * @returns The 2D array with the specified number of rows and columns, filled with the given value.
 */
declare function array2d<T>(rows: number, columns: number, value: T): T[][];
/**
 * Clamps a number between a minimum and maximum value.
 * @param x The number to clamp.
 * @param min The minimum value.
 * @param max The maximum value.
 * @returns The clamped number.
 */
declare function clamp(x: number, min: number, max: number): number;
/**
 * Determines whether a given year is a leap year.
 * @param dateIn The date to check.
 * @returns `true` if the year is a leap year, `false` otherwise.
 */
declare function isLeapYear(dateIn: Date): boolean;
/**
 * Calculates the day of the year for a given date.
 * If no date is provided, the current date is used.
 *
 * This is sometimes referred to as the Jday, but is
 * very different from the Julian day used in astronomy.
 * @param date - The date for which to calculate the day of the year.
 * @returns The day of the year as a number.
 */
declare function getDayOfYear(date?: Date): number;
/**
 * Rounds a number to a specified number of decimal places.
 * @param value - The number to round.
 * @param places - The number of decimal places to round to.
 * @returns The rounded number.
 */
declare function toPrecision(value: number, places: number): number;
/**
 * Returns the sign of a number.
 * @param value - The number to determine the sign of.
 * @returns 1 if the number is positive, -1 if the number is negative.
 */
declare function sign(value: number): 1 | -1;
/**
 * Converts a SpaceObjectType to a string representation.
 * @param spaceObjType - The SpaceObjectType to convert.
 * @returns The string representation of the SpaceObjectType.
 */
declare const spaceObjType2Str: (spaceObjType: SpaceObjectType) => string;
/**
 * Calculates the Doppler factor for a given location, position, and velocity.
 * The Doppler factor is a measure of the change in frequency or wavelength of a wave
 * as observed by an observer moving relative to the source of the wave.
 * @param location - The location vector of the observer.
 * @param position - The position vector of the source.
 * @param velocity - The velocity vector of the source.
 * @returns The calculated Doppler factor.
 */
declare const dopplerFactor: (location: EcefVec3<Kilometers>, position: EcefVec3<Kilometers>, velocity: EcefVec3<KilometersPerSecond>) => number;
/**
 * Creates an array of numbers from start to stop (inclusive) with the specified step.
 * @param start The starting number.
 * @param stop The ending number.
 * @param step The step value.
 * @returns An array of numbers.
 */
declare function createVec(start: number, stop: number, step: number): number[];
/**
 * Calculates the derivative of a differentiable function.
 * @param f The differentiable function.
 * @param h The step size for numerical differentiation. Default value is 1e-3.
 * @returns The derivative function.
 */
declare function derivative(f: DifferentiableFunction, h?: number): DifferentiableFunction;

/**
 * Calculates the Jacobian matrix of a given Jacobian function.
 *
 * The function calculates how small perturbations in each input variable affect all output variables,
 * using a second-order accurate central difference approximation.
 *
 * In orbital mechanics applications, this matrix is essential for solving complex problems like
 * orbit transfers, trajectory optimization, and precise orbital determination.
 * @param f The Jacobian function.
 * @param m The number of rows in the Jacobian matrix.
 * @param x0 The initial values of the variables.
 * @param step The step size for numerical differentiation (default: 1e-5).
 * @returns The Jacobian matrix.
 */
declare const jacobian: (f: JacobianFunction, m: number, x0: Float64Array, step?: number) => Matrix;

/**
 * Calculates the linear distance between two points in three-dimensional space.
 * @param pos1 The first position.
 * @param pos2 The second position.
 * @returns The linear distance between the two positions in kilometers.
 */
declare function linearDistance<D extends number>(pos1: Vec3<D>, pos2: Vec3<D>): D;

/**
 * @author Theodore Kruczek.
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 *
 * @license MIT License
 *
 * @Copyright (c) 2025 Theodore Kruczek
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
/**
 * Photometry helpers for estimating the apparent brightness of resident space
 * objects from radar observables.
 */
/** Brightest standard magnitude the RCS estimator will report. */
declare const RCS_VMAG_ESTIMATE_MIN = -5;
/** Faintest standard magnitude the RCS estimator will report. */
declare const RCS_VMAG_ESTIMATE_MAX = 15;
/**
 * Estimates a standard (intrinsic) visual magnitude from a radar cross
 * section.
 *
 * Uses the common first-order approximation that reflected optical flux scales
 * with the projected area a radar sees:
 *
 *   vmag = -1.3 - 2.5 * log10(rcs)
 *
 * where `rcs` is in square meters. This assumes a diffuse sphere with an
 * average albedo and ignores shape/material effects, so the result is only a
 * coarse estimate. The output is clamped to
 * [{@link RCS_VMAG_ESTIMATE_MIN}, {@link RCS_VMAG_ESTIMATE_MAX}] so degenerate
 * radar cross sections cannot produce absurd magnitudes.
 * @param rcs Radar cross section in square meters.
 * @returns The estimated standard visual magnitude, or null when the RCS is
 * not a finite positive number.
 */
declare function estimateVmagFromRcs(rcs: number): number | null;

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * A generator of random bool, int, or double values.
 *
 * The default implementation supplies a stream of pseudo-random bits that are not suitable for cryptographic purposes.
 */
declare class Random {
    private _seed;
    constructor(seed?: number);
    nextFloat(max?: number): number;
    /**
     * To create a non-negative random integer uniformly distributed in the range from 0,
     * inclusive, to max, exclusive, use nextInt(int max).
     * @param max The bound on the random number to be returned. Must be positive.
     * @returns A pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive).
     */
    nextInt(max?: number): number;
    nextBool(): boolean;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing an AccessWindow.
 */
interface AccessWindowParams {
    /** Start time of the access window */
    start: Date;
    /** End time of the access window */
    end: Date;
    /** Duration in milliseconds */
    duration: number;
    /** Maximum elevation achieved during the pass */
    maxElevation: Degrees;
    /** Time of maximum elevation */
    maxElevationTime: Date;
    /** Range at maximum elevation */
    rangeAtMaxEl: Kilometers;
    /** The observing ground object */
    observer: GroundObject;
    /** The observed space object */
    target: SpaceObject;
}
/**
 * Represents a single access window (visibility period) between
 * a ground observer and a space object.
 */
declare class AccessWindow {
    /** Start time of the access window */
    readonly start: Date;
    /** End time of the access window */
    readonly end: Date;
    /** Duration in milliseconds */
    readonly duration: number;
    /** Maximum elevation achieved during the pass */
    readonly maxElevation: Degrees;
    /** Time of maximum elevation */
    readonly maxElevationTime: Date;
    /** Range at maximum elevation */
    readonly rangeAtMaxEl: Kilometers;
    /** The observing ground object */
    readonly observer: GroundObject;
    /** The observed space object */
    readonly target: SpaceObject;
    constructor(params: AccessWindowParams);
    /**
     * Formats a Date as HH:MM:SS.
     */
    private static formatTime_;
    toString(): string;
}
/**
 * Constraints for access window calculations.
 * All constraints are optional - if omitted, default values are used.
 */
interface AccessConstraints {
    /** Minimum elevation angle above horizon (default: 0°) */
    minElevation?: Degrees;
    /** Maximum slant range (default: unlimited) */
    maxRange?: Kilometers;
    /** Minimum slant range (default: 0) */
    minRange?: Kilometers;
    /** Require target to be sunlit (not in Earth's shadow) */
    requireSunlit?: boolean;
    /** Require observer to be in darkness (for optical observations) */
    requireObserverDark?: boolean;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Static utility class for calculating access windows between
 * ground observers and space objects.
 *
 * An access window is a period during which a space object is visible
 * from a ground observer, subject to optional constraints such as
 * minimum elevation, range limits, and illumination requirements.
 *
 * @example
 * ```typescript
 * // Find all passes over 24 hours
 * const windows = AccessCalculator.calculateAccess(
 *   groundStation,
 *   satellite,
 *   new Date(),
 *   new Date(Date.now() + 86400000)
 * );
 *
 * // Find next pass with constraints
 * const nextPass = AccessCalculator.getNextAccess(
 *   groundStation,
 *   satellite,
 *   new Date(),
 *   { minElevation: 10 as Degrees, requireSunlit: true }
 * );
 * ```
 */
declare class AccessCalculator {
    /** Default calculation time step in milliseconds (10 seconds) */
    private static readonly DEFAULT_STEP_MS_;
    /** Default max search duration in days */
    private static readonly DEFAULT_MAX_SEARCH_DAYS_;
    /** Milliseconds per day */
    private static readonly MS_PER_DAY_;
    /** Prevent instantiation */
    private constructor();
    /**
     * Calculates all access windows between a ground observer and a space object
     * within a specified time interval.
     *
     * @param observer - The ground-based observer
     * @param target - The space object to track
     * @param start - Start of the search interval
     * @param end - End of the search interval
     * @param constraints - Optional visibility constraints
     * @param stepMs - Time step in milliseconds (default: 10000)
     * @returns Array of access windows found within the interval
     */
    static calculateAccess(observer: GroundObject, target: SpaceObject, start: Date, end: Date, constraints?: AccessConstraints, stepMs?: number): AccessWindow[];
    /**
     * Finds the next access window after a specified time.
     *
     * @param observer - The ground-based observer
     * @param target - The space object to track
     * @param after - Search for windows starting after this time
     * @param constraints - Optional visibility constraints
     * @param maxSearchDays - Maximum number of days to search (default: 7)
     * @returns The next access window, or null if none found within search period
     */
    static getNextAccess(observer: GroundObject, target: SpaceObject, after: Date, constraints?: AccessConstraints, maxSearchDays?: number): AccessWindow | null;
    /**
     * Calculates access windows for multiple targets from a single observer.
     *
     * @param observer - The ground-based observer
     * @param targets - Array of space objects to track
     * @param start - Start of the search interval
     * @param end - End of the search interval
     * @param constraints - Optional visibility constraints (applied to all targets)
     * @returns Map from target ID to array of access windows
     */
    static calculateMultiTargetAccess(observer: GroundObject, targets: SpaceObject[], start: Date, end: Date, constraints?: AccessConstraints): Map<number, AccessWindow[]>;
    /**
     * Gets the Range-Azimuth-Elevation from observer to target at the given time.
     * @internal
     */
    private static getRae_;
    /**
     * Checks if the current observation meets all constraints.
     * @internal
     */
    private static isAccessible_;
    /**
     * Creates an AccessWindow from the current state.
     * @internal
     */
    private static createWindow_;
    /**
     * Resets the state for tracking a new access window.
     * @internal
     */
    private static resetState_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * Center body for ephemeris data.
 * Extends beyond Earth to support interplanetary missions.
 * Will be extended for AstronomyEngine integration in future.
 */
declare enum CenterBody {
    EARTH = "EARTH",
    MOON = "MOON",
    SUN = "SUN",
    MARS = "MARS",
    MARS_BARYCENTER = "MARS_BARYCENTER",
    JUPITER_BARYCENTER = "JUPITER_BARYCENTER",
    SATURN_BARYCENTER = "SATURN_BARYCENTER"
}
/**
 * Gravitational parameters (km³/s²) for supported bodies.
 */
declare const CenterBodyMu: Record<CenterBody, number>;
/**
 * Maps OEM CENTER_NAME strings to CenterBody enum.
 * Handles various string formats from CCSDS OEM files.
 * @param centerName - The CENTER_NAME value from OEM metadata
 * @returns The corresponding CenterBody enum value, defaults to EARTH
 */
declare function parseCenterBody(centerName: string): CenterBody;

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Data for a single waypoint in a dynamic ground object's path.
 */
interface WaypointData {
    /** The time at which the object is at this waypoint */
    time: Date;
    /** Latitude in degrees */
    lat: Degrees;
    /** Longitude in degrees */
    lon: Degrees;
    /** Altitude in kilometers */
    alt: Kilometers;
    /** Optional metadata associated with this waypoint */
    metadata?: Record<string, unknown>;
}
/**
 * Interpolation method for calculating positions between waypoints.
 * - 'linear': Simple linear interpolation of lat/lon/alt (fastest, least accurate)
 * - 'greatCircle': Spherical linear interpolation along great circle path (recommended for surface objects)
 * - 'spline': Cubic spline interpolation for smooth paths through all waypoints
 */
type GroundInterpolationMethod = 'linear' | 'greatCircle' | 'spline';
/**
 * Parameters for constructing a DynamicGroundObject.
 */
interface DynamicGroundObjectParams extends Omit<BaseObjectParams, 'type'> {
    /** Array of waypoints defining the object's path */
    waypoints: WaypointData[];
    /** Interpolation method to use (defaults to 'greatCircle') */
    interpolationMethod?: GroundInterpolationMethod;
    /** Optional history configuration for position tracking */
    historyConfig?: HistoryConfig;
}
/**
 * Options for the DynamicGroundObject.clone() method.
 */
interface DynamicGroundObjectCloneOptions {
    /** If true, clone history entries. If false (default), start with empty history but same config. */
    cloneHistory?: boolean;
}
/**
 * A ground object that moves along Earth's surface following a series of waypoints.
 * Useful for tracking aircraft, ships, vehicles, or special events like Santa tracking.
 *
 * Unlike static GroundObject, DynamicGroundObject's position is time-dependent and
 * must be queried with a specific time.
 *
 * @example
 * ```typescript
 * // Track Santa's journey
 * const santa = new DynamicGroundObject({
 *   id: 'SANTA-2025',
 *   name: 'Santa Claus',
 *   waypoints: [
 *     { time: new Date('2025-12-24T22:00:00Z'), lat: 90 as Degrees, lon: 0 as Degrees, alt: 10 as Kilometers },
 *     { time: new Date('2025-12-24T23:00:00Z'), lat: 64.1 as Degrees, lon: -21.9 as Degrees, alt: 10 as Kilometers },
 *   ],
 *   interpolationMethod: 'greatCircle'
 * });
 *
 * // Get position at specific time
 * const position = santa.getLLA(new Date('2025-12-24T22:30:00Z'));
 * ```
 */
declare class DynamicGroundObject extends GroundObject {
    private waypoints_;
    private interpolationMethod_;
    private positionHistory_;
    private splineCoeffs_;
    constructor(params: DynamicGroundObjectParams);
    /**
     * Throws an error - use getLLA(time) for DynamicGroundObject.
     * @throws Error always
     */
    lla(): LlaVec3<Degrees, Kilometers>;
    /**
     * Throws an error - use getEcef(time) for DynamicGroundObject.
     * @throws Error always
     */
    ecef(): EcefVec3<Kilometers>;
    /**
     * Throws an error - use getEci(time) for DynamicGroundObject.
     * @throws Error always
     */
    eci(): TemeVec3<Kilometers>;
    /**
     * Gets the latitude, longitude, and altitude at a specific time.
     * Interpolates between waypoints using the configured method.
     * @param time - The time to get position for
     * @returns Position as lat/lon/alt, or null if time is outside waypoint range
     */
    getLLA(time: Date): LlaVec3<Degrees, Kilometers> | null;
    /**
     * Gets the ECEF (Earth-Centered Earth-Fixed) position at a specific time.
     * @param time - The time to get position for
     * @returns ECEF position vector, or null if time is outside waypoint range
     */
    getEcef(time: Date): EcefVec3<Kilometers> | null;
    /**
     * Gets the ECI (Earth-Centered Inertial) position at a specific time.
     * @param time - The time to get position for
     * @returns ECI position vector, or null if time is outside waypoint range
     */
    getEci(time: Date): TemeVec3<Kilometers> | null;
    /**
     * Converts position at a specific time to J2000 inertial coordinates.
     * Ground objects have zero velocity in the inertial frame (ignoring Earth rotation).
     * @param time - The time for the conversion
     * @returns J2000 state vector, or null if time is outside waypoint range
     */
    getJ2000(time: Date): J2000 | null;
    /**
     * Converts position at a specific time to Geodetic coordinates.
     * @param time - The time for the conversion
     * @returns Geodetic position, or null if time is outside waypoint range
     */
    getGeodetic(time: Date): Geodetic | null;
    /**
     * Gets the current position (using system time).
     * @returns Current lat/lon/alt, or null if current time is outside waypoint range
     */
    getCurrentLLA(): LlaVec3<Degrees, Kilometers> | null;
    /**
     * Gets the current ECI position (using system time).
     * @returns Current ECI position, or null if current time is outside waypoint range
     */
    getCurrentEci(): TemeVec3<Kilometers> | null;
    /**
     * Adds a new waypoint to the path.
     * Waypoints are automatically sorted by time.
     * @param waypoint - The waypoint to add
     */
    addWaypoint(waypoint: WaypointData): void;
    /**
     * Removes a waypoint at a specific time.
     * @param time - The exact time of the waypoint to remove
     * @returns true if a waypoint was removed, false otherwise
     */
    removeWaypoint(time: Date): boolean;
    /**
     * Returns all waypoints (copy to prevent external modification).
     */
    get waypoints(): WaypointData[];
    /**
     * Returns the number of waypoints.
     */
    get waypointCount(): number;
    /**
     * Returns the start time of the waypoint path.
     */
    get startTime(): Date;
    /**
     * Returns the end time of the waypoint path.
     */
    get endTime(): Date;
    /**
     * Checks if a given time is within the waypoint path time range.
     * @param time - The time to check
     */
    isValidAt(time: Date): boolean;
    /**
     * Returns the total duration of the waypoint path in milliseconds.
     */
    get duration(): number;
    /**
     * Enables position history tracking.
     * @param config - History configuration options
     */
    enableHistory(config?: HistoryConfig): void;
    /**
     * Disables position history tracking and clears existing history.
     */
    disableHistory(): void;
    /**
     * Returns the position history, or null if not enabled.
     * Note: This is separate from the base class history which tracks HistoricalState.
     */
    get positionHistory(): History<LlaVec3<Degrees, Kilometers>> | null;
    /**
     * Alias for positionHistory for API consistency with Satellite.
     * Returns the position history (LLA), or null if not enabled.
     *
     * Note: Unlike Satellite.history which stores ECI state (position + velocity),
     * DynamicGroundObject stores LLA positions since it moves along Earth's surface.
     *
     * @remarks
     * This shadows the base class `history` property because the types are different.
     * DynamicGroundObject tracks LLA coordinates while Satellite tracks ECI state.
     */
    get history(): History<LlaVec3<Degrees, Kilometers>> | null;
    /**
     * Returns true if position history tracking is enabled.
     */
    get isHistoryEnabled(): boolean;
    /**
     * Override to prevent use of base class history recording.
     * DynamicGroundObject uses recordPosition_ for LLA tracking instead.
     */
    protected recordToHistory(_time: Date, _state: HistoricalState): void;
    /**
     * Returns recent positions as a trail.
     * Uses history if enabled, otherwise samples from waypoints.
     * @param maxPoints - Maximum number of points to return (defaults to 100)
     * @returns Array of time/position pairs
     */
    getTrail(maxPoints?: number): Array<{
        time: Date;
        lla: LlaVec3<Degrees, Kilometers>;
    }>;
    /**
     * Returns the current interpolation method.
     */
    get interpolationMethod(): GroundInterpolationMethod;
    /**
     * Sets the interpolation method.
     * @param method - The new interpolation method
     */
    set interpolationMethod(method: GroundInterpolationMethod);
    isGroundObject(): boolean;
    /**
     * Creates a deep copy of this dynamic ground object.
     *
     * By default, history configuration is preserved but starts empty.
     * Pass `{ cloneHistory: true }` to also clone the history entries.
     *
     * @param options - Clone options
     */
    clone(options?: DynamicGroundObjectCloneOptions): DynamicGroundObject;
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Finds the two waypoints that bracket the given time.
     */
    private findBracketingWaypoints_;
    /**
     * Interpolates position between two waypoints.
     */
    private interpolate_;
    /**
     * Simple linear interpolation of lat/lon/alt.
     */
    private linearInterpolate_;
    /**
     * Great circle (spherical linear) interpolation.
     * Uses SLERP for accurate surface paths.
     */
    private greatCircleInterpolate_;
    /**
     * Cubic spline interpolation for smooth paths.
     */
    private splineInterpolate_;
    /**
     * Computes cubic spline coefficients for all segments.
     * Uses natural cubic spline (second derivative = 0 at endpoints).
     */
    private computeSplineCoefficients_;
    /**
     * Computes natural cubic spline coefficients for a series of values.
     * Returns coefficients for each segment in the form [a, b, c, d] where
     * f(u) = a + b*u + c*u^2 + d*u^3, u in [0, 1]
     */
    private computeNaturalCubicSpline_;
    /**
     * Evaluates a cubic polynomial.
     */
    private evalCubic_;
    /**
     * Unwraps longitudes to avoid discontinuities at -180/180 boundary.
     */
    private unwrapLongitudes_;
    /**
     * Normalizes longitude to [-180, 180] range.
     */
    private normalizeLongitude_;
    /**
     * Interpolates longitude with proper handling of -180/180 wrap.
     */
    private interpolateLongitude_;
    /**
     * Calculates angular distance between two points using Haversine formula.
     */
    private angularDistance_;
    /**
     * Records a position to history if enabled.
     */
    private recordPosition_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * OEM file header information from CCSDS format.
 */
interface OemHeader {
    /** OEM version number */
    CCSDS_OEM_VERS: string;
    /** Creation date of the file */
    CREATION_DATE: string;
    /** Originator of the file */
    ORIGINATOR: string;
    /** Optional message identifier */
    MESSAGE_ID?: string;
    /** Optional classification */
    CLASSIFICATION?: string;
    /** Optional comment lines from header */
    COMMENT?: string[];
}
/**
 * OEM metadata block containing object and reference frame information.
 */
interface OemMetadata {
    /** Name of the space object */
    OBJECT_NAME: string;
    /** International designator or catalog ID */
    OBJECT_ID: string;
    /** Center body name (e.g., 'EARTH', 'MARS BARYCENTER') */
    CENTER_NAME: string;
    /** Reference frame (e.g., 'EME2000', 'ICRF', 'TEME') */
    REF_FRAME: string;
    /** Time system (e.g., 'UTC', 'TDB') */
    TIME_SYSTEM: string;
    /** Start time of the data span */
    START_TIME: string;
    /** Stop time of the data span */
    STOP_TIME: string;
    /** Optional useable start time */
    USEABLE_START_TIME?: string;
    /** Optional useable stop time */
    USEABLE_STOP_TIME?: string;
    /** Optional interpolation method */
    INTERPOLATION?: string;
    /** Optional interpolation degree */
    INTERPOLATION_DEGREE?: number;
    /** Optional reference frame epoch */
    REF_FRAME_EPOCH?: string;
    /** Optional comment lines from metadata */
    COMMENT?: string[];
    /**
     * User-defined parameters from CCSDS OEM USER_DEFINED_ keywords.
     * @see CCSDS 502.0-B-3 Section 7.5.1
     */
    USER_DEFINED?: Record<string, string>;
}
/**
 * Covariance matrix data from OEM file.
 * Stores the lower triangular portion of a 6x6 covariance matrix.
 *
 * @deferred Full covariance processing deferred to future enhancement.
 * Currently only parsed and stored, not processed.
 */
interface OemCovarianceMatrix {
    /** Epoch of the covariance matrix */
    epoch: Date;
    /** Optional reference frame for covariance */
    refFrame?: string;
    /** 6x6 lower triangular matrix stored as 21 values */
    values: number[];
}
/**
 * A single OEM data block containing metadata and ephemeris.
 */
interface OemDataBlock {
    /** Metadata for this block */
    metadata: OemMetadata;
    /** Array of J2000 state vectors */
    ephemeris: J2000[];
    /** Optional covariance data (parsed but not processed) */
    covariance?: OemCovarianceMatrix[];
}
/**
 * Fully parsed OEM file structure.
 */
interface ParsedOem {
    /** File header information */
    header: OemHeader;
    /** Array of data blocks (one OEM file may contain multiple) */
    dataBlocks: OemDataBlock[];
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * Supported interpolator types for ephemeris satellites.
 *
 * Each type has different trade-offs:
 * - LAGRANGE: General purpose, good accuracy, moderate speed
 * - CHEBYSHEV: Compressed storage, very fast lookup, slightly reduced accuracy
 * - CUBIC_SPLINE: Fast and accurate, higher memory usage
 * - VERLET_BLEND: Physics-aware, highest accuracy, slowest
 */
declare enum InterpolatorType {
    /** Lagrange polynomial interpolation (default) */
    LAGRANGE = "lagrange",
    /** Chebyshev polynomial interpolation (compressed) */
    CHEBYSHEV = "chebyshev",
    /** Cubic spline interpolation */
    CUBIC_SPLINE = "cubic-spline",
    /** Verlet blend interpolation (physics-aware) */
    VERLET_BLEND = "verlet-blend"
}
/** Default interpolator type for EphemerisSatellite */
declare const DEFAULT_INTERPOLATOR = InterpolatorType.LAGRANGE;
/** Default Lagrange interpolation order */
declare const DEFAULT_LAGRANGE_ORDER = 10;

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing an EphemerisSatellite.
 */
interface EphemerisSatelliteParams extends Omit<SpaceObjectParams, 'position' | 'velocity' | 'type'> {
    /** Array of J2000 state vectors forming the ephemeris */
    ephemeris: J2000[];
    /** Center body for the ephemeris (defaults to EARTH) */
    centerBody?: CenterBody;
    /** Reference frame of the ephemeris data (defaults to J2000) */
    referenceFrame?: 'J2000' | 'TEME';
    /** Interpolator type to use (defaults to LAGRANGE) */
    interpolatorType?: InterpolatorType;
    /** Interpolation order for Lagrange (defaults to 10) */
    interpolatorOrder?: number;
    /** Optional metadata */
    metadata?: Record<string, unknown>;
}
/**
 * A satellite with position determined by interpolation of pre-computed ephemeris data.
 *
 * Unlike TLE-based satellites that use SGP4 propagation, EphemerisSatellite stores
 * a set of state vectors and interpolates between them to determine position at
 * any given time within the coverage window.
 *
 * @example
 * ```typescript
 * // Create from OEM file
 * const oemContent = fs.readFileSync('orbit.oem', 'utf-8');
 * const parsed = OemParser.parse(oemContent);
 * const sat = EphemerisSatellite.fromParsedOem(parsed);
 *
 * // Get position at specific time
 * const state = sat.getJ2000(EpochUTC.fromDateTimeString('2024-06-15T12:00:00Z'));
 * ```
 */
declare class EphemerisSatellite extends SpaceObject {
    private readonly interpolator_;
    private readonly interpolatorType_;
    private readonly ephemeris_;
    private readonly centerBody_;
    private readonly referenceFrame_;
    constructor(params: EphemerisSatelliteParams);
    /**
     * Create from parsed OEM data.
     * @param oem - Parsed OEM structure
     * @param options - Optional configuration
     * @returns New EphemerisSatellite instance
     */
    static fromParsedOem(oem: ParsedOem, options?: {
        id?: number;
        interpolatorType?: InterpolatorType;
    }): EphemerisSatellite;
    /**
     * Create from raw ephemeris array (simple factory).
     * @param name - Name for the satellite
     * @param ephemeris - Array of J2000 state vectors
     * @param options - Optional configuration
     * @returns New EphemerisSatellite instance
     */
    static fromEphemeris(name: string, ephemeris: J2000[], options?: {
        id?: number;
        centerBody?: CenterBody;
        interpolatorType?: InterpolatorType;
    }): EphemerisSatellite;
    /**
     * Returns the position and velocity in TEME frame at the given time.
     * @param date - The time to calculate position for (defaults to now)
     * @returns Position and velocity, or null if outside coverage window
     */
    eci(date?: Date): PosVel | null;
    /**
     * Returns the ECEF position at the given time.
     * @param date - The time to calculate position for (defaults to now)
     */
    ecef(date?: Date): EcefVec3<Kilometers> | null;
    /**
     * Returns the geodetic position (lat/lon/alt) at the given time.
     * @param date - The time to calculate position for (defaults to now)
     */
    lla(date?: Date): LlaVec3<Degrees, Kilometers> | null;
    /**
     * Get state in J2000 frame at given epoch.
     * @param epoch - The epoch to interpolate at
     * @returns J2000 state vector or null if outside coverage
     */
    getJ2000(epoch: EpochUTC): J2000 | null;
    /**
     * Get state in TEME frame at given epoch.
     * @param epoch - The epoch to interpolate at
     * @returns TEME state vector or null if outside coverage
     */
    getTEME(epoch: EpochUTC): TEME | null;
    /**
     * Returns J2000 coordinates at the given time.
     * @param date - The time to calculate for (defaults to now)
     * @throws Error if the date is outside the coverage window
     */
    toJ2000(date?: Date): J2000;
    /**
     * Returns ITRF coordinates at the given time.
     * @param date - The time to calculate for (defaults to now)
     * @throws Error if the date is outside the coverage window
     */
    toITRF(date?: Date): ITRF;
    /**
     * Returns classical orbital elements at the given time.
     * @param date - The time to calculate for (defaults to now)
     * @throws Error if the date is outside the coverage window
     */
    toClassicalElements(date?: Date): ClassicalElements;
    /**
     * Returns the time window covered by the ephemeris data.
     */
    get coverageWindow(): EpochWindow;
    /**
     * Check if a given epoch is within the coverage window.
     * @param epoch - The epoch to check
     */
    inCoverage(epoch: EpochUTC): boolean;
    /** The center body for this ephemeris */
    get centerBody(): CenterBody;
    /** Gravitational parameter (km³/s²) for the center body */
    get mu(): number;
    /**
     * Generate orbit path as Float32Array for WebGL rendering.
     * Format: [x0, y0, z0, t0, x1, y1, z1, t1, ...] (4 floats per point)
     *
     * @param sampleCount - Number of points to generate
     * @param startEpoch - Start of path (defaults to coverage start)
     * @param endEpoch - End of path (defaults to coverage end)
     * @returns Float32Array with position and time data
     */
    getOrbitPath(sampleCount: number, startEpoch?: EpochUTC, endEpoch?: EpochUTC): Float32Array;
    /**
     * Get raw ephemeris points as Float32Array for WebGL.
     * More efficient than interpolated path when original points suffice.
     * Format: [x0, y0, z0, t0, x1, y1, z1, t1, ...] (4 floats per point)
     */
    getEphemerisAsFloat32(): Float32Array;
    /**
     * Fast linear interpolation between adjacent ephemeris points.
     * Use for real-time animation where speed > accuracy.
     * For analysis, use getJ2000() which uses the configured StateInterpolator.
     *
     * @param epoch - The epoch to interpolate at
     * @returns Position, velocity, and state vector index, or null if outside coverage
     */
    getLinearInterpolatedState(epoch: EpochUTC): {
        position: {
            x: Kilometers;
            y: Kilometers;
            z: Kilometers;
        };
        velocity: {
            x: KilometersPerSecond;
            y: KilometersPerSecond;
            z: KilometersPerSecond;
        };
        stateVectorIndex: number;
    } | null;
    private findBracketingIndex_;
    /** Number of state vectors in the ephemeris */
    get ephemerisLength(): number;
    /**
     * Get original ephemeris point closest to given epoch.
     * Useful for accessing "truth" data without interpolation.
     * @param epoch - The epoch to find the nearest point for
     */
    getNearestEphemerisPoint(epoch: EpochUTC): J2000 | null;
    /** Size in bytes of the interpolator's cached data */
    get interpolatorSizeBytes(): number;
    /**
     * Creates a deep copy of this satellite.
     * @param _options - Unused, provided for compatibility with base class
     */
    clone(_options?: Record<string, unknown>): EphemerisSatellite;
    protected serializeSpecific(): Record<string, unknown>;
    toString(): string;
    private createInterpolator_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

interface LandObjectParams extends BaseObjectParams {
    lat: Degrees;
    lon: Degrees;
    alt: Kilometers;
    country?: string;
    Code?: string;
}
declare class LandObject extends BaseObject {
    readonly lat: Degrees;
    readonly lon: Degrees;
    readonly alt: Kilometers;
    country?: string;
    Code?: string;
    constructor(info: LandObjectParams);
    isLandObject(): boolean;
    /**
     * Returns type-specific serialization data.
     */
    protected serializeSpecific(): Record<string, unknown>;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class Marker extends BaseObject {
    isMarker(): boolean;
    /**
     * Returns type-specific serialization data.
     */
    protected serializeSpecific(): Record<string, unknown>;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class Star extends BaseObject {
    ra: Radians;
    dec: Radians;
    bf: string;
    h: string;
    pname: string;
    vmag?: number;
    constellation?: string;
    colorTemp?: number;
    hr?: number;
    flamsteed?: string;
    bayer?: string;
    constructor(info: StarObjectParams);
    eci(lla?: LlaVec3, date?: Date): TemeVec3;
    rae(lla?: LlaVec3<Degrees, Kilometers>, date?: Date): RaeVec3;
    /**
     * Creates a deep copy of this star.
     */
    clone(): Star;
    /**
     * Returns type-specific serialization data.
     */
    protected serializeSpecific(): Record<string, unknown>;
    private static calculateTimeVariables_;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * A point on an orbit track with position, velocity, and altitude.
 */
interface OrbitTrackPoint {
    time: Date;
    position: TemeVec3;
    velocity: TemeVec3<KilometersPerSecond>;
    altitude: Kilometers;
}
/**
 * A point on a ground track with geodetic coordinates.
 */
interface GroundTrackPoint {
    time: Date;
    lat: Degrees;
    lon: Degrees;
    alt: Kilometers;
}
/**
 * A point on a field of view boundary with cached ECEF coordinates.
 * ECEF coordinates are cached for fast conversion to TEME at render time
 * using `ecef2eci(point.ecef, gmst)`.
 */
interface FovBoundaryPoint {
    az: Degrees;
    el: Degrees;
    range: Kilometers;
    ecef: EcefVec3<Kilometers>;
}
/**
 * Static utility class for generating visualization data for satellites, ground tracks,
 * and sensor fields of view.
 */
declare class VisualizationHelpers {
    private constructor();
    /**
     * Converts history entries to a time series using an extractor function.
     * @param history - The history object to convert
     * @param extractor - Function to extract a value from each history entry
     * @returns Array of time-value pairs
     * @example
     * ```typescript
     * // Extract altitude over time
     * const altitudes = VisualizationHelpers.historyToTimeSeries(
     *   satellite.history!,
     *   (entry) => Math.sqrt(
     *     entry.data.position.x ** 2 +
     *     entry.data.position.y ** 2 +
     *     entry.data.position.z ** 2
     *   ) - 6378.137 as Kilometers
     * );
     * ```
     */
    static historyToTimeSeries<T, R>(history: History<T>, extractor: (entry: {
        time: Date;
        data: T;
    }) => R): Array<{
        time: Date;
        value: R;
    }>;
    /**
     * Generates orbit track points for a satellite over multiple orbital periods.
     * @param satellite - The satellite to generate the orbit track for
     * @param start - Start time for the orbit track
     * @param periods - Number of orbital periods to generate (default: 1)
     * @param samplesPerPeriod - Number of sample points per period (default: 90)
     * @example
     * ```typescript
     * import { Satellite, VisualizationHelpers } from 'ootk';
     *
     * const satellite = new Satellite({ tle });
     *
     * // Generate one full orbit with 90 points
     * const track = VisualizationHelpers.generateOrbitTrack(
     *   satellite,
     *   new Date(),
     *   1,    // 1 orbital period
     *   90    // 90 sample points (4-degree spacing)
     * );
     *
     * // Use points for 3D visualization (e.g., Three.js, Cesium)
     * track.forEach(point => {
     *   console.log(`Time: ${point.time.toISOString()}`);
     *   console.log(`  Position: [${point.position.x}, ${point.position.y}, ${point.position.z}] km`);
     *   console.log(`  Altitude: ${point.altitude.toFixed(1)} km`);
     * });
     *
     * // Generate 3 orbits for longer visualization
     * const extendedTrack = VisualizationHelpers.generateOrbitTrack(satellite, new Date(), 3, 120);
     * ```
     * @returns Array of orbit track points with position, velocity, and altitude
     */
    static generateOrbitTrack(satellite: Satellite, start: Date, periods?: number, samplesPerPeriod?: number): OrbitTrackPoint[];
    /**
     * Generates ground track points (sub-satellite points) for a satellite.
     * @param satellite - The satellite to generate the ground track for
     * @param start - Start time for the ground track
     * @param end - End time for the ground track
     * @param stepMs - Time step in milliseconds (default: 60000 = 1 minute)
     * @returns Array of ground track points with lat/lon/alt
     */
    static generateGroundTrack(satellite: Satellite, start: Date, end: Date, stepMs?: number): GroundTrackPoint[];
    /**
     * Generates FOV boundary points for a sensor in ECEF coordinates.
     * The ECEF coordinates are cached for fast conversion to TEME at render time.
     *
     * @param sensor - The sensor to generate the FOV boundary for (must have a parent platform)
     * @param samples - Number of sample points around the boundary (default: 72)
     * @param atRange - Range at which to sample the boundary (default: sensor's maxRange)
     * @returns Array of FOV boundary points with az/el and cached ECEF coordinates
     * @throws Error if sensor has no parent platform
     * @example
     * ```typescript
     * // Generate boundary once (cached in ECEF)
     * const boundary = VisualizationHelpers.generateFOVBoundary(sensor, 72);
     *
     * // Convert to TEME at any time
     * const gmst = gstime(jday(renderDate));
     * const temePoints = boundary.map(pt => ({
     *   ...pt,
     *   teme: ecef2eci(pt.ecef, gmst)
     * }));
     * ```
     */
    static generateFOVBoundary(sensor: Sensor, samples?: number, atRange?: Kilometers): FovBoundaryPoint[];
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/** Represents the nutation angles. */
type NutationAngles = {
    /** The nutation in longitude (Δψ) in radians. */
    dPsi: Radians;
    /** The nutation in obliquity (Δε) in radians. */
    dEps: Radians;
    /** The mean obliquity of the ecliptic (ε₀) in radians. */
    mEps: Radians;
    /** The true obliquity of the ecliptic (ε) in radians. */
    eps: Radians;
    /** The equation of the equinoxes (ΔΔt) in radians. */
    eqEq: Radians;
    /** The Greenwich Apparent Sidereal Time (GAST) in radians. */
    gast: Radians;
};

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/** Represents the precession angles in radians. */
type PrecessionAngles = {
    zeta: Radians;
    theta: Radians;
    zed: Radians;
};

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class Earth {
    private constructor();
    static readonly mu: number;
    static readonly radiusEquator: Kilometers;
    static readonly flattening: number;
    static readonly radiusPolar: Kilometers;
    static readonly radiusMean: Kilometers;
    static readonly eccentricitySquared: number;
    static readonly j2: number;
    static readonly j3: number;
    static readonly j4: number;
    static readonly j5: number;
    static readonly j6: number;
    static readonly rotation: Vector3D<RadiansPerSecond>;
    static smaToMeanMotion(semimajorAxis: Kilometers): RadiansPerSecond;
    /**
     * Converts revolutions per day to semi-major axis.
     * @param rpd - The number of revolutions per day.
     * @returns The semi-major axis value.
     */
    static revsPerDayToSma(rpd: number): number;
    static precession(epoch: EpochUTC): PrecessionAngles;
    static nutation(epoch: EpochUTC): NutationAngles;
    static smaToDrift(semimajorAxis: number): number;
    static smaToDriftDegrees(semimajorAxis: number): number;
    static driftToSemimajorAxis(driftRate: number): number;
    static driftDegreesToSma(driftRate: number): number;
    /**
     * Calculates the diameter of the Earth based on the satellite position.
     * @param satPos The position of the satellite.
     * @returns The diameter of the Earth.
     */
    static diameter(satPos: Vector3D): number;
    private static readonly zetaPoly_;
    private static readonly thetaPoly_;
    private static readonly zedPoly_;
    private static readonly moonAnomPoly_;
    private static readonly sunAnomPoly_;
    private static readonly moonLatPoly_;
    private static readonly sunElongPoly_;
    private static readonly moonRaanPoly_;
    private static readonly meanEpsilonPoly_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * Classification of celestial bodies in the solar system.
 */
declare enum CelestialBodyType {
    /** The Sun - center of the solar system */
    STAR = "star",
    /** Mercury, Venus, Earth, Mars */
    TERRESTRIAL_PLANET = "terrestrial_planet",
    /** Jupiter, Saturn */
    GAS_GIANT = "gas_giant",
    /** Uranus, Neptune */
    ICE_GIANT = "ice_giant",
    /** Pluto, Ceres, Eris, Makemake, Haumea */
    DWARF_PLANET = "dwarf_planet",
    /** Natural satellites (Earth's Moon, Jupiter's moons, etc.) */
    MOON = "moon",
    /** Minor planets, NEOs */
    ASTEROID = "asteroid",
    /** Periodic and non-periodic comets */
    COMET = "comet"
}
/**
 * Maps astronomy-engine Body enum to CelestialBodyType.
 */
declare const bodyTypeLookup: Record<string, CelestialBodyType>;

/**
 * @brief String constants that represent the solar system bodies supported by Astronomy Engine.
 *
 * The following strings represent solar system bodies supported by various Astronomy Engine functions.
 * Not every body is supported by every function; consult the documentation for each function
 * to find which bodies it supports.
 *
 * "Sun", "Moon", "Mercury", "Venus", "Earth", "Mars", "Jupiter",
 * "Saturn", "Uranus", "Neptune", "Pluto",
 * "SSB" (Solar System Barycenter),
 * "EMB" (Earth/Moon Barycenter)
 *
 * You can also use enumeration syntax for the bodies, like
 * `Astronomy.Body.Moon`, `Astronomy.Body.Jupiter`, etc.
 *
 * @enum {string}
 */
declare enum Body {
    Sun = "Sun",
    Moon = "Moon",
    Mercury = "Mercury",
    Venus = "Venus",
    Earth = "Earth",
    Mars = "Mars",
    Jupiter = "Jupiter",
    Saturn = "Saturn",
    Uranus = "Uranus",
    Neptune = "Neptune",
    Pluto = "Pluto",
    SSB = "SSB",
    EMB = "EMB",
    Star1 = "Star1",
    Star2 = "Star2",
    Star3 = "Star3",
    Star4 = "Star4",
    Star5 = "Star5",
    Star6 = "Star6",
    Star7 = "Star7",
    Star8 = "Star8"
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Configuration options for CelestialBody.
 */
interface CelestialBodyParams extends BaseObjectParams {
    /** The celestial body type */
    bodyType: CelestialBodyType;
    /** Gravitational parameter (km³/s²) */
    mu?: number;
    /** Mean radius (km) */
    radius?: Kilometers;
    /** astronomy-engine Body identifier */
    astronomyBody?: Body;
}
/**
 * Rise/set/transit times for a celestial body.
 */
interface RiseSetTimes {
    /** Time when body rises above horizon (null if circumpolar or never rises) */
    rise: Date | null;
    /** Time when body reaches highest point */
    transit: Date | null;
    /** Time when body sets below horizon (null if circumpolar or never sets) */
    set: Date | null;
}
/**
 * Abstract base class for all celestial bodies in the solar system.
 *
 * CelestialBody uses astronomy-engine for high-precision calculations of
 * positions, rise/set times, and other astronomical phenomena.
 *
 * @example
 * ```typescript
 * // Get the Sun's position
 * const sunPos = Sun.eci(new Date());
 *
 * // Get rise/set times for Mars
 * const marsRiseSet = Mars.getRiseSetTimes(groundStation, new Date());
 * ```
 */
declare abstract class CelestialBody extends BaseObject {
    /** The type of celestial body */
    bodyType: CelestialBodyType;
    /** Gravitational parameter (km³/s²) */
    mu?: number;
    /** Mean radius (km) */
    radius?: Kilometers;
    /** astronomy-engine Body identifier for calculated bodies */
    protected astronomyBody_?: Body;
    constructor(params: CelestialBodyParams);
    /**
     * Gets the body's position in Earth-Centered Inertial (J2000) coordinates.
     * @param date - The date/time for the position calculation
     * @returns Position vector in kilometers
     */
    abstract eci(date?: Date): Vector3D<Kilometers>;
    /**
     * Gets the body's position in heliocentric coordinates.
     * @param date - The date/time for the position calculation
     * @returns Position vector in kilometers (Sun-centered)
     */
    abstract heliocentric(date?: Date): Vector3D<Kilometers>;
    /**
     * Gets the body's velocity vector if available.
     * @param date - The date/time for the velocity calculation
     * @returns Velocity vector in km/s, or null if not available
     */
    abstract velocity(date?: Date): Vector3D | null;
    /**
     * Gets the right ascension of the body as seen from Earth.
     * @param date - The date/time for the calculation
     * @returns Right ascension in radians
     */
    getRightAscension(date?: Date): Radians;
    /**
     * Gets the declination of the body as seen from Earth.
     * @param date - The date/time for the calculation
     * @returns Declination in radians
     */
    getDeclination(date?: Date): Radians;
    /**
     * Gets the azimuth and altitude of the body as seen from a ground location.
     * @param observer - The ground observer location
     * @param date - The date/time for the calculation
     * @param refraction - Whether to apply atmospheric refraction correction
     * @returns Object with azimuth and altitude in degrees
     */
    getAzEl(observer: GroundObject, date?: Date, refraction?: boolean): {
        az: Degrees;
        el: Degrees;
    };
    /**
     * Gets the distance from Earth to this body.
     * @param date - The date/time for the calculation
     * @returns Distance in kilometers
     */
    getDistanceFromEarth(date?: Date): Kilometers;
    /**
     * Gets the distance from the Sun to this body.
     * @param date - The date/time for the calculation
     * @returns Distance in kilometers
     */
    getDistanceFromSun(date?: Date): Kilometers;
    /**
     * Gets rise, transit, and set times for this body as seen from a ground location.
     * @param observer - The ground observer location
     * @param date - The starting date for the search
     * @param minElevation - Minimum elevation angle in degrees (default 0)
     * @returns Rise, transit, and set times (null if body doesn't rise/set)
     */
    getRiseSetTimes(observer: GroundObject, date?: Date, minElevation?: Degrees): RiseSetTimes;
    /**
     * Calculates the angular diameter of this body as seen from a given position.
     * @param observerPos - The observer's position in km
     * @returns Angular diameter in radians
     */
    getAngularDiameter(observerPos: Vector3D<Kilometers>): Radians;
    /**
     * Calculates the angular separation between this body and a target position.
     * @param targetPos - The target position in ECI coordinates (km)
     * @param date - The date/time for the calculation
     * @returns Angular separation in degrees
     */
    getAngularSeparation(targetPos: Vector3D<Kilometers>, date?: Date): Degrees;
    /**
     * Converts astronomy-engine GeoVector (AU) to Vector3D (km).
     */
    protected geoVectorToKm(body: Body, date: Date): Vector3D<Kilometers>;
    /**
     * Converts astronomy-engine HelioVector (AU) to Vector3D (km).
     */
    protected helioVectorToKm(body: Body, date: Date): Vector3D<Kilometers>;
    protected serializeSpecific(): Record<string, unknown>;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Sun physical and orbital constants, plus satellite shadow calculations.
 *
 * SunBody provides:
 * - High-precision position calculations via astronomy-engine
 * - Satellite eclipse/shadow detection
 * - Illumination fraction calculations for solar radiation pressure
 * - Sunrise/sunset/twilight times for ground observers
 *
 * @example
 * ```typescript
 * // Get Sun position
 * const sunPos = Sun.eci(new Date());
 *
 * // Check if satellite is in shadow
 * const inShadow = Sun.shadow(epoch, satellitePos);
 *
 * // Get sunrise/sunset times
 * const times = Sun.getTimes(new Date(), 40.7 as Degrees, -74 as Degrees);
 * ```
 */
declare class SunBody extends CelestialBody {
    /** Gravitational parameter (km³/s²) */
    static readonly MU = 132712428000;
    /** Mean radius (km) */
    static readonly RADIUS: Kilometers;
    /** Penumbra cone half-angle (radians) */
    static readonly PENUMBRA_ANGLE: Radians;
    /** Umbra cone half-angle (radians) */
    static readonly UMBRA_ANGLE: Radians;
    /** Mean solar flux at 1 AU (W/m²) */
    static readonly SOLAR_FLUX = 1367;
    /** Solar radiation pressure at 1 AU (N/m²) */
    static readonly SOLAR_PRESSURE: number;
    /** Obliquity of the ecliptic (radians) */
    static readonly OBLIQUITY: Radians;
    private static readonly J0_;
    private static readonly J1970_;
    private static readonly J2000_;
    /** Sun time calculation thresholds */
    private static readonly times_;
    private static instance_;
    /**
     * Gets the singleton Sun instance.
     */
    static getInstance(): SunBody;
    private constructor();
    /**
     * Gets the Sun's position in Earth-Centered Inertial (J2000) coordinates.
     * @param date - The date/time for the position calculation
     * @returns Position vector in kilometers
     */
    eci(date?: Date): Vector3D<Kilometers>;
    /**
     * Gets the Sun's apparent position (corrected for light travel time).
     * @param date - The date/time for the position calculation
     * @returns Position vector in kilometers
     */
    eciApparent(date?: Date): Vector3D<Kilometers>;
    /**
     * Gets the Sun's position in heliocentric coordinates.
     * For the Sun itself, this is always the origin.
     * @returns Zero vector (Sun is at heliocentric origin)
     */
    heliocentric(_date?: Date): Vector3D<Kilometers>;
    /**
     * Sun's velocity is not typically needed, returns null.
     */
    velocity(_date?: Date): Vector3D | null;
    /**
     * Calculates the angle at sat2 between sat1 and the Sun.
     *
     * This computes the angle between the vector from sat2 to the Sun
     * and the vector from sat2 to sat1.
     *
     * @param sat1Pos - ECI position of the first satellite in km.
     * @param sat2Pos - ECI position of the second satellite (vertex) in km.
     * @param sunPos - ECI position of the Sun in km.
     * @returns The angle in radians.
     *
     * @example
     * ```ts
     * const sunPos = Sun.position(epoch);
     * const angle = Sun.angleBetweenSatellites(sat1.position, sat2.position, sunPos);
     * const angleDeg = angle * RAD2DEG;
     * ```
     */
    static angleBetweenSatellites(sat1Pos: Vector3D<Kilometers>, sat2Pos: Vector3D<Kilometers>, sunPos: Vector3D<Kilometers>): Radians;
    /**
     * Calculates the Sun-Satellite-Earth angle with vertex at the satellite.
     *
     * This computes the angle between the vector from the satellite to the Sun
     * and the vector from the satellite to the Earth (Earth is at origin in ECI).
     *
     * @param satPos - ECI position of the satellite in km.
     * @param sunPos - ECI position of the Sun in km.
     * @returns The angle in degrees.
     *
     * @example
     * ```ts
     * const sunPos = Sun.position(epoch);
     * const angle = Sun.sunSatEarthAngle(sat.position, sunPos);
     * // angle is in degrees, useful for determining if satellite is between Earth and Sun
     * ```
     */
    static sunSatEarthAngle(satPos: Vector3D<Kilometers>, sunPos: Vector3D<Kilometers>): Degrees;
    /**
     * Determines if a satellite is in Earth's shadow.
     * @param epoch - The epoch for the calculation
     * @param satPos - The satellite's ECI position in kilometers
     * @example
     * ```typescript
     * import { Sun, Satellite, EpochUTC, Vector3D, Kilometers, Seconds } from 'ootk';
     *
     * const satellite = new Satellite({ tle });
     * const now = new Date();
     * const epoch = new EpochUTC((now.getTime() / 1000) as Seconds);
     *
     * const pv = satellite.eci(now);
     * if (pv) {
     *   const satPos = new Vector3D<Kilometers>(
     *     pv.position.x as Kilometers,
     *     pv.position.y as Kilometers,
     *     pv.position.z as Kilometers
     *   );
     *
     *   const inShadow = Sun.shadow(epoch, satPos);
     *   console.log(inShadow ? 'Satellite is in eclipse' : 'Satellite is sunlit');
     *
     *   // For more detail, use lightingRatio
     *   const sunPos = Sun.eci(now);
     *   const lighting = Sun.lightingRatio(satPos, sunPos);
     *   console.log(`Lighting: ${(lighting * 100).toFixed(1)}%`);
     * }
     * ```
     * @returns True if satellite is in shadow (eclipse)
     */
    shadow(epoch: EpochUTC, satPos: Vector3D<Kilometers>): boolean;
    /**
     * Calculates eclipse angles for satellite shadow determination.
     * @param satPos - The satellite's ECI position in kilometers
     * @param sunPos - The Sun's ECI position in kilometers
     * @returns [central body angle, central body apparent radius, sun apparent radius] in radians
     */
    eclipseAngles(satPos: Vector3D<Kilometers>, sunPos: Vector3D<Kilometers>): [Radians, Radians, Radians];
    /**
     * Calculates the lighting ratio for a satellite position.
     *
     * Returns 1.0 for full illumination, 0.0 for full eclipse (umbra),
     * and intermediate values for penumbra.
     *
     * @param satPos - The satellite's ECI position in kilometers
     * @param sunPos - The Sun's ECI position in kilometers
     * @returns Lighting ratio from 0.0 (full eclipse) to 1.0 (full illumination)
     */
    lightingRatio(satPos: Vector3D<Kilometers>, sunPos: Vector3D<Kilometers>): number;
    /**
     * Calculates the Sun's angular diameter as seen from a position.
     * @param obsPos - Observer position in kilometers
     * @returns Angular diameter in radians
     */
    diameter(obsPos: Vector3D<Kilometers>): Radians;
    /**
     * Calculates comprehensive sun times for a given location and date.
     *
     * @param dateVal - The date for calculation
     * @param lat - Latitude in degrees
     * @param lon - Longitude in degrees
     * @param alt - Altitude in meters (default 0)
     * @param isUtc - If true, treat date as UTC (default false)
     * @example
     * ```typescript
     * import { Sun, Degrees, Meters } from 'ootk';
     *
     * // Get sun times for a ground station
     * const times = Sun.getTimes(
     *   new Date('2024-06-21'),
     *   40.0 as Degrees,    // latitude
     *   -75.0 as Degrees,   // longitude
     *   100 as Meters       // altitude
     * );
     *
     * console.log(`Sunrise: ${times.sunriseStart.toLocaleTimeString()}`);
     * console.log(`Sunset: ${times.sunsetEnd.toLocaleTimeString()}`);
     * console.log(`Solar noon: ${times.solarNoon.toLocaleTimeString()}`);
     *
     * // For optical satellite tracking, check astronomical twilight
     * console.log(`Astronomical dawn: ${times.astronomicalDawn.toLocaleTimeString()}`);
     * console.log(`Astronomical dusk: ${times.astronomicalDusk.toLocaleTimeString()}`);
     *
     * // Golden hour for photography
     * console.log(`Golden hour starts: ${times.goldenHourDuskStart.toLocaleTimeString()}`);
     * ```
     * @returns Object with all sun event times
     */
    getTimes(dateVal: Date | number, lat: Degrees, lon: Degrees, alt?: Meters, isUtc?: boolean): SunTime;
    /**
     * Gets sunrise and sunset times using astronomy-engine.
     * @param observer - Ground observer location
     * @param date - The date for calculation
     * @param minElevation - Minimum elevation in degrees (default -0.833 for standard sunrise)
     */
    getSunriseSunset(observer: GroundObject, date?: Date, minElevation?: Degrees): {
        sunrise: Date | null;
        sunset: Date | null;
    };
    private date2jSince2000;
    private julian2date;
    private solarMeanAnomaly_;
    private eclipticLongitude_;
    private declination_;
    private julianCycle_;
    private approxTransit_;
    private solarTransitJulian_;
    private hourAngle_;
    private observerAngle_;
    private calculateJnoon_;
    private getSetJ_;
}
/**
 * Pre-instantiated Sun singleton for convenience.
 *
 * @example
 * ```typescript
 * import { Sun } from 'ootk';
 *
 * const sunPos = Sun.eci(new Date());
 * const inShadow = Sun.shadow(epoch, satellitePos);
 * ```
 */
declare const Sun: SunBody;

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Moon phase information with display data.
 */
interface MoonPhaseInfo {
    /** Illuminated fraction (0-1) */
    fraction: number;
    /** Phase details with emoji and name */
    phase: {
        from: number;
        to: number;
        id: string;
        emoji: string;
        code: string;
        name: string;
        weight: number;
        css: string;
    };
    /** Phase value (0-1) */
    phaseValue: number;
    /** Phase angle in radians */
    angle: number;
    /** Next phase event times */
    next: {
        value: number;
        date: string;
        type: string;
        newMoon: {
            value: number;
            date: string;
        };
        fullMoon: {
            value: number;
            date: string;
        };
        firstQuarter: {
            value: number;
            date: string;
        };
        thirdQuarter: {
            value: number;
            date: string;
        };
    };
}
/**
 * Moon rise/set times result.
 */
interface MoonTimes {
    rise: Date | null;
    set: Date | null;
    ye: number | null;
    alwaysUp: boolean | null;
    alwaysDown: boolean | null;
    highest: Date | null;
}
/**
 * Libration information for the Moon.
 */
interface LibrationData {
    /** Sub-Earth libration ecliptic latitude (degrees) */
    elat: number;
    /** Sub-Earth libration ecliptic longitude (degrees) */
    elon: number;
    /** Moon's geocentric ecliptic latitude (degrees) */
    mlat: number;
    /** Moon's geocentric ecliptic longitude (degrees) */
    mlon: number;
    /** Distance to Moon (km) */
    distanceKm: Kilometers;
    /** Apparent angular diameter (degrees) */
    diameterDeg: Degrees;
}
/**
 * Moon body with position calculations and phase information.
 *
 * MoonBody provides:
 * - High-precision position calculations via astronomy-engine
 * - Moon phase and illumination calculations
 * - Moonrise/moonset times
 * - Libration data
 *
 * @example
 * ```typescript
 * // Get Moon position
 * const moonPos = Moon.eci(new Date());
 *
 * // Get moon phase
 * const phase = Moon.getPhase(new Date());
 *
 * // Get moonrise/moonset
 * const times = Moon.getMoonTimes(new Date(), observer);
 * ```
 */
declare class MoonBody extends CelestialBody {
    /** Gravitational parameter (km³/s²) */
    static readonly MU = 4902.799;
    /** Equatorial radius (km) */
    static readonly RADIUS: Kilometers;
    private static readonly moonCycles_;
    private static instance_;
    /**
     * Gets the singleton Moon instance.
     */
    static getInstance(): MoonBody;
    private constructor();
    /**
     * Gets the Moon's position in Earth-Centered Inertial (J2000) coordinates.
     * @param date - The date/time for the position calculation
     * @returns Position vector in kilometers
     */
    eci(date?: Date): Vector3D<Kilometers>;
    /**
     * Gets the Moon's position in heliocentric coordinates.
     * @param date - The date/time for the position calculation
     * @returns Position vector in kilometers (Sun-centered)
     */
    heliocentric(date?: Date): Vector3D<Kilometers>;
    /**
     * Moon's velocity is not provided by astronomy-engine, returns null.
     */
    velocity(_date?: Date): Vector3D | null;
    /**
     * Gets the Moon's illumination fraction as seen from a position.
     * @param date - The date/time for the calculation
     * @param origin - Optional observer position (defaults to Earth center)
     * @returns Illumination fraction (0-1)
     */
    getIlluminationFraction(date?: Date, origin?: Vector3D<Kilometers>): number;
    /**
     * Gets the current moon phase angle (0-360 degrees).
     * 0 = new moon, 90 = first quarter, 180 = full moon, 270 = third quarter
     * @param date - The date/time for the calculation
     * @returns Phase angle in degrees
     */
    getPhaseAngle(date?: Date): Degrees;
    /**
     * Gets detailed moon phase information including emoji and next phase times.
     * @param date - The date/time for the calculation
     * @returns Detailed phase information
     */
    getPhase(date?: Date | number): MoonPhaseInfo;
    /**
     * Gets moonrise and moonset times for a ground location.
     * @param date - The date for calculation
     * @param observer - Ground observer location
     * @param isUtc - If true, treat date as UTC
     * @returns Moonrise/moonset times and visibility info
     */
    getMoonTimes(date: Date, observer: GroundObject, isUtc?: boolean): MoonTimes;
    /**
     * Gets the Moon's libration data.
     * @param date - The date/time for the calculation
     * @returns Libration angles and Moon position data
     */
    getLibration(date?: Date): LibrationData;
    /**
     * Gets the Moon's angular diameter.
     * @param date - The date/time for the calculation
     * @returns Angular diameter in degrees
     */
    getAngularDiameterDeg(date?: Date): Degrees;
    private static readonly J1970_;
    private static readonly J2000_;
    private static readonly OBLIQUITY_;
    private date2jSince2000_;
    private sunCoords_;
    private moonCoords_;
}
/**
 * Pre-instantiated Moon singleton for convenience.
 *
 * @example
 * ```typescript
 * import { Moon } from 'ootk';
 *
 * const moonPos = Moon.eci(new Date());
 * const phase = Moon.getPhase(new Date());
 * ```
 */
declare const Moon: MoonBody;

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Planet body for Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, and Pluto.
 *
 * PlanetBody provides:
 * - High-precision position and velocity calculations via astronomy-engine
 * - Visual magnitude and illumination data
 * - Phase angle calculations
 *
 * @example
 * ```typescript
 * // Get Mars position
 * const marsPos = Mars.eci(new Date());
 *
 * // Get Jupiter's visual magnitude
 * const mag = Jupiter.getVisualMagnitude(new Date());
 *
 * // Get rise/set times for Saturn
 * const times = Saturn.getRiseSetTimes(groundStation, new Date());
 * ```
 */
declare class PlanetBody extends CelestialBody {
    private planetData_;
    private constructor();
    /**
     * Creates a PlanetBody instance for the specified planet.
     * @param name - Planet name (Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto)
     */
    static create(name: string): PlanetBody;
    /** Mercury */
    static Mercury(): PlanetBody;
    /** Venus */
    static Venus(): PlanetBody;
    /** Earth (for heliocentric reference) */
    static Earth(): PlanetBody;
    /** Mars */
    static Mars(): PlanetBody;
    /** Jupiter */
    static Jupiter(): PlanetBody;
    /** Saturn */
    static Saturn(): PlanetBody;
    /** Uranus */
    static Uranus(): PlanetBody;
    /** Neptune */
    static Neptune(): PlanetBody;
    /** Pluto */
    static Pluto(): PlanetBody;
    /**
     * Gets the planet's position in Earth-Centered Inertial (J2000) coordinates.
     * @param date - The date/time for the position calculation
     * @returns Position vector in kilometers
     */
    eci(date?: Date): Vector3D<Kilometers>;
    /**
     * Gets the planet's position in heliocentric coordinates.
     * @param date - The date/time for the position calculation
     * @returns Position vector in kilometers (Sun-centered)
     */
    heliocentric(date?: Date): Vector3D<Kilometers>;
    /**
     * Gets the planet's velocity in heliocentric coordinates.
     * @param date - The date/time for the velocity calculation
     * @returns Velocity vector in km/s
     */
    velocity(date?: Date): Vector3D<KilometersPerSecond>;
    /**
     * Gets the planet's visual magnitude as seen from Earth.
     * @param date - The date/time for the calculation
     * @returns Visual magnitude (lower = brighter)
     */
    getVisualMagnitude(date?: Date): number;
    /**
     * Gets the planet's phase angle as seen from Earth.
     * @param date - The date/time for the calculation
     * @returns Phase angle in degrees (0 = full illumination, 180 = backlit)
     */
    getPhaseAngle(date?: Date): Degrees;
    /**
     * Gets the planet's illuminated fraction as seen from Earth.
     * @param date - The date/time for the calculation
     * @returns Illuminated fraction (0-1)
     */
    getIlluminatedFraction(date?: Date): number;
    /**
     * Gets the planet's heliocentric distance.
     * @param date - The date/time for the calculation
     * @returns Distance in AU
     */
    getHeliocentricDistanceAU(date?: Date): number;
    /**
     * Gets the planet's geocentric distance.
     * @param date - The date/time for the calculation
     * @returns Distance in AU
     */
    getGeocentricDistanceAU(date?: Date): number;
}
/** Mercury singleton */
declare const Mercury: PlanetBody;
/** Venus singleton */
declare const Venus: PlanetBody;
/** Mars singleton */
declare const Mars: PlanetBody;
/** Jupiter singleton */
declare const Jupiter: PlanetBody;
/** Saturn singleton */
declare const Saturn: PlanetBody;
/** Uranus singleton */
declare const Uranus: PlanetBody;
/** Neptune singleton */
declare const Neptune: PlanetBody;
/** Pluto singleton */
declare const Pluto: PlanetBody;

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Ephemeris data point for a celestial body.
 */
interface EphemerisDataPoint {
    /** Epoch for this state */
    epoch: EpochUTC;
    /** Position in J2000 heliocentric or geocentric coordinates (km) */
    position: Vector3D<Kilometers>;
    /** Velocity (km/s), optional */
    velocity?: Vector3D<KilometersPerSecond>;
}
/**
 * Interpolation method for ephemeris data.
 */
type EphemerisInterpolationType = 'lagrange' | 'spline';
/**
 * Parameters for constructing an EphemerisBody.
 */
interface EphemerisBodyParams extends Omit<CelestialBodyParams, 'astronomyBody'> {
    /** Array of ephemeris data points */
    ephemeris: EphemerisDataPoint[];
    /** Whether positions are heliocentric (true) or geocentric (false, default) */
    isHeliocentric?: boolean;
    /** Interpolation method (default: lagrange) */
    interpolationType?: EphemerisInterpolationType;
    /** Interpolation order for Lagrange (default: 8) */
    interpolationOrder?: number;
}
/**
 * A celestial body with position determined by interpolation of ephemeris data.
 *
 * EphemerisBody is used for objects that don't have analytical position models
 * in astronomy-engine, such as:
 * - Dwarf planets (Ceres, Makemake, Haumea, Eris)
 * - Asteroids
 * - Comets
 * - Any object with NASA Horizons ephemeris data
 *
 * @example
 * ```typescript
 * // Create from Horizons data
 * const ephemerisData = HorizonsParser.parse(horizonsOutput);
 * const ceres = new EphemerisBody({
 *   id: 'ceres',
 *   name: 'Ceres',
 *   bodyType: CelestialBodyType.DWARF_PLANET,
 *   ephemeris: ephemerisData,
 *   isHeliocentric: true,
 * });
 *
 * // Get position at specific time
 * const pos = ceres.heliocentric(new Date('2025-06-15T12:00:00Z'));
 * ```
 */
declare class EphemerisBody extends CelestialBody {
    private readonly interpolator_;
    private readonly ephemeris_;
    private readonly isHeliocentric_;
    private readonly validityStart_;
    private readonly validityEnd_;
    constructor(params: EphemerisBodyParams);
    /**
     * Checks if a given time is within the ephemeris validity window.
     * @param date - The date to check
     * @returns True if the time is within the validity window
     */
    isValidAt(date: Date): boolean;
    /**
     * Gets the validity window for this ephemeris.
     * @returns Start and end dates of the validity window
     */
    getValidityWindow(): {
        start: Date;
        end: Date;
    };
    /**
     * Validates that a time is within the ephemeris validity window.
     * @param date - The date to validate
     * @throws Error if the time is outside the validity window
     */
    private validateTime_;
    /**
     * Gets the body's position in Earth-Centered Inertial (J2000) coordinates.
     * @param date - The date/time for the position calculation
     * @returns Position vector in kilometers
     */
    eci(date?: Date): Vector3D<Kilometers>;
    /**
     * Gets the body's position in heliocentric coordinates.
     * @param date - The date/time for the position calculation
     * @returns Position vector in kilometers (Sun-centered)
     */
    heliocentric(date?: Date): Vector3D<Kilometers>;
    /**
     * Gets the body's velocity if available.
     * @param date - The date/time for the velocity calculation
     * @returns Velocity vector in km/s, or null if not available
     */
    velocity(date?: Date): Vector3D<KilometersPerSecond> | null;
    /**
     * Creates an EphemerisBody from an array of position/velocity data.
     * @param id - Unique identifier
     * @param name - Display name
     * @param bodyType - Type of celestial body
     * @param data - Array of { date, position, velocity? } objects
     * @param options - Additional options
     */
    static fromData(id: number, name: string, bodyType: CelestialBodyType, data: Array<{
        date: Date;
        position: {
            x: number;
            y: number;
            z: number;
        };
        velocity?: {
            x: number;
            y: number;
            z: number;
        };
    }>, options?: {
        isHeliocentric?: boolean;
        mu?: number;
        radius?: Kilometers;
        interpolationType?: EphemerisInterpolationType;
        interpolationOrder?: number;
    }): EphemerisBody;
    /**
     * Creates the appropriate interpolator for the ephemeris data.
     */
    private createInterpolator_;
    protected serializeSpecific(): Record<string, unknown>;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Registry and convenience access for all solar system bodies.
 *
 * SolarSystem provides:
 * - Pre-initialized access to Sun, Moon, and planets
 * - Registration of custom ephemeris bodies (asteroids, comets)
 * - Lookup by name or ID
 * - Filtering by body type
 *
 * @example
 * ```typescript
 * // Get a body by name
 * const mars = SolarSystem.get('Mars');
 * const marsPos = mars?.eci(new Date());
 *
 * // Register a custom body
 * SolarSystem.register(ceres);
 *
 * // Get all planets
 * const planets = SolarSystem.getByType(CelestialBodyType.TERRESTRIAL_PLANET);
 * ```
 */
declare class SolarSystem {
    /** Registry of all bodies by ID (lowercase) */
    private static bodies_;
    /** Registry of all bodies by name (lowercase) */
    private static bodiesByName_;
    /** Whether the registry has been initialized */
    private static initialized_;
    private constructor();
    /**
     * Initializes the solar system with all standard bodies.
     * Called automatically on first access, but can be called explicitly.
     */
    static initialize(): void;
    /**
     * Registers a celestial body in the solar system registry.
     * @param body - The body to register
     */
    static register(body: CelestialBody): void;
    /**
     * Unregisters a celestial body from the registry.
     * @param idOrName - ID or name of the body to remove
     * @returns True if the body was found and removed
     */
    static unregister(idOrName: string | number): boolean;
    /**
     * Gets a celestial body by ID or name.
     * @param idOrName - ID or name of the body (case-insensitive)
     * @returns The body, or undefined if not found
     */
    static get(idOrName: string | number): CelestialBody | undefined;
    /**
     * Gets all registered celestial bodies.
     * @returns Array of all bodies (deduplicated)
     */
    static getAll(): CelestialBody[];
    /**
     * Gets all bodies of a specific type.
     * @param type - The body type to filter by
     * @returns Array of bodies matching the type
     */
    static getByType(type: CelestialBodyType): CelestialBody[];
    /**
     * Checks if a body is registered.
     * @param idOrName - ID or name to check
     * @returns True if the body is registered
     */
    static has(idOrName: string | number): boolean;
    /** The Sun */
    static get sun(): SunBody;
    /** The Moon */
    static get moon(): MoonBody;
    /** Mercury */
    static get mercury(): PlanetBody;
    /** Venus */
    static get venus(): PlanetBody;
    /** Mars */
    static get mars(): PlanetBody;
    /** Jupiter */
    static get jupiter(): PlanetBody;
    /** Saturn */
    static get saturn(): PlanetBody;
    /** Uranus */
    static get uranus(): PlanetBody;
    /** Neptune */
    static get neptune(): PlanetBody;
    /** Pluto */
    static get pluto(): PlanetBody;
    /**
     * Gets the count of registered bodies.
     */
    static get count(): number;
    /**
     * Clears all registered bodies and resets to uninitialized state.
     * Primarily for testing purposes.
     */
    static reset(): void;
    /**
     * Ensures the registry is initialized before access.
     */
    private static ensureInitialized_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare const radecToPosition: (ra: Radians, dec: Radians, r: Kilometers) => Vector3D<Kilometers>;
declare const radecToVelocity: (ra: Radians, dec: Radians, r: Kilometers, raDot: RadiansPerSecond, decDot: RadiansPerSecond, rDot: KilometersPerSecond) => Vector3D<KilometersPerSecond>;
declare const normalizeAngle: (a: number, b: number) => number;
declare const observationDerivative: (xh: number, xl: number, step: number, isAngle?: boolean) => number;
declare const observationNoiseFromSigmas: (sigmas: number[]) => Matrix;

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Represents a topocentric right ascension and declination observation.
 *
 * Topocentric coordinates take into account the observer's exact location on the Earth's surface. This model is crucial
 * for precise measurements of local astronomical events and nearby celestial objects, where the observer's latitude,
 * longitude, and altitude can significantly affect the observed position due to parallax. Topocentric coordinates are
 * particularly important for observations of the Moon, planets, and artificial satellites.
 */
declare class RadecTopocentric {
    epoch: EpochUTC;
    rightAscension: Radians;
    declination: Radians;
    range?: Kilometers | undefined;
    rightAscensionRate?: (RadiansPerSecond | null) | undefined;
    declinationRate?: (RadiansPerSecond | null) | undefined;
    rangeRate?: (KilometersPerSecond | null) | undefined;
    constructor(epoch: EpochUTC, rightAscension: Radians, declination: Radians, range?: Kilometers | undefined, rightAscensionRate?: (RadiansPerSecond | null) | undefined, declinationRate?: (RadiansPerSecond | null) | undefined, rangeRate?: (KilometersPerSecond | null) | undefined);
    /**
     * Create a new RadecTopocentric object, using degrees for the angular values.
     * @param epoch UTC epoch.
     * @param rightAscensionDegrees Right-ascension in degrees.
     * @param declinationDegrees Declination in degrees.
     * @param range Range in km.
     * @param rightAscensionRateDegrees Right-ascension rate in degrees per second.
     * @param declinationRateDegrees Declination rate in degrees per second.
     * @param rangeRate Range rate in km/s.
     * @returns A new RadecTopocentric object.
     */
    static fromDegrees(epoch: EpochUTC, rightAscensionDegrees: Degrees, declinationDegrees: Degrees, range?: Kilometers, rightAscensionRateDegrees?: DegreesPerSecond, declinationRateDegrees?: DegreesPerSecond, rangeRate?: KilometersPerSecond): RadecTopocentric;
    /**
     * Create a new RadecTopocentric object from a J2000 state vector.
     * @param state Inertial state vector.
     * @param site Site vector.
     * @returns A new RadecTopocentric object.
     */
    static fromStateVector(state: J2000, site: J2000): RadecTopocentric;
    /**
     * Gets the right ascension in degrees.
     * @returns The right ascension in degrees.
     */
    get rightAscensionDegrees(): Degrees;
    /**
     * Gets the declination in degrees.
     * @returns The declination in degrees.
     */
    get declinationDegrees(): Degrees;
    /**
     * Gets the right ascension rate in degrees per second.
     * @returns The right ascension rate in degrees per second, or null if it is not available.
     */
    get rightAscensionRateDegrees(): DegreesPerSecond | null;
    /**
     * Gets the rate of change of declination in degrees per second.
     * @returns The rate of change of declination in degrees per second, or null if the declination rate is not defined.
     */
    get declinationRateDegrees(): DegreesPerSecond | null;
    /**
     * Return the position relative to the observer site.
     *
     * An optional range value can be passed to override the value contained in this observation.
     * @param site Observer site.
     * @param range Range in km.
     * @returns A Vector3D object.
     */
    position(site: J2000, range?: Kilometers): Vector3D<Kilometers>;
    /**
     * Return the velocity relative to the observer site.
     *
     * An optional range and rangeRate value can be passed to override the values contained in this observation.
     * @param site Observer site.
     * @param range Range in km.
     * @param rangeRate Range rate in km/s.
     * @returns A Vector3D object.
     */
    velocity(site: J2000, range?: Kilometers, rangeRate?: KilometersPerSecond): Vector3D<KilometersPerSecond>;
    /**
     * Calculates the line of sight vector in the topocentric coordinate system.
     * The line of sight vector points from the observer's location towards the celestial object.
     * @returns The line of sight vector as a Vector3D object.
     */
    lineOfSight(): Vector3D;
    /**
     * Calculate the angular distance between this and another RadecTopocentric object.
     * @param radec - The other RadecTopocentric object.
     * @param method - The angular distance method to use.
     * @returns The angular distance.
     */
    angle(radec: RadecTopocentric, method?: AngularDistanceMethod): Radians;
    /**
     * Calculate the angular distance between this and another RadecTopocentric object.
     * @param radec - The other RadecTopocentric object.
     * @param method - The angular distance method to use.
     * @returns The angular distance
     */
    angleDegrees(radec: RadecTopocentric, method?: AngularDistanceMethod): Degrees;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class ObservationOptical extends Observation {
    private readonly site_;
    observation: RadecTopocentric;
    private readonly noise_;
    constructor(site_: J2000, observation: RadecTopocentric, noise_?: Matrix);
    get site(): J2000;
    get noise(): Matrix;
    /**
     * Default noise matrix _(right-ascension, declination)_.
     * Based on the Maui Optical Site noise model.
     */
    static readonly defaultNoise: Matrix;
    get epoch(): EpochUTC;
    toVector(): Vector;
    clos(propagator: Propagator): number;
    ricDiff(propagator: Propagator): Vector3D;
    sample(random: RandomGaussianSource, sigma?: number): Observation;
    jacobian(propPairs: PropagatorPairs): Matrix;
    residual(propagator: Propagator): Matrix;
    /**
     * Create a noise matrix from right ascension and declination standard deviantions.
     * @param raSigma Right ascension standard deviation
     * @param decSigma Declination standard deviation
     * @returns Noise matrix
     */
    static noiseFromSigmas(raSigma: Radians, decSigma: Radians): Matrix;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Represents a geocentric right ascension and declination observation.
 *
 * In geocentric coordinates, observations are considered from the Earth's center. This approach simplifies calculations
 * for distant celestial objects, as it assumes a uniform observation point that ignores the observer's specific
 * location on Earth.
 */
declare class RadecGeocentric {
    epoch: EpochUTC;
    rightAscension: Radians;
    declination: Radians;
    range?: Kilometers | undefined;
    rightAscensionRate?: (RadiansPerSecond | null) | undefined;
    declinationRate?: (RadiansPerSecond | null) | undefined;
    rangeRate?: (KilometersPerSecond | null) | undefined;
    constructor(epoch: EpochUTC, rightAscension: Radians, declination: Radians, range?: Kilometers | undefined, rightAscensionRate?: (RadiansPerSecond | null) | undefined, declinationRate?: (RadiansPerSecond | null) | undefined, rangeRate?: (KilometersPerSecond | null) | undefined);
    /**
     * Creates a RadecGeocentric object from the given parameters in degrees.
     * @param epoch - The epoch in UTC.
     * @param rightAscensionDegrees - The right ascension in degrees.
     * @param declinationDegrees - The declination in degrees.
     * @param range - The range in kilometers (optional).
     * @param rightAscensionRateDegrees - The right ascension rate in degrees per second (optional).
     * @param declinationRateDegrees - The declination rate in degrees per second (optional).
     * @param rangeRate - The range rate in kilometers per second (optional).
     * @returns A new RadecGeocentric object.
     */
    static fromDegrees(epoch: EpochUTC, rightAscensionDegrees: Degrees, declinationDegrees: Degrees, range?: Kilometers, rightAscensionRateDegrees?: Degrees, declinationRateDegrees?: Degrees, rangeRate?: KilometersPerSecond): RadecGeocentric;
    /**
     * Creates a RadecGeocentric object from a state vector in J2000 coordinates.
     * @param state - The J2000 state vector.
     * @returns A new RadecGeocentric object.
     */
    static fromStateVector(state: J2000): RadecGeocentric;
    /**
     * Gets the right ascension in degrees.
     * @returns The right ascension in degrees.
     */
    get rightAscensionDegrees(): Degrees;
    /**
     * Gets the declination in degrees.
     * @returns The declination in degrees.
     */
    get declinationDegrees(): Degrees;
    /**
     * Gets the right ascension rate in degrees per second.
     * @returns The right ascension rate in degrees per second, or null if it is not available.
     */
    get rightAscensionRateDegrees(): DegreesPerSecond | null;
    /**
     * Gets the rate of change of declination in degrees per second.
     * @returns The rate of change of declination in degrees per second, or null if not available.
     */
    get declinationRateDegrees(): DegreesPerSecond | null;
    /**
     * Calculates the position vector in geocentric coordinates.
     * @param range - The range in kilometers (optional). If not provided, it uses the default range or 1.0 kilometer.
     * @returns The position vector in geocentric coordinates.
     */
    position(range?: Kilometers): Vector3D<Kilometers>;
    /**
     * Calculates the velocity vector of the celestial object.
     * @param range - The range of the celestial object in kilometers. If not provided, it uses the stored range value.
     * @param rangeRate - The range rate of the celestial object in kilometers per second.
     * If not provided, it uses the stored range rate value.
     * @returns The velocity vector of the celestial object in kilometers per second.
     * @throws Error if the right ascension rate or declination rate is missing.
     */
    velocity(range?: Kilometers, rangeRate?: KilometersPerSecond): Vector3D<KilometersPerSecond>;
    /**
     * Calculates the angular distance between two celestial coordinates (RA and Dec).
     * @param radec - The celestial coordinates to compare with.
     * @param method - The method to use for calculating the angular distance. Default is `AngularDistanceMethod.Cosine`.
     * @returns The angular distance between the two celestial coordinates in radians.
     */
    angle(radec: RadecGeocentric, method?: AngularDistanceMethod): Radians;
    /**
     * Calculates the angle in degrees between two RadecGeocentric objects.
     * @param radec - The RadecGeocentric object to calculate the angle with.
     * @param method - The method to use for calculating the angular distance. Default is AngularDistanceMethod.Cosine.
     * @returns The angle in degrees.
     */
    angleDegrees(radec: RadecGeocentric, method?: AngularDistanceMethod): Degrees;
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
type Egm96Entry = [number, number, number, number];

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

type HpAtmosphereEntry = [number, number, number];

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class HpAtmosphereResult {
    height: number;
    hp0: HpAtmosphereEntry;
    hp1: HpAtmosphereEntry;
    constructor(height: number, hp0: HpAtmosphereEntry, hp1: HpAtmosphereEntry);
}

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
type Iau1980Entry = [number, number, number, number, number, number, number, number, number];

/**
 * @author Theodore Kruczek
 * @description Orbital Object ToolKit (ootk) is a collection of tools for working
 * with satellites and other orbital objects.
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Many of the classes are based off of the work of @david-rc-dayton and his
 * Pious Squid library (https://github.com/david-rc-dayton/pious_squid) which
 * is licensed under the MIT license.
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Astrodynamic data management singleton.
 *
 * This class provides access to the various data sets used by the library.
 * It is a singleton class, and can be accessed via the static
 * [getInstance] method.
 */
declare class DataHandler {
    private static readonly instance_;
    private constructor();
    /**
     * Returns the singleton instance of the DataHandler class.
     * @returns The singleton instance of the DataHandler class.
     */
    static getInstance(): DataHandler;
    /**
     * Retrieves the Egm96 coefficients for the given l and m values.
     * @param l - The degree of the coefficient.
     * @param m - The order of the coefficient.
     * @returns The Egm96Entry object containing the coefficients.
     */
    getEgm96Coeffs(l: number, m: number): Egm96Entry;
    /**
     * Retrieves the IAU 1980 coefficients for the specified row.
     * @param row The row index of the coefficients to retrieve.
     * @returns The IAU 1980 entry containing the coefficients.
     */
    getIau1980Coeffs(row: number): Iau1980Entry;
    /**
     * Retrieves the number of leap seconds for a given Julian date.
     * @param jd The Julian date.
     * @returns The number of leap seconds.
     */
    getLeapSeconds(jd: number): number;
    /**
     * Retrieves the atmosphere data for a given height.
     * @param height The height for which to retrieve the atmosphere data.
     * @returns The atmosphere data for the given height, or null if no data is available.
     */
    getHpAtmosphere(height: number): HpAtmosphereResult | null;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class BoxMuller {
    private _index;
    private _cache;
    mu: number;
    sigma: number;
    rand: Random;
    /**
     * Create a new [BoxMuller] object with mean [mu], standard deviation
     * [sigma], and [seed] number.
     * @param mu Mean value.
     * @param sigma Standard deviation.
     * @param seed Random seed.
     */
    constructor(mu: number, sigma: number, seed?: number);
    _generate(): void;
    /**
     * Generate a gaussian number, with mean [mu] and standard
     * deviation [sigma].
     * @returns A gaussian number.
     */
    nextGauss(): number;
    /**
     * Generate a [Vector] of gaussian numbers, with mean [mu] and standard
     * deviation [sigma].
     * @param n Number of gaussian numbers to generate.
     * @returns A [Vector] of gaussian numbers.
     */
    gaussVector(n: number): Vector;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class EulerAngles {
    roll: number;
    pitch: number;
    yaw: number;
    /**
     * Create a new EulerAngles object from roll, pitch, and yaw angles in radians.
     * @param roll Roll angle in radians.
     * @param pitch Pitch angle in radians.
     * @param yaw Yaw angle in radians.
     */
    constructor(roll: Radians, pitch: Radians, yaw: Radians);
    /**
     * Create a new EulerAngles object from roll, pitch, and yaw angles.
     * @param rollDeg Roll angle in degrees.
     * @param pitchDeg Pitch angle in degrees.
     * @param yawDeg Yaw angle in degrees.
     * @returns EulerAngles object.
     */
    static fromDegrees(rollDeg: Degrees, pitchDeg: Degrees, yawDeg: Degrees): EulerAngles;
    /**
     * Create a new EulerAngles object from 3-2-1 ordered direction cosine matrix c.
     * @param c 3-2-1 ordered direction cosine matrix.
     * @returns EulerAngles object.
     */
    static fromDcm321(c: Matrix): EulerAngles;
    /**
     * Gets the roll angle in degrees.
     * @returns The roll angle in degrees.
     */
    get rollDegrees(): Degrees;
    /**
     * Gets the pitch angle in degrees.
     * @returns The pitch angle in degrees.
     */
    get pitchDegrees(): Degrees;
    /**
     * Gets the yaw angle in degrees.
     * @returns The yaw angle in degrees.
     */
    get yawDegrees(): Degrees;
    /**
     * Gets the roll angle in radians.
     * @returns The roll angle in radians.
     */
    get phi(): Radians;
    /**
     * Gets the pitch angle in radians.
     * @returns The pitch angle in radians.
     */
    get theta(): Radians;
    /**
     * Gets the yaw angle in radians.
     * @returns The yaw angle in radians.
     */
    get psi(): Radians;
    /**
     * Gets the roll component in degrees.
     * @returns The roll component in degrees.
     */
    get phiDegrees(): Degrees;
    /**
     * Gets the pitch component in degrees.
     * @returns The pitch component in degrees.
     */
    get thetaDegrees(): Degrees;
    /**
     * Gets the yaw component in degrees.
     * @returns The yaw component in degrees.
     */
    get psiDegrees(): Degrees;
    /**
     * Returns a string representation of the Euler angles.
     * @param precision The number of decimal places to include in the string representation. Default is 6.
     * @returns A string representation of the Euler angles.
     */
    toString(precision?: number): string;
    /**
     * Calculates the Direction Cosine Matrix (DCM) using the 3-2-1 Euler angles convention.
     * @returns The calculated DCM as a Matrix object.
     */
    dcm321(): Matrix;
    /**
     * Rotates a 3D vector using a 3-2-1 Euler angle sequence.
     * @param v The vector to rotate.
     * @returns The rotated vector.
     */
    rotateVector321(v: Vector3D): Vector3D;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class Quaternion {
    x: number;
    y: number;
    z: number;
    w: number;
    constructor(x: number, y: number, z: number, w: number);
    static readonly zero: Quaternion;
    static readonly one: Quaternion;
    static readonly xAxis: Quaternion;
    static readonly yAxis: Quaternion;
    static readonly zAxis: Quaternion;
    toString(precision?: number): string;
    positivePolar(): Quaternion;
    magnitudeSquared(): number;
    magnitude(): number;
    scale(n: number): Quaternion;
    negate(): Quaternion;
    normalize(): Quaternion;
    conjugate(): Quaternion;
    inverse(): Quaternion;
    add(q: Quaternion): Quaternion;
    subtract(q: Quaternion): Quaternion;
    addReal(n: number): Quaternion;
    multiply(q: Quaternion): Quaternion;
    dot(q: Quaternion): number;
    rotateVector(v: Vector): Vector;
    rotateVector3D(v: Vector3D): Vector3D;
    lerp(q: Quaternion, t: number): Quaternion;
    slerp(q: Quaternion, t: number): Quaternion;
    toVector3D(): Vector3D;
    angle(q: Quaternion): Radians;
    geodesicAngle(q: Quaternion): Radians;
    distance(q: Quaternion): number;
    delta(qTo: Quaternion): Quaternion;
    toDirectionCosineMatrix(): Matrix;
    toRotationMatrix(): Matrix;
    vectorAngle(observer: Vector3D, target: Vector3D, forward: Vector3D): number;
    kinematics(angularVelocity: Vector3D<RadiansPerSecond>): Quaternion;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Harris-Priester atmospheric drag force model.
 *
 * The F10.7 solar radio flux index can be provided to scale atmospheric
 * density based on solar activity. Typical values:
 * - Solar minimum: ~70 SFU
 * - Mean solar activity: ~150 SFU (default)
 * - Solar maximum: ~250 SFU
 *
 * F10.7 data is available from:
 * - CelesTrak: https://celestrak.org/SpaceData/
 * - NOAA SWPC: https://www.swpc.noaa.gov/
 */
declare class AtmosphericDrag implements Force {
    mass: number;
    area: number;
    dragCoeff: number;
    cosine: number;
    /** F10.7 solar radio flux index in solar flux units (SFU). */
    f107: number;
    /**
     * Creates an atmospheric drag force model.
     * @param mass Spacecraft mass in kg.
     * @param area Cross-sectional area in m².
     * @param dragCoeff Drag coefficient (typically 2.0-2.5).
     * @param cosine Cosine exponent for HP model (typically 2-6).
     * @param f107 F10.7 solar radio flux in SFU (default: 150 for mean solar activity).
     */
    constructor(mass: number, area: number, dragCoeff: number, cosine: number, f107?: number);
    private static _getHPDensity;
    acceleration(state: J2000): Vector3D;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * designed to model the Earth's gravitational field, which is not uniformly distributed due to variations in mass
 * distribution within the Earth and the Earth's shape (it's not a perfect sphere). To accurately model this complex
 * field, the gravity model is expanded into a series of spherical harmonics, characterized by their degree and order.
 *
 * This `degree` parameter is related to the spatial resolution of the gravity model. A higher degree corresponds to a
 * finer resolution, capable of representing smaller-scale variations in the gravity field. The degree essentially
 * denotes how many times the gravitational potential function varies over the surface of the Earth.
 *
 * For each degree, there can be multiple orders ranging from 0 up to the degree. The `order` accounts for the
 * longitudinal variation in the gravity field. Each order within a degree captures different characteristics of the
 * gravity anomalies.
 *
 * `Degree 0` corresponds to the overall, mean gravitational force of the Earth (considered as a point mass).
 *
 * `Degree 1` terms are related to the Earth's center of mass but are usually not used because the center of mass is
 * defined as the origin of the coordinate system.
 *
 * `Degree 2` and higher capture the deviations from this spherical symmetry, such as the flattening at the poles and
 * bulging at the equator (degree 2), and other anomalies at finer scales as the degree increases.
 */
declare class EarthGravity implements Force {
    degree: number;
    order: number;
    _asphericalFlag: boolean;
    /**
     * Creates a new instance of the EarthGravity class.
     * @param degree The degree of the Earth's gravity field. Must be between 0 and 36.
     * @param order The order of the Earth's gravity field. Must be between 0 and 36.
     */
    constructor(degree: number, order: number);
    private spherical_;
    private aspherical_;
    acceleration(state: J2000): Vector3D;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class Gravity implements Force {
    mu: number;
    /**
     * Create a new [Gravity] object with optional gravitational
     * @param mu Gravitational parameter _(km²/s³)_.
     */
    constructor(mu?: number);
    /**
     * Calculates the gravitational force in spherical coordinates.
     * @param state The J2000 state containing the position and velocity vectors.
     * @returns The gravitational force vector in spherical coordinates.
     */
    private spherical_;
    /**
     * Calculates the acceleration due to gravity at a given state.
     * @param state The J2000 state at which to calculate the acceleration.
     * @returns The acceleration vector.
     */
    acceleration(state: J2000): Vector3D;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class SolarRadiationPressure extends Force {
    mass: number;
    area: number;
    reflectCoeff: number;
    constructor(mass: number, area: number, reflectCoeff: number);
    private static readonly _kRef;
    acceleration(state: J2000): Vector3D;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class ThirdBodyGravity implements Force {
    moon: boolean;
    sun: boolean;
    constructor(moon?: boolean, sun?: boolean);
    private static moonGravity_;
    private static sunGravity_;
    acceleration(state: J2000): Vector3D;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class DormandPrince54Propagator extends RungeKuttaAdaptive {
    private readonly a_;
    private readonly b_;
    private readonly ch_;
    private readonly c_;
    get a(): Float64Array;
    get b(): Float64Array[];
    get ch(): Float64Array;
    get c(): Float64Array;
    get order(): number;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class KeplerPropagator extends Propagator {
    private readonly initElements_;
    private elements_;
    private cacheState_;
    private checkpoints_;
    constructor(initElements: ClassicalElements);
    get state(): J2000;
    propagate(epoch: EpochUTC): J2000;
    reset(): void;
    maneuver(maneuver: Thrust): J2000[];
    ephemerisManeuver(start: EpochUTC, finish: EpochUTC, maneuvers: Thrust[], interval?: number): VerletBlendInterpolator;
    checkpoint(): number;
    clearCheckpoints(): void;
    restore(index: number): void;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class RkCheckpoint {
    cacheState: J2000;
    stepSize: number;
    constructor(cacheState: J2000, stepSize: number);
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class RkResult {
    state: J2000;
    error: number;
    newStep: number;
    constructor(state: J2000, error: number, newStep: number);
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class RungeKutta4Propagator extends Propagator {
    private readonly initState_;
    private forceModel_;
    private stepSize_;
    private cacheState_;
    private checkpoints_;
    /**
     * Create a new [RungeKutta4Propagator] object from an initial state vector and
     * along with an optional [ForceModel] and [stepSize] in seconds.
     * @param initState_ Initial state vector.
     * @param forceModel_ Numerical integration force model.
     * @param stepSize_ Integration step size _(seconds)_.
     * @param cacheState_ Cached state vector.
     * @param checkpoints_ Cached state vector checkpoints.
     */
    constructor(initState_: J2000, forceModel_?: ForceModel, stepSize_?: number, cacheState_?: J2000, checkpoints_?: J2000[]);
    setStepSize(seconds: number): void;
    setForceModel(forceModel: ForceModel): void;
    ephemerisManeuver(start: EpochUTC, finish: EpochUTC, maneuvers: Thrust[], interval?: Seconds): VerletBlendInterpolator;
    maneuver(maneuver: Thrust, interval?: number): J2000[];
    private _kFn;
    private _integrate;
    propagate(epoch: EpochUTC): J2000;
    reset(): void;
    get state(): J2000;
    checkpoint(): number;
    clearCheckpoints(): void;
    restore(index: number): void;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class BatchLeastSquaresResult {
    state: J2000;
    covariance: StateCovariance;
    rms: number;
    /**
     * Create a new [BatchLeastSquaresResult] object, containing the solved
     * [state], [covariance], and root-mean-squared error [rms].
     * @param state The solved state.
     * @param covariance The solved covariance.
     * @param rms The root-mean-squared error.
     */
    constructor(state: J2000, covariance: StateCovariance, rms: number);
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Batch least squares orbit determination.
 */
declare class BatchLeastSquaresOD {
    private readonly observations_;
    private readonly apriori_;
    private readonly forceModel_?;
    private readonly posStep_;
    private readonly velStep_;
    private readonly fastDerivatives_;
    /** Propagator pair cache, for generating observation Jacobians. */
    private readonly propPairs_;
    /**  Nominal state propagator. */
    private propagator_;
    /**  State estimate during solve. */
    private readonly nominal_;
    /**  Solve start epoch. */
    private readonly start_;
    /**
     * Create a new [BatchLeastSquaresOD] object from a list of [Observation]
     * objects, an [apriori] state estimate, and an optional
     * spacecraft [forceModel].
     * @param observations_ List of observations.
     * @param apriori_ Apriori state estimate.
     * @param forceModel_ Spacecraft force model.
     * @param posStep_ Position step size.
     * @param velStep_ Velocity step size.
     * @param fastDerivatives_ Use fast derivatives.
     * @returns [BatchLeastSquaresOD] object.
     */
    constructor(observations_: Observation[], apriori_: J2000, forceModel_?: ForceModel | undefined, posStep_?: number, velStep_?: number, fastDerivatives_?: boolean);
    private buildPropagator_;
    private static stateToX0_;
    private setPropagatorPairs_;
    /**
     * Attempt to solve a state estimate with the given root-mean-squared delta
     * [tolerance].
     * @param root0 Root initial guess.
     * @param root0.tolerance Root-mean-squared delta tolerance.
     * @param root0.maxIter Maximum number of iterations.
     * @param root0.printIter Print iterations.
     * @returns [BatchLeastSquaresResult] object.
     */
    solve({ tolerance, maxIter, printIter, }?: {
        tolerance?: number;
        maxIter?: number;
        printIter?: boolean;
    }): BatchLeastSquaresResult;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Gibbs 3-position inital orbit determination.
 */
declare class GibbsIOD {
    mu: number;
    constructor(mu?: number);
    /** Abort solve if position plane exceeds this value. */
    private static readonly coplanarThreshold_;
    /**
     * Attempt to create a state estimate from three inertial position vectors.
     *
     * Throws an error if the positions are not coplanar.
     * @param r1 Position vector 1.
     * @param r2 Position vector 2.
     * @param r3 Position vector 3.
     * @param t2 Time of position 2.
     * @param t3 Time of position 3.
     * @returns State estimate at time t2.
     */
    solve(r1: Vector3D<Kilometers>, r2: Vector3D<Kilometers>, r3: Vector3D<Kilometers>, t2: EpochUTC, t3: EpochUTC): J2000;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Gooding angles-only initial orbit determination.
 *
 * Used for orbit determination from three optical observations.
 */
declare class GoodingIOD {
    /** Finite difference factor for numerical derivatives */
    private static readonly FINITE_DIFF_FACTOR;
    /** Convergence tolerance for iterative solver */
    private static readonly CONVERGENCE_TOLERANCE;
    /** Maximum iterations for range problem solver */
    private static readonly MAX_ITERATIONS;
    /** Minimum determinant value to avoid numerical issues */
    private static readonly MIN_DETERMINANT;
    /** Gravitational constant. */
    private readonly _mu;
    /** observation 1 */
    private o1_;
    /** observation 2 */
    private o2_;
    /** observation 3 */
    private o3_;
    /** observer position 1 */
    private vObserverPosition1_;
    /** observer position 2 */
    private vObserverPosition2_;
    /** observer position 3 */
    private vObserverPosition3_;
    /** Normalizing constant for distances. */
    private r_;
    /** Normalizing constant for velocities. */
    private v_;
    /** Normalizing constant for duration. */
    private t_;
    /** Radius of point 1 (X-R1). */
    private r1_;
    /** Radius of point 2 (X-R2). */
    private r2_;
    /** Radius of point 3 (X-R3). */
    private r3_;
    /** Range of point 1 (O1-R1). */
    private rho1_;
    /** Range of point 2 (O1-R1). */
    private rho2_;
    /** Range of point 3 (O1-R1). */
    private rho3_;
    /** working variable */
    private d1_;
    /** working variable */
    private d3_;
    /** factor for FD. */
    private facFiniteDiff_;
    private readonly _forceModel;
    constructor(mu?: number);
    getRange1(): Kilometers;
    getRange2(): Kilometers;
    getRange3(): Kilometers;
    /**
     * Estimate an orbit from three angular observations (azimuth/elevation).
     * Uses Gauss IOD to derive initial range estimates, so no external range
     * guesses are required.
     *
     * @param o1 - first angular observation
     * @param o2 - second angular observation
     * @param o3 - third angular observation
     * @param nRev - number of full revolutions between observation 1 and 3
     * @param direction - true for prograde (short-way), false for retrograde
     * @returns Orbit estimate referenced to the epoch of the second observation
     */
    estimate(o1: ObservationOptical, o2: ObservationOptical, o3: ObservationOptical, rho1init?: Kilometers | null, rho3init?: Kilometers | null, nRev?: number, direction?: boolean): J2000;
    /**
     * @param r1Init - Initial guess for range at first observation
     * @param r3Init - Initial guess for range at third observation
     * @param nRev - Number of revolutions
     * @param direction - Direction of orbit (true for prograde, false for retrograde)
     * @returns
     */
    solve(o1: ObservationOptical, o2: ObservationOptical, o3: ObservationOptical, r1Init: Kilometers, r3Init: Kilometers, nRev?: number, direction?: boolean): J2000;
    /**
     * Solve the range problem when three line of sight are given.
     * @param frame frame to be used (orbit frame)
     * @param rho1init   initial value for range R1, in meters
     * @param rho3init   initial value for range R3, in meters
     * @param T13   time of flight 1->3, in seconds
     * @param T12   time of flight 1->2, in seconds
     * @param nRev number of revolutions
     * @param direction  posigrade (true) or retrograde
     * @param lineOfSight1  line of sight 1
     * @param lineOfSight2  line of sight 2
     * @param lineOfSight3  line of sight 3
     */
    private solveRangeProblem_;
    private modifyIterate_;
    /**
     * Compute the derivatives by finite-differences for the range problem.
     * Specifically, we are trying to solve the problem:
     *      f(x, y) = 0
     *      g(x, y) = 0
     * So, in a Newton-Raphson process, we would need the derivatives:
     *  fx, fy, gx, gy
     * Enventually,
     *    dx =-f*gy / D
     *    dy = f*gx / D
     * where D is the determinant of the Jacobian matrix.
     *
     * @param frame frame to be used (orbit frame)
     * @param x    current range 1
     * @param y    current range 3
     * @param lineOfSight1  line of sight
     * @param lineOfSight3  line of sight
     * @param Pin   basis vector
     * @param Ein   basis vector
     * @param F     value of the f-function
     * @param T13   time of flight 1->3, in seconds
     * @param T12   time of flight 1->2, in seconds
     * @param withHalley    use Halley iterative method
     * @param nRev  number of revolutions
     * @param direction direction of motion
     * @param FD    derivatives of f wrt (rho1, rho3) by finite differences
     * @param GD    derivatives of g wrt (rho1, rho3) by finite differences
     */
    private computeDerivatives_;
    /**
     * Calculate the position along sight-line (forced planar mock-up for debugging).
     * @param frame frame to be used (orbit frame)
     * @param E1 line of sight 1 (ignored in planar mock-up)
     * @param RO1 distance along E1 (used for R1)
     * @param E3 line of sight 3 (ignored in planar mock-up)
     * @param RO3 distance along E3 (used for R3)
     * @param T13 time of flight 1->3
     * @param T12 time of flight 1->2
     * @param nRev number of revolutions
     * @param posigrade direction of motion
     * @return (R2-O2) in normalized units
     */
    private getPositionOnLoS2_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Herrik-Gibbs 3-position initial orbit determination.
 *
 * Possibly better than regular Gibbs IOD for closely spaced position
 * vectors (less than 5°).
 */
declare class HerrickGibbsIOD {
    mu: number;
    /**
     * Create a new [HerrickGibbsIOD] object with optional
     * gravitational parameter [mu].
     * @param mu Gravitational parameter (default: Earth.mu)
     */
    constructor(mu?: number);
    solve(r1: Vector3D, t1: EpochUTC, r2: Vector3D<Kilometers>, t2: EpochUTC, r3: Vector3D, t3: EpochUTC): J2000;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class LambertIOD {
    mu: number;
    constructor(mu?: number);
    /**
     * Try to guess the short path argument given an [interceptor] and
     * [target] state.
     * @param interceptor Interceptor
     * @param target Target
     * @returns True if the short path should be used, false otherwise.
     */
    static useShortPath(interceptor: J2000, target: J2000): boolean;
    private static timeOfFlight_;
    /**
     * Attempt to solve output velocity [v1] _(km/s)_ given radii [r1] and
     * [r2] _(canonical)_, sweep angle [dth] _(rad)_, time of flight [tau]
     * _(canonical)_, and number of revolutions _(mRev)_.
     * @param r1 Radius 1
     * @param r2 Radius 2
     * @param dth Sweep angle
     * @param tau Time of flight
     * @param mRev Number of revolutions
     * @param v1 Output velocity
     * @returns True if successful, false otherwise.
     */
    static solve(r1: number, r2: number, dth: number, tau: number, mRev: number, v1: Float64Array): boolean;
    /**
     * Estimate a state vector for inertial position [p1] _(km)_ given the
     * two epoch and positions.
     * @param p1 Position vector 1
     * @param p2 Position vector 2
     * @param t1 Epoch 1
     * @param t2 Epoch 2
     * @param root0 Optional parameters
     * @param root0.posigrade If true, use the positive root (default: true)
     * @param root0.nRev Number of revolutions (default: 0)
     * @returns A [J2000] object with the estimated state vector.
     */
    estimate(p1: Vector3D<Kilometers>, p2: Vector3D<Kilometers>, t1: EpochUTC, t2: EpochUTC, { posigrade, nRev }?: {
        posigrade?: boolean;
        nRev?: number;
    }): J2000 | null;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class LevenbergMarquardtResult {
    state: J2000;
    covariance: StateCovariance;
    rms: number;
    iterations: number;
    converged: boolean;
    /**
     * Create a new [LevenbergMarquardtResult] object, containing the solved
     * [state], [covariance], root-mean-squared error [rms], number of
     * [iterations], and [converged] status.
     * @param state The solved state.
     * @param covariance The solved covariance.
     * @param rms The root-mean-squared error.
     * @param iterations The number of iterations performed.
     * @param converged Whether the solver converged.
     */
    constructor(state: J2000, covariance: StateCovariance, rms: number, iterations: number, converged: boolean);
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Levenberg-Marquardt orbit determination.
 */
declare class LevenbergMarquardtOD {
    private readonly observations_;
    private readonly apriori_;
    private readonly forceModel_?;
    private readonly posStep_;
    private readonly velStep_;
    private readonly fastDerivatives_;
    /** Propagator pair cache, for generating observation Jacobians. */
    private readonly propPairs_;
    /**  State estimate during solve. */
    private readonly nominal_;
    /**  Solve start epoch. */
    private readonly start_;
    /**
     * Create a new [LevenbergMarquardtOD] object from a list of [Observation]
     * objects, an [apriori] state estimate, and an optional
     * spacecraft [forceModel].
     * @param observations_ List of observations.
     * @param apriori_ Apriori state estimate.
     * @param forceModel_ Spacecraft force model.
     * @param posStep_ Position step size.
     * @param velStep_ Velocity step size.
     * @param fastDerivatives_ Use fast derivatives.
     * @returns [LevenbergMarquardtOD] object.
     */
    constructor(observations_: Observation[], apriori_: J2000, forceModel_?: ForceModel | undefined, posStep_?: number, velStep_?: number, fastDerivatives_?: boolean);
    private buildPropagator_;
    private static stateToX0_;
    private setPropagatorPairs_;
    private computeRMS;
    private computeLinearSystem;
    /**
     * Attempt to solve a state estimate using the Levenberg-Marquardt algorithm.
     * @param root0 Options.
     * @param root0.maxIterations Maximum number of iterations.
     * @param root0.epsilon Convergence tolerance (RMS error).
     * @param root0.lambdaInit Initial damping factor.
     * @param root0.lambdaFactor Factor to increase/decrease lambda.
     * @param root0.printIter Print iterations to console.
     * @returns [LevenbergMarquardtResult] object.
     */
    solve({ maxIterations, epsilon, lambdaInit, lambdaFactor, printIter, }?: {
        maxIterations?: number;
        epsilon?: number;
        lambdaInit?: number;
        lambdaFactor?: number;
        printIter?: boolean;
    }): LevenbergMarquardtResult;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

type SolveOptions = {
    nRev?: number;
    direction?: boolean;
    posSearch?: number;
    velSearch?: number;
    tolerance?: number;
    maxIter?: number;
    printIter?: boolean;
};
/**
 * Gooding angles-only initial orbit determination.
 *
 * Used for orbit determination from multiple optical observations.
 */
declare class ModifiedGoodingIOD {
    private observations_;
    private readonly mu_;
    constructor(mu?: number);
    private createInitial_;
    private createErrorFunction_;
    solve(observations: ObservationOptical[], r0?: Kilometers, rN?: Kilometers, { nRev, direction, posSearch, velSearch, tolerance, maxIter, printIter, }?: SolveOptions): J2000;
    private defaultSolveOptions_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/** Cartesian vector in km (position) or km/s (velocity). */
interface RvVector {
    x: number;
    y: number;
    z: number;
}
interface Rv2TleOptions {
    /** Maximum fixed-point iterations before giving up. */
    maxIterations?: number;
    /** Position convergence tolerance at the epoch in km. */
    toleranceKm?: number;
}
interface Rv2TleResult {
    tle1: string;
    tle2: string;
    /** Position error at the epoch between the fitted TLE and the input state, in km. */
    positionErrorKm: number;
    /** Number of fixed-point iterations performed. */
    iterations: number;
}
/**
 * Fits SGP4 mean elements to an osculating TEME state vector at a single epoch.
 *
 * A TLE built directly from osculating elements places the satellite kilometers
 * away from the input state (SGP4 expects Brouwer mean elements), so this runs
 * the classic fixed-point correction instead: build a TLE from the current
 * element guess, propagate it at the epoch, and shift each element by the
 * difference between the target and achieved osculating elements until the
 * propagated position matches the input state.
 *
 * Position and velocity are treated as TEME (the SGP4 output frame), which is
 * the frame KeepTrack uses for satellite states.
 *
 * @param epoch Epoch of the state vector.
 * @param position TEME position in km.
 * @param velocity TEME velocity in km/s.
 * @param options Iteration limits.
 * @returns The fitted TLE with its residual epoch position error, or null when
 * the state cannot be represented (propagation failure on every iteration).
 */
declare const rv2tle: (epoch: Date, position: RvVector, velocity: RvVector, options?: Rv2TleOptions) => Rv2TleResult | null;

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class CovarianceSample {
    private readonly origin_;
    private readonly samples_;
    private readonly matrix_;
    /**
     * Create a new [CovarianceSample] object from an inertial state, covariance
     * and optional force models for the origin state and samples.
     *
     * Two-body physics will be used if a force model is not provided.
     * @param state The origin state.
     * @param covariance The covariance.
     * @param tle The TLE object.
     * @param originForceModel The force model for the origin state.
     * @param sampleForceModel The force model for the samples.
     */
    constructor(state: J2000, covariance: StateCovariance, tle?: Tle, originForceModel?: ForceModel, sampleForceModel?: ForceModel);
    get epoch(): Epoch;
    get state(): J2000;
    private _rebuildCovariance;
    propagate(epoch: EpochUTC): void;
    maneuver(maneuver: Thrust): void;
    desampleJ2000(): StateCovariance;
    desampleRIC(): StateCovariance;
    evaluateTleQuality(tle: Tle): Vec3Flat;
    getRegimeAgingFactor(tle: Tle, ageDays: number): Vec3Flat;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/** 1-sigma position uncertainties (or per-axis caps) in the Radial-Intrack-Crosstrack frame. */
interface RicSigmas {
    /** Radial component. */
    radial: number;
    /** In-track (along-track) component. */
    inTrack: number;
    /** Cross-track component. */
    crossTrack: number;
}
/**
 * Scale 1-sigma RIC position uncertainties by a confidence multiplier and clamp
 * each axis independently to a maximum.
 *
 * This is the shared, frame-agnostic core used to size uncertainty
 * visualizations (e.g. covariance ellipsoids). It performs no axis reordering -
 * callers map the returned RIC values onto whatever rendering convention they
 * use.
 *
 * A zero sigma on a single axis is treated as valid (it yields a zero radius on
 * that axis); only non-finite or negative inputs are rejected.
 * @param sigmas The 1-sigma RIC position uncertainties.
 * @param confidence The confidence multiplier (e.g. 1, 2, or 3 for n-sigma).
 * @param caps The per-axis maximum returned value, in the same units as `sigmas`.
 * @returns The scaled and clamped RIC values, or `null` if any input sigma is
 * not a finite, non-negative number.
 */
declare function scaleAndClampRicSigmas(sigmas: RicSigmas, confidence: number, caps: RicSigmas): RicSigmas | null;

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Represents the result of a conjunction assessment between two space objects.
 * Contains all relevant information about the close approach event.
 */
declare class ConjunctionEvent {
    /** Time of Closest Approach (TCA) */
    readonly tca: EpochUTC;
    /** Primary object state at TCA in J2000 frame */
    readonly primaryState: J2000;
    /** Secondary object state at TCA in J2000 frame */
    readonly secondaryState: J2000;
    /** Relative state in RIC frame (relative to primary) */
    readonly relativeState: RIC;
    /** Total miss distance at TCA (km) */
    readonly missDistance: Kilometers;
    /** Radial component of miss distance (km) */
    readonly radialDistance: Kilometers;
    /** Intrack component of miss distance (km) */
    readonly intrackDistance: Kilometers;
    /** Crosstrack component of miss distance (km) */
    readonly crosstrackDistance: Kilometers;
    /** Relative velocity magnitude at TCA (km/s) */
    readonly relativeVelocity: KilometersPerSecond;
    /** Combined position covariance matrix in RIC frame (optional) */
    readonly combinedCovariance?: StateCovariance;
    /** Probability of collision (optional, 0-1) */
    readonly probabilityOfCollision?: number;
    /** Hard body radius for primary object (km, optional) */
    readonly primaryRadius?: Kilometers;
    /** Hard body radius for secondary object (km, optional) */
    readonly secondaryRadius?: Kilometers;
    /** Primary object name/identifier (optional, for CDM export) */
    readonly primaryName?: string;
    /** Secondary object name/identifier (optional, for CDM export) */
    readonly secondaryName?: string;
    /** Primary object catalog designator (optional, for CDM export) */
    readonly primaryDesignator?: string;
    /** Secondary object catalog designator (optional, for CDM export) */
    readonly secondaryDesignator?: string;
    /** Primary object covariance (optional, for CDM export) */
    readonly primaryCovariance?: StateCovariance;
    /** Secondary object covariance (optional, for CDM export) */
    readonly secondaryCovariance?: StateCovariance;
    constructor(params: {
        tca: EpochUTC;
        primaryState: J2000;
        secondaryState: J2000;
        relativeState: RIC;
        missDistance: Kilometers;
        radialDistance: Kilometers;
        intrackDistance: Kilometers;
        crosstrackDistance: Kilometers;
        relativeVelocity: KilometersPerSecond;
        combinedCovariance?: StateCovariance;
        probabilityOfCollision?: number;
        primaryRadius?: Kilometers;
        secondaryRadius?: Kilometers;
        primaryName?: string;
        secondaryName?: string;
        primaryDesignator?: string;
        secondaryDesignator?: string;
        primaryCovariance?: StateCovariance;
        secondaryCovariance?: StateCovariance;
    });
    /**
     * Returns a formatted string representation of the conjunction event.
     * @returns A multi-line string with conjunction details.
     */
    toString(): string;
    /**
     * Checks if this is a high-risk conjunction based on miss distance and Pc.
     * @param distanceThreshold Miss distance threshold in km (default: 1.0 km)
     * @param pcThreshold Probability of collision threshold (default: 1e-4)
     * @returns True if the conjunction exceeds risk thresholds.
     */
    isHighRisk(distanceThreshold?: Kilometers, pcThreshold?: number): boolean;
    /**
     * Gets the Mahalanobis distance if covariance is available.
     * This is the miss distance normalized by the combined covariance.
     * @returns The Mahalanobis distance (unitless), or undefined if no covariance.
     */
    getMahalanobisDistance(): number | undefined;
    /**
     * Extracts the 3x3 position covariance from a 6x6 state covariance matrix.
     * @param stateCov 6x6 state covariance matrix
     * @returns 3x3 position covariance matrix
     */
    private extractPositionCovariance;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Input for a space object in conjunction assessment.
 * Can be specified as either a TLE or a state vector with optional covariance.
 */
interface ConjunctionSpaceObjectInput {
    /** Object identifier/name */
    name?: string;
    /** TLE for the object (alternative to state) */
    tle?: Tle;
    /** State vector in J2000 frame (alternative to TLE) */
    state?: J2000;
    /** Covariance matrix (optional, for probability calculation) */
    covariance?: StateCovariance;
    /** Hard body radius in km (optional, for probability calculation) */
    radius?: Kilometers;
    /** Custom propagator (optional, overrides default) */
    propagator?: Propagator;
}
/**
 * Configuration options for conjunction assessment.
 */
interface ConjunctionAssessmentOptions {
    /** Search window start time */
    startTime: EpochUTC;
    /** Search window end time */
    endTime: EpochUTC;
    /** Use high-fidelity propagation (RungeKutta89 instead of SGP4) */
    useHighFidelity?: boolean;
    /** Force model for high-fidelity propagation (optional) */
    forceModel?: ForceModel;
    /** Propagate covariances using sigma-point method */
    propagateCovariance?: boolean;
    /** TCA search tolerance in seconds */
    tcaTolerance?: Seconds;
    /** Step size for initial TCA search in seconds */
    searchStepSize?: Seconds;
}
/**
 * High accuracy conjunction assessment workflow.
 *
 * This class provides a comprehensive workflow for assessing conjunctions between
 * space objects using:
 * - High accuracy propagators (SGP4 or numerical integrators)
 * - Covariance matrices based on historical TLE accuracy
 * - Time of Closest Approach (TCA) finding using optimization
 * - Probability of collision calculation using Chan's 2D method
 *
 * @example
 * ```typescript
 * const primaryTle = new Tle(line1, line2);
 * const secondaryTle = new Tle(line1, line2);
 *
 * const assessment = new ConjunctionAssessment(
 *   { tle: primaryTle, radius: 0.01 as Kilometers },
 *   { tle: secondaryTle, radius: 0.01 as Kilometers },
 * );
 *
 * const event = assessment.assess({
 *   startTime: EpochUTC.fromDateTime(new Date('2025-01-01T00:00:00Z')),
 *   endTime: EpochUTC.fromDateTime(new Date('2025-01-02T00:00:00Z')),
 *   useHighFidelity: true,
 *   propagateCovariance: true,
 * });
 *
 * console.log(event.toString());
 * ```
 */
declare class ConjunctionAssessment {
    private primary;
    private secondary;
    private primaryProp;
    private secondaryProp;
    private primaryCovSample?;
    private secondaryCovSample?;
    constructor(primary: ConjunctionSpaceObjectInput, secondary: ConjunctionSpaceObjectInput);
    /**
     * Performs conjunction assessment over the specified time window.
     *
     * @param options Assessment configuration options
     * @returns ConjunctionEvent with TCA, miss distance, and probability of collision
     */
    assess(options: ConjunctionAssessmentOptions): ConjunctionEvent;
    /**
     * Finds the Time of Closest Approach (TCA) using golden section search.
     *
     * @param startTime Search window start
     * @param endTime Search window end
     * @param stepSize Initial search step size in seconds
     * @param tolerance TCA search tolerance in seconds
     * @returns TCA epoch
     */
    private findTCA;
    /**
     * Creates a propagator for a space object.
     *
     * @param obj Space object
     * @param useHighFidelity Whether to use high-fidelity propagation
     * @param forceModel Optional force model for numerical propagation
     * @returns Propagator instance
     */
    private createPropagator;
    /**
     * Initializes covariance samples for both objects.
     *
     * @param useHighFidelity Whether to use high-fidelity propagation
     * @param forceModel Optional force model
     */
    private initializeCovarianceSamples;
    /**
     * Transforms ECI covariance to RIC frame.
     *
     * @param covariance ECI covariance
     * @param state State vector for RIC frame definition
     * @returns RIC covariance
     */
    private transformCovarianceToRIC;
    /**
     * Creates the 3x3 RIC transformation matrix.
     *
     * @param position Position vector
     * @param velocity Velocity vector
     * @returns 3x3 RIC transformation matrix
     */
    private createRICTransformMatrix;
    /**
     * Builds a 6x6 transformation matrix from a 3x3 rotation matrix.
     *
     * @param rot 3x3 rotation matrix
     * @returns 6x6 transformation matrix
     */
    private build6x6Transform;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Probability of Collision calculator using Chan's 2D method.
 *
 * This implementation projects the combined covariance matrix onto the
 * encounter plane (B-plane) perpendicular to the relative velocity vector,
 * then computes the probability that the relative position lies within
 * the combined hard body radius.
 *
 * Reference: Chan, F. K. (2008). "Spacecraft Collision Probability"
 */
declare class ProbabilityOfCollision {
    /**
     * Computes probability of collision using Chan's 2D method.
     *
     * @param relativePosition Relative position vector in RIC frame (km)
     * @param relativeVelocity Relative velocity vector in RIC frame (km/s)
     * @param combinedCovariance Combined position covariance in RIC frame (6x6)
     * @param combinedRadius Combined hard body radius (km)
     * @returns Probability of collision (0 to 1)
     */
    static calculate(relativePosition: Vector3D<Kilometers>, relativeVelocity: Vector3D, combinedCovariance: StateCovariance, combinedRadius: Kilometers): number;
    /**
     * Calculates 2D probability of collision in the encounter plane.
     *
     * Uses the analytical solution for 2D Gaussian probability within a circle.
     *
     * @param x X-coordinate in encounter plane (km)
     * @param y Y-coordinate in encounter plane (km)
     * @param cov2D 2x2 covariance matrix in encounter plane
     * @param radius Combined hard body radius (km)
     * @returns Probability of collision (0 to 1)
     */
    private static calculatePc2D;
    /**
     * Chan's analytical approximation for 2D Pc.
     *
     * Reference: Chan, F. K. (2008). "Spacecraft Collision Probability"
     *
     * @param mahalanobisDistance Mahalanobis distance (sqrt of d2)
     * @param radius Combined hard body radius
     * @param sigma1 Larger semi-axis of covariance ellipse
     * @param sigma2 Smaller semi-axis of covariance ellipse
     * @returns Probability of collision (0 to 1)
     */
    private static chanPc2D;
    /**
     * Approximates the complementary error function erfc(x).
     *
     * Uses Abramowitz and Stegun approximation (formula 7.1.26).
     *
     * @param x Input value
     * @returns erfc(x)
     */
    private static approximateErfc;
    /**
     * Fallback 3D probability calculation for cases with very low relative velocity.
     *
     * Uses simple spherical approximation.
     *
     * @param relativePosition Relative position vector
     * @param posCovariance 3x3 position covariance matrix
     * @param combinedRadius Combined hard body radius
     * @returns Probability of collision (0 to 1)
     */
    private static calculate3D;
    /**
     * Combines two covariance matrices (primary and secondary).
     *
     * The combined covariance is simply the sum of the two covariances,
     * assuming they are independent.
     *
     * @param primaryCov Primary object covariance
     * @param secondaryCov Secondary object covariance
     * @returns Combined covariance
     */
    static combineCovarianceMatrices(primaryCov: StateCovariance, secondaryCov: StateCovariance): StateCovariance;
    /**
     * Extracts the 3x3 position covariance from a 6x6 state covariance matrix.
     * @param stateCov 6x6 state covariance matrix
     * @returns 3x3 position covariance matrix
     */
    private static extractPositionCovariance;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Input for a catalog object in screening operations.
 */
interface CatalogObject {
    /** Two-Line Element set for the object */
    tle: Tle;
    /** Object name/identifier (derived from TLE satnum if not provided) */
    name?: string;
    /** Hard body radius in km (optional, for Pc calculation) */
    radius?: Kilometers;
    /** Covariance matrix (optional, for Pc calculation) */
    covariance?: StateCovariance;
}
/**
 * Configuration options for catalog screening operations.
 */
interface CatalogScreeningOptions {
    /** Search window start time */
    startTime: EpochUTC;
    /** Search window end time */
    endTime: EpochUTC;
    /** Step size for TCA search in seconds (default: 60s) */
    searchStepSize?: Seconds;
    /** TCA tolerance in seconds (default: 0.001s) */
    tcaTolerance?: Seconds;
    /** Use high-fidelity propagation (RungeKutta89 instead of SGP4) */
    useHighFidelity?: boolean;
    /** Force model for high-fidelity propagation */
    forceModel?: ForceModel;
    /** Skip coarse orbital shell filtering (default: false) */
    skipCoarseFilter?: boolean;
    /** Use inclination-based filtering in addition to radial (default: false) */
    useInclinationFilter?: boolean;
    /** Maximum number of results to return (default: unlimited) */
    maxResults?: number;
    /** Distance scale factor for risk scoring in km (default: 1.0 km) */
    riskScaleFactor?: Kilometers;
}
/**
 * Result from a catalog screening operation.
 */
interface ScreeningResult {
    /** Primary object identifier */
    primaryId: string;
    /** Secondary object identifier */
    secondaryId: string;
    /** Conjunction event with TCA and miss distance details */
    event: ConjunctionEvent;
    /** Risk score (0-1+, higher = more dangerous) */
    riskScore: number;
}
/**
 * High-performance catalog screening for conjunction assessment.
 *
 * Provides methods to screen one or more objects against a catalog of TLEs
 * to identify potential conjunctions. Uses a two-phase approach:
 * 1. Coarse filter: Eliminate impossible pairs based on orbital geometry
 * 2. Fine assessment: Detailed conjunction assessment on candidate pairs
 *
 * @example
 * ```typescript
 * // Screen a high-value asset against debris catalog
 * const primary: CatalogObject = { tle: issTle, name: 'ISS', radius: 0.05 as Kilometers };
 * const debris: CatalogObject[] = debrisfTles.map(tle => ({ tle }));
 *
 * const results = CatalogScreener.screenOneToMany(primary, debris, {
 *   startTime: EpochUTC.fromDateTime(new Date()),
 *   endTime: EpochUTC.fromDateTime(new Date(Date.now() + 7 * 24 * 3600 * 1000)),
 * });
 *
 * // Results sorted by risk (highest first)
 * results.slice(0, 10).forEach(r => console.log(r.event.toString()));
 * ```
 */
declare class CatalogScreener {
    private constructor();
    /**
     * Get object identifier from a CatalogObject.
     * Uses name if provided, otherwise satellite number from TLE.
     */
    private static getObjectId_;
    /**
     * Screen one primary object against an array of secondary objects.
     * Returns all conjunction events sorted by risk (highest risk first).
     *
     * @param primary - Primary object to screen
     * @param secondaries - Array of secondary objects to screen against
     * @param options - Screening configuration options
     * @returns Array of screening results sorted by risk score (descending)
     */
    static screenOneToMany(primary: CatalogObject, secondaries: CatalogObject[], options: CatalogScreeningOptions): ScreeningResult[];
    /**
     * Screen multiple primary objects against multiple secondary objects.
     * Avoids duplicate pair assessments (A vs B is same as B vs A).
     *
     * @param primaries - Array of primary objects
     * @param secondaries - Array of secondary objects
     * @param options - Screening configuration options
     * @returns Array of screening results sorted by risk score (descending)
     */
    static screenManyToMany(primaries: CatalogObject[], secondaries: CatalogObject[], options: CatalogScreeningOptions): ScreeningResult[];
    /**
     * Screen all objects in a catalog against each other.
     * Convenience method that calls screenManyToMany with the same array
     * for both primaries and secondaries.
     *
     * @param catalog - Array of objects to screen against each other
     * @param options - Screening configuration options
     * @returns Array of screening results sorted by risk score (descending)
     */
    static screenCatalog(catalog: CatalogObject[], options: CatalogScreeningOptions): ScreeningResult[];
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Orbital shell bounds for coarse filtering in catalog screening.
 * Represents the radial extent of an orbit.
 */
interface OrbitalShell {
    /** Perigee radius from Earth center (km) */
    perigee: Kilometers;
    /** Apogee radius from Earth center (km) */
    apogee: Kilometers;
    /** Orbital inclination (radians) */
    inclination: Radians;
    /** Object identifier for tracking */
    id?: string;
}
/**
 * Coarse filtering utilities for catalog screening operations.
 * Provides fast geometric checks to eliminate impossible conjunction pairs
 * before expensive detailed assessment.
 */
declare class ScreeningFilter {
    private constructor();
    /**
     * Extract orbital shell parameters from a TLE.
     * The shell represents the radial bounds of the orbit.
     * @param tle - Two-Line Element set
     * @param id - Optional identifier for the object
     * @returns Orbital shell with perigee, apogee, and inclination
     */
    static getOrbitalShell(tle: Tle, id?: string): OrbitalShell;
    /**
     * Check if two orbital shells could possibly intersect.
     * Uses simple apogee/perigee overlap test.
     *
     * Two orbits can only conjunct if their radial extents overlap:
     * - Primary's perigee must be <= Secondary's apogee, AND
     * - Primary's apogee must be >= Secondary's perigee
     *
     * @param shell1 - First orbital shell
     * @param shell2 - Second orbital shell
     * @returns True if shells could overlap, false if no conjunction possible
     */
    static shellsOverlap(shell1: OrbitalShell, shell2: OrbitalShell): boolean;
    /**
     * Enhanced overlap check including inclination discrimination.
     * Polar orbits (inc > 60°) can intersect any other orbit.
     * Near-equatorial orbits (inc < 30°) rarely intersect high-inclination orbits.
     *
     * @param shell1 - First orbital shell
     * @param shell2 - Second orbital shell
     * @param incThreshold - Inclination threshold for discrimination (default: 30°)
     * @returns True if shells could overlap, false if no conjunction possible
     */
    static shellsOverlapWithInclination(shell1: OrbitalShell, shell2: OrbitalShell, incThreshold?: Radians): boolean;
    /**
     * Filter candidate secondaries that could conjunct with a primary.
     * Returns indices of secondaries that pass the coarse filter.
     *
     * @param primary - Primary object TLE
     * @param secondaries - Array of secondary TLEs to filter
     * @param useInclinationFilter - Apply inclination-based filtering (default: false)
     * @returns Array of indices into secondaries that could conjunct with primary
     */
    static filterCandidates(primary: Tle, secondaries: Tle[], useInclinationFilter?: boolean): number[];
    /**
     * Compute a risk score for a conjunction event.
     * Combines miss distance and probability of collision into a single metric.
     * Higher score = higher risk (0 to 1 scale, though can exceed 1 for very close passes).
     *
     * Risk score formula:
     * - Base risk from miss distance: exp(-missDistance / scaleFactor)
     * - If Pc available: max(distance_risk, Pc * 1000)
     *
     * @param event - Conjunction event to score
     * @param distanceScaleFactor - Distance scale factor in km (default: 1.0 km)
     * @returns Risk score (higher = more dangerous)
     */
    static computeRiskScore(event: ConjunctionEvent, distanceScaleFactor?: Kilometers): number;
    /**
     * Sort conjunction events by risk score (highest risk first).
     * @param events - Array of conjunction events
     * @param distanceScaleFactor - Distance scale factor for risk calculation
     * @returns Sorted array (mutates original)
     */
    static sortByRisk(events: ConjunctionEvent[], distanceScaleFactor?: Kilometers): ConjunctionEvent[];
    /**
     * Create a unique pair identifier for two objects.
     * Used to avoid duplicate pair assessments in many-to-many screening.
     * @param id1 - First object identifier
     * @param id2 - Second object identifier
     * @returns Canonical pair identifier (alphabetically sorted)
     */
    static getPairId(id1: string, id2: string): string;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Mahalanobis distance assessment result.
 */
interface MahalanobisResult {
    /** Mahalanobis distance value (unitless) */
    distance: number;
    /** Expected 3-sigma bound for realistic covariance */
    expectedBound: number;
    /** Whether the distance is within expected bounds (< 3 sigma) */
    withinBounds: boolean;
    /** Equivalent sigma level (number of standard deviations) */
    sigmaLevel: number;
}
/**
 * Covariance consistency ratio assessment result.
 */
interface ConsistencyRatioResult {
    /** Ratio of actual miss distance to predicted 1-sigma uncertainty */
    ratio: number;
    /** Whether the covariance is appropriately sized */
    isAppropriate: boolean;
    /** Assessment of covariance sizing */
    assessment: 'optimistic' | 'realistic' | 'pessimistic';
}
/**
 * Eigenvalue analysis result for covariance matrix.
 */
interface EigenvalueAnalysisResult {
    /** Eigenvalues of position covariance (km^2), sorted descending */
    eigenvalues: [number, number, number];
    /** Condition number (ratio of max to min eigenvalue) */
    conditionNumber: number;
    /** Whether the covariance is well-conditioned */
    isWellConditioned: boolean;
    /** Whether the covariance is singular or near-singular */
    isSingular: boolean;
    /** Principal axes lengths (1-sigma, km), sorted descending */
    principalAxes: [Kilometers, Kilometers, Kilometers];
}
/**
 * Scale factor assessment result.
 */
interface ScaleFactorResult {
    /** Estimated scale factor needed to correct covariance */
    scaleFactor: number;
    /** Assessment of current covariance size */
    assessment: 'too_small' | 'appropriate' | 'too_large';
    /** Recommendation for covariance adjustment */
    recommendation: string;
}
/**
 * Complete covariance realism assessment result.
 */
interface CovarianceRealismResult {
    /** Whether the covariance is considered realistic overall */
    isRealistic: boolean;
    /** Overall realism score (0-1, higher = more realistic) */
    realismScore: number;
    /** Individual metric results */
    metrics: {
        mahalanobisDistance?: MahalanobisResult;
        consistencyRatio?: ConsistencyRatioResult;
        eigenvalueAnalysis?: EigenvalueAnalysisResult;
        scaleFactor?: ScaleFactorResult;
    };
    /** Warnings and issues found during assessment */
    warnings: string[];
}
/**
 * Covariance realism assessment utilities.
 *
 * Provides multiple metrics to evaluate whether covariance matrices are
 * appropriately sized for conjunction assessment. Unrealistic covariances
 * (too small or too large) can lead to poor probability of collision estimates.
 *
 * @example
 * ```typescript
 * const event = assessment.assess({ startTime, endTime });
 * const realism = CovarianceRealism.assess(event);
 *
 * if (!realism.isRealistic) {
 *   console.log('Covariance issues:', realism.warnings);
 * }
 * ```
 */
declare class CovarianceRealism {
    /** Threshold for singular eigenvalue detection */
    private static readonly SINGULAR_THRESHOLD_;
    /** Threshold for ill-conditioned matrix detection */
    private static readonly CONDITION_THRESHOLD_;
    /** Expected 3-sigma bound for Mahalanobis distance */
    private static readonly MAHALANOBIS_3SIGMA_;
    private constructor();
    /**
     * Perform comprehensive covariance realism assessment.
     *
     * Combines multiple metrics to evaluate covariance quality:
     * - Mahalanobis distance (is miss within expected sigma bounds?)
     * - Consistency ratio (ratio of miss to predicted uncertainty)
     * - Eigenvalue analysis (is covariance well-conditioned?)
     * - Scale factor assessment (is covariance sized correctly?)
     *
     * @param event - Conjunction event to assess
     * @returns Comprehensive assessment result
     */
    static assess(event: ConjunctionEvent): CovarianceRealismResult;
    /**
     * Compute Mahalanobis distance for the conjunction.
     *
     * The Mahalanobis distance measures how many standard deviations
     * the miss distance is from zero, accounting for the covariance shape.
     * A value > 3 suggests the covariance may be underestimated.
     *
     * @param event - Conjunction event with covariance
     * @returns Mahalanobis result or null if no covariance
     */
    static computeMahalanobisDistance(event: ConjunctionEvent): MahalanobisResult | null;
    /**
     * Compute covariance consistency ratio.
     *
     * The ratio of actual miss distance to predicted 1-sigma uncertainty
     * indicates whether the covariance is appropriately sized:
     * - < 1: Miss within 1-sigma (optimistic if consistently < 0.5)
     * - 1-2: Typical range for realistic covariance
     * - > 3: Covariance likely underestimated (pessimistic)
     *
     * @param event - Conjunction event with covariance
     * @returns Consistency ratio result or null if no covariance
     */
    static computeConsistencyRatio(event: ConjunctionEvent): ConsistencyRatioResult | null;
    /**
     * Perform eigenvalue analysis on position covariance.
     *
     * Analyzes the covariance matrix structure:
     * - Eigenvalues represent variance along principal axes
     * - Condition number indicates numerical stability
     * - Singular matrices indicate degenerate covariance
     *
     * @param covariance - State covariance to analyze
     * @returns Eigenvalue analysis result
     */
    static analyzeEigenvalues(covariance: StateCovariance): EigenvalueAnalysisResult;
    /**
     * Assess if covariance scale factor is appropriate.
     *
     * Compares the covariance size to typical TLE-based uncertainties:
     * - LEO: ~100m - 1km position uncertainty
     * - MEO: ~1-10km position uncertainty
     * - GEO: ~1-5km position uncertainty
     *
     * @param event - Conjunction event to assess
     * @returns Scale factor assessment or null if no covariance
     */
    static assessScaleFactor(event: ConjunctionEvent): ScaleFactorResult | null;
    /**
     * Extract 3x3 position covariance from 6x6 state covariance.
     */
    private static extractPositionCovariance_;
    /**
     * Compute eigenvalues of a 3x3 symmetric matrix.
     *
     * Uses the analytical solution for the cubic characteristic equation
     * (Cardano's formula), which is more stable than iterative methods
     * for small matrices.
     *
     * @param matrix - 3x3 symmetric matrix
     * @returns Array of 3 eigenvalues
     */
    private static computeEigenvalues3x3_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing a MechanicalRadar.
 */
interface MechanicalRadarParams extends RadarSensorParams {
    /** Antenna scan rate in degrees per second */
    scanRate?: DegreesPerSecond;
    /** Whether radar can track targets (vs just detect) */
    hasTracking?: boolean;
    /** Antenna diameter in meters */
    antennaDiameter?: number;
}
/**
 * Mechanical tracking radar (dish-based).
 *
 * Traditional radar with physically rotating antenna. May support
 * tracking mode where antenna follows a specific target.
 *
 * @example
 * ```typescript
 * const radar = new MechanicalRadar({
 *   id: 'tracking-radar-1',
 *   name: 'AN/FPQ-6',
 *   sensorType: SensorType.MECHANICAL_RADAR,
 *   beamwidth: 0.4 as Degrees,
 *   scanRate: 6 as DegreesPerSecond,
 *   hasTracking: true,
 *   fieldOfView: {
 *     minRange: 100 as Kilometers,
 *     maxRange: 40000 as Kilometers,
 *     minAzimuth: 0 as Degrees,
 *     maxAzimuth: 360 as Degrees,
 *     minElevation: 3 as Degrees,
 *     maxElevation: 85 as Degrees,
 *   },
 * });
 * ```
 */
declare class MechanicalRadar extends RadarSensor {
    /** Antenna scan rate in degrees per second */
    scanRate?: DegreesPerSecond;
    /** Whether radar can track targets */
    hasTracking: boolean;
    /** Antenna diameter in meters */
    antennaDiameter?: number;
    constructor(params: MechanicalRadarParams);
    /**
     * Calculates the time to scan across the full azimuth range.
     * Only valid if scanRate is defined.
     * @returns Scan period in seconds, or undefined if no scan rate
     */
    get scanPeriod(): number | undefined;
    /**
     * Estimates time until target enters beam during scanning.
     * Assumes continuous azimuth scanning at scanRate.
     *
     * @param targetAz - Target azimuth in degrees
     * @param currentAz - Current antenna azimuth in degrees
     * @returns Time in seconds, or undefined if no scan rate
     */
    timeToTarget(targetAz: number, currentAz: number): number | undefined;
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Creates a deep copy of this mechanical radar.
     * The cloned sensor will not have a parent assigned.
     * @returns A new MechanicalRadar instance with the same properties
     */
    clone(): MechanicalRadar;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing an OpticalSensor.
 */
interface OpticalSensorParams extends SensorParams {
    /** Telescope aperture in meters */
    aperture?: number;
    /** Focal length in meters */
    focalLength?: number;
    /** Limiting magnitude (faintest detectable) */
    limitingMagnitude?: number;
    /** Operating wavelength in nanometers */
    wavelength?: number;
    /** Field of view in degrees (for camera/CCD) */
    ccdFov?: number;
}
/**
 * Optical/visual sensor (telescope, camera).
 *
 * Produces angle-only observations (right ascension and declination)
 * using the RadecTopocentric observation class.
 *
 * @example
 * ```typescript
 * const telescope = new OpticalSensor({
 *   id: 'geodss-1',
 *   name: 'GEODSS Site 1',
 *   sensorType: SensorType.OPTICAL,
 *   aperture: 1.0,           // 1 meter aperture
 *   limitingMagnitude: 16.5, // Can see objects dimmer than mag 16
 *   fieldOfView: {
 *     minRange: 5000 as Kilometers,
 *     maxRange: 50000 as Kilometers,
 *     minAzimuth: 0 as Degrees,
 *     maxAzimuth: 360 as Degrees,
 *     minElevation: 10 as Degrees,
 *     maxElevation: 90 as Degrees,
 *   },
 * });
 *
 * const observation = telescope.observe(satellite);
 * ```
 */
declare class OpticalSensor extends Sensor {
    /** Telescope aperture in meters */
    aperture?: number;
    /** Focal length in meters */
    focalLength?: number;
    /** Limiting magnitude */
    limitingMagnitude?: number;
    /** Operating wavelength in nanometers */
    wavelength?: number;
    /** CCD field of view in degrees */
    ccdFov?: number;
    constructor(params: OpticalSensorParams);
    /**
     * Calculates the focal ratio (f/number) of the telescope.
     * @returns Focal ratio, or undefined if aperture or focalLength not set
     */
    get focalRatio(): number | undefined;
    /**
     * Creates an optical observation (Ra/Dec) of a target.
     * @param target - The space object to observe
     * @param date - Time of observation (defaults to now)
     * @returns ObservationOptical or null if target not in FOV
     */
    observe(target: SpaceObject, date?: Date): ObservationOptical | null;
    /**
     * Creates a RadecTopocentric observation without wrapping.
     * Useful for simpler use cases.
     * @param target - The space object to observe
     * @param date - Time of observation (defaults to now)
     * @returns RadecTopocentric or null if target not in FOV
     */
    observeRadec(target: SpaceObject, date?: Date): RadecTopocentric | null;
    /**
     * Checks if a target's estimated magnitude is within sensor capability.
     * Note: This is a simplified check. Actual visibility depends on
     * illumination conditions, albedo, phase angle, etc.
     *
     * @param estimatedMagnitude - Estimated apparent magnitude of target
     * @returns True if target is potentially detectable
     */
    canDetectMagnitude(estimatedMagnitude: number): boolean;
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Creates a deep copy of this optical sensor.
     * The cloned sensor will not have a parent assigned.
     * @returns A new OpticalSensor instance with the same properties
     */
    clone(): OpticalSensor;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Common SLR wavelengths in nanometers.
 */
declare const SLR_WAVELENGTHS: {
    /** Green laser (most common for SLR) */
    readonly GREEN_532: 532;
    /** Near-infrared laser */
    readonly NIR_1064: 1064;
};
/**
 * Parameters for constructing a LaserRangingSensor.
 */
interface LaserRangingSensorParams extends SensorParams {
    /** Laser wavelength in nanometers (532nm or 1064nm typical) */
    wavelength?: number;
    /** Pulse energy in Joules */
    pulseEnergy?: number;
    /** Pulse repetition rate in Hz */
    pulseRate?: number;
    /** Telescope aperture in meters */
    aperture?: number;
    /** Timing precision in picoseconds */
    timingPrecision?: number;
}
/**
 * Satellite Laser Ranging (SLR) sensor.
 *
 * Produces high-precision range observations by measuring the round-trip
 * time of laser pulses reflected from retroreflectors on satellites.
 *
 * @example
 * ```typescript
 * const slr = new LaserRangingSensor({
 *   id: 'mlrs',
 *   name: 'McDonald Laser Ranging Station',
 *   sensorType: SensorType.LASER_RANGING,
 *   wavelength: SLR_WAVELENGTHS.GREEN_532,
 *   pulseEnergy: 0.1,       // 100 mJ
 *   pulseRate: 20,          // 20 Hz
 *   timingPrecision: 30,    // 30 ps timing
 *   fieldOfView: {
 *     minRange: 500 as Kilometers,
 *     maxRange: 40000 as Kilometers,
 *     minAzimuth: 0 as Degrees,
 *     maxAzimuth: 360 as Degrees,
 *     minElevation: 20 as Degrees,
 *     maxElevation: 90 as Degrees,
 *   },
 * });
 * ```
 */
declare class LaserRangingSensor extends Sensor {
    /** Laser wavelength in nanometers */
    wavelength?: number;
    /** Pulse energy in Joules */
    pulseEnergy?: number;
    /** Pulse repetition rate in Hz */
    pulseRate?: number;
    /** Telescope aperture in meters */
    aperture?: number;
    /** Timing precision in picoseconds */
    timingPrecision?: number;
    constructor(params: LaserRangingSensorParams);
    /**
     * Converts timing precision to range precision.
     * Range precision = (c * timing_precision) / 2
     * (divide by 2 because round-trip measurement)
     *
     * @returns Range precision in meters, or undefined if timingPrecision not set
     */
    get rangePrecisionMeters(): number | undefined;
    /**
     * Creates a radar-style observation (RAE) of a target.
     * SLR provides range data along with pointing angles.
     * @param target - The space object to observe
     * @param date - Time of observation (defaults to now)
     * @returns ObservationRadar or null if target not in FOV
     */
    observe(target: SpaceObject, date?: Date): ObservationRadar | null;
    /**
     * Creates a RAE observation without wrapping.
     * @param target - The space object to observe
     * @param date - Time of observation (defaults to now)
     * @returns RAE or null if target not in FOV
     */
    observeRae(target: SpaceObject, date?: Date): RAE | null;
    /**
     * Checks if this is a green laser (532nm).
     */
    isGreenLaser(): boolean;
    /**
     * Checks if this is an infrared laser (1064nm).
     */
    isInfraredLaser(): boolean;
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Creates a deep copy of this laser ranging sensor.
     * The cloned sensor will not have a parent assigned.
     * @returns A new LaserRangingSensor instance with the same properties
     */
    clone(): LaserRangingSensor;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing a PassiveRFSensor.
 */
interface PassiveRFSensorParams extends SensorParams {
    /** Frequency bands the sensor can receive */
    frequencyBands?: string[];
    /** Minimum receivable frequency in Hz */
    minFrequency?: number;
    /** Maximum receivable frequency in Hz */
    maxFrequency?: number;
    /** Receiver sensitivity in dBm */
    sensitivity?: number;
    /** Antenna gain in dB */
    antennaGain?: number;
}
/**
 * Passive RF sensor (SIGINT, no transmission).
 *
 * Receives radio frequency emissions from satellites without transmitting.
 * Produces angle-only observations (like optical) based on received signal
 * direction of arrival.
 *
 * @example
 * ```typescript
 * const sigint = new PassiveRFSensor({
 *   id: 'rf-collector-1',
 *   name: 'RF Collection Site',
 *   sensorType: SensorType.PASSIVE_RF,
 *   frequencyBands: ['UHF', 'L-band', 'S-band'],
 *   minFrequency: 300e6,    // 300 MHz
 *   maxFrequency: 4e9,      // 4 GHz
 *   sensitivity: -120,      // -120 dBm
 *   fieldOfView: {
 *     minRange: 500 as Kilometers,
 *     maxRange: 45000 as Kilometers,
 *     minAzimuth: 0 as Degrees,
 *     maxAzimuth: 360 as Degrees,
 *     minElevation: 5 as Degrees,
 *     maxElevation: 90 as Degrees,
 *   },
 * });
 * ```
 */
declare class PassiveRFSensor extends Sensor {
    /** Frequency bands the sensor can receive */
    frequencyBands: string[];
    /** Minimum receivable frequency in Hz */
    minFrequency?: number;
    /** Maximum receivable frequency in Hz */
    maxFrequency?: number;
    /** Receiver sensitivity in dBm */
    sensitivity?: number;
    /** Antenna gain in dB */
    antennaGain?: number;
    constructor(params: PassiveRFSensorParams);
    /**
     * Gets the bandwidth of the receiver in Hz.
     * @returns Bandwidth in Hz, or undefined if frequencies not set
     */
    get bandwidth(): number | undefined;
    /**
     * Checks if a given frequency is within the sensor's receivable range.
     * @param frequency - Frequency in Hz to check
     * @returns True if frequency can be received
     */
    canReceiveFrequency(frequency: number): boolean;
    /**
     * Checks if the sensor covers a specific frequency band.
     * @param band - Band name to check (e.g., "S-band", "UHF")
     * @returns True if band is in the list
     */
    hasBand(band: string): boolean;
    /**
     * Creates an angle-only observation (Ra/Dec) of a target.
     * Passive RF provides direction-of-arrival data similar to optical.
     * @param target - The space object to observe
     * @param date - Time of observation (defaults to now)
     * @returns ObservationOptical or null if target not in FOV
     */
    observe(target: SpaceObject, date?: Date): ObservationOptical | null;
    /**
     * Creates a RadecTopocentric observation without wrapping.
     * @param target - The space object to observe
     * @param date - Time of observation (defaults to now)
     * @returns RadecTopocentric or null if target not in FOV
     */
    observeRadec(target: SpaceObject, date?: Date): RadecTopocentric | null;
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Creates a deep copy of this passive RF sensor.
     * The cloned sensor will not have a parent assigned.
     * @returns A new PassiveRFSensor instance with the same properties
     */
    clone(): PassiveRFSensor;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parser for CCSDS Orbit Ephemeris Message (OEM) files.
 * Separates parsing concern from EphemerisSatellite object management.
 *
 * @see https://public.ccsds.org/Pubs/502x0b3e1.pdf CCSDS OEM Standard
 *
 * @example
 * ```typescript
 * const oemContent = fs.readFileSync('orbit.oem', 'utf-8');
 * const parsed = OemParser.parse(oemContent);
 * const satellite = EphemerisSatellite.fromParsedOem(parsed);
 * ```
 */
declare class OemParser {
    /**
     * Parse OEM text content into structured data.
     * @param content - The raw OEM file content as a string
     * @returns Parsed OEM structure with header and data blocks
     * @throws Error if the file cannot be parsed
     */
    static parse(content: string): ParsedOem;
    /**
     * Get recommended interpolator type from OEM metadata.
     * @param metadata - The OEM metadata block
     * @returns The recommended InterpolatorType based on INTERPOLATION field
     */
    static getRecommendedInterpolator(metadata: OemMetadata): InterpolatorType;
    /**
     * Get interpolation order from OEM metadata.
     * @param metadata - The OEM metadata block
     * @returns The interpolation order (degree), defaults to 10
     */
    static getInterpolationOrder(metadata: OemMetadata): number;
    private static parseHeader_;
    private static parseDataBlocks_;
    private static parseStateVector_;
    private static parseCovarianceLine_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parsed ephemeris data from NASA Horizons.
 */
interface HorizonsEphemerisData {
    /** Epoch for this state */
    epoch: EpochUTC;
    /** Position vector in km */
    position: Vector3D<Kilometers>;
    /** Velocity vector in km/s (if available) */
    velocity?: Vector3D<KilometersPerSecond>;
    /** Light-time from observer to target (seconds) */
    lightTime?: number;
}
/**
 * Parsed result from NASA Horizons vector table.
 */
interface HorizonsVectorResult {
    /** Target body name */
    targetName: string;
    /** Center body name */
    centerBody: string;
    /** Reference frame */
    referenceFrame: string;
    /** Whether coordinates are heliocentric */
    isHeliocentric: boolean;
    /** Ephemeris data points */
    ephemeris: HorizonsEphemerisData[];
    /** Raw metadata */
    metadata: Record<string, string>;
}
/**
 * Parsed result from NASA Horizons observer table.
 */
interface HorizonsObserverResult {
    /** Target body name */
    targetName: string;
    /** Observer location */
    observerLocation: string;
    /** Observations */
    observations: Array<{
        epoch: EpochUTC;
        ra: number;
        dec: number;
        distance: number;
        lightTime: number;
    }>;
}
/**
 * Parser for NASA JPL Horizons ephemeris data.
 *
 * Horizons is a NASA/JPL system that provides precise ephemerides for solar
 * system objects. This parser handles the vector table format (positions and
 * velocities in Cartesian coordinates).
 *
 * @see https://ssd.jpl.nasa.gov/horizons/
 *
 * @example
 * ```typescript
 * // Parse vector table output from Horizons
 * const result = HorizonsParser.parseVectors(horizonsOutput);
 *
 * // Create an EphemerisBody from the data
 * const ceres = EphemerisBody.fromData(
 *   'ceres',
 *   result.targetName,
 *   CelestialBodyType.DWARF_PLANET,
 *   result.ephemeris.map(ep => ({
 *     date: ep.epoch.toDateTime(),
 *     position: { x: ep.position.x, y: ep.position.y, z: ep.position.z },
 *     velocity: ep.velocity ? { x: ep.velocity.x, y: ep.velocity.y, z: ep.velocity.z } : undefined,
 *   })),
 *   { isHeliocentric: result.isHeliocentric }
 * );
 * ```
 */
declare class HorizonsParser {
    private constructor();
    /**
     * Parses NASA Horizons vector table format.
     *
     * Expects output from Horizons with settings:
     * - VECTORS (type 2 or 3)
     * - Output in km and km/s
     *
     * @param data - Raw Horizons output text
     * @returns Parsed ephemeris data
     */
    static parseVectors(data: string): HorizonsVectorResult;
    /**
     * Parses NASA Horizons observer table format.
     *
     * @param data - Raw Horizons output text
     * @returns Parsed observer data
     */
    static parseObserver(data: string): HorizonsObserverResult;
    /**
     * Extracts a value from a key: value line.
     */
    private static extractValue_;
    /**
     * Extracts the target body name, stripping parenthetical descriptors and IDs.
     *
     * Horizons format examples:
     * - "1 Ceres                       {source: astDys}" → "1 Ceres"
     * - "Artemis II (spacecraft) (-1024) {source: ...}"  → "Artemis II"
     * - "Mars (499)"                                     → "Mars"
     */
    private static extractTargetName_;
    /**
     * Parses a vector data line from Horizons output.
     * Horizons vector output can span multiple lines.
     */
    private static parseVectorLine_;
    /**
     * Parses an observer table data line.
     */
    private static parseObserverLine_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * CDM Header section data.
 * @see CCSDS 508.0-B-1 Section 3.2
 */
interface CdmHeader {
    /** CDM format version (e.g., "1.0") */
    CCSDS_CDM_VERS: string;
    /** Message creation date/time in ISO 8601 format */
    CREATION_DATE: string;
    /** Organization that created the CDM */
    ORIGINATOR: string;
    /** Intended recipient of the message */
    MESSAGE_FOR?: string;
    /** Unique message identifier */
    MESSAGE_ID?: string;
    /** Optional comments */
    COMMENT?: string[];
}
/**
 * CDM Relative metadata and state data.
 * @see CCSDS 508.0-B-1 Section 3.3
 */
interface CdmRelativeData {
    /** Time of Closest Approach in ISO 8601 format */
    TCA: string;
    /** Total miss distance at TCA (km) */
    MISS_DISTANCE: Kilometers;
    /** Relative velocity magnitude at TCA (km/s) */
    RELATIVE_SPEED?: KilometersPerSecond;
    /** Radial component of relative position (km) */
    RELATIVE_POSITION_R?: Kilometers;
    /** In-track component of relative position (km) */
    RELATIVE_POSITION_T?: Kilometers;
    /** Cross-track component of relative position (km) */
    RELATIVE_POSITION_N?: Kilometers;
    /** Radial component of relative velocity (km/s) */
    RELATIVE_VELOCITY_R?: KilometersPerSecond;
    /** In-track component of relative velocity (km/s) */
    RELATIVE_VELOCITY_T?: KilometersPerSecond;
    /** Cross-track component of relative velocity (km/s) */
    RELATIVE_VELOCITY_N?: KilometersPerSecond;
    /** Probability of collision (0-1) */
    COLLISION_PROBABILITY?: number;
    /** Method used to compute collision probability */
    COLLISION_PROBABILITY_METHOD?: string;
    /** Start of screening period */
    START_SCREEN_PERIOD?: string;
    /** End of screening period */
    STOP_SCREEN_PERIOD?: string;
    /** Screening entry time */
    SCREEN_ENTRY_TIME?: string;
    /** Screening exit time */
    SCREEN_EXIT_TIME?: string;
}
/**
 * CDM Object type enumeration.
 */
type CdmObjectType = 'PAYLOAD' | 'ROCKET BODY' | 'DEBRIS' | 'UNKNOWN' | 'OTHER';
/**
 * CDM Maneuverable status.
 */
type CdmManeuverableStatus = 'YES' | 'NO' | 'N/A';
/**
 * CDM Object metadata section.
 * @see CCSDS 508.0-B-1 Section 3.4
 */
interface CdmObjectMetadata {
    /** Object identifier (OBJECT1 or OBJECT2) */
    OBJECT: 'OBJECT1' | 'OBJECT2';
    /** Satellite catalog designator (e.g., NORAD ID) */
    OBJECT_DESIGNATOR: string;
    /** Catalog name (e.g., "SATCAT") */
    CATALOG_NAME?: string;
    /** Object name */
    OBJECT_NAME?: string;
    /** International designator (e.g., "1998-067A") */
    INTERNATIONAL_DESIGNATOR?: string;
    /** Type of object */
    OBJECT_TYPE?: CdmObjectType;
    /** Contact position at operator organization */
    OPERATOR_CONTACT_POSITION?: string;
    /** Operator organization name */
    OPERATOR_ORGANIZATION?: string;
    /** Operator phone number */
    OPERATOR_PHONE?: string;
    /** Operator email */
    OPERATOR_EMAIL?: string;
    /** Ephemeris name/source */
    EPHEMERIS_NAME?: string;
    /** Method used to generate covariance */
    COVARIANCE_METHOD?: string;
    /** Whether object can maneuver */
    MANEUVERABLE?: CdmManeuverableStatus;
    /** Reference frame for state data */
    REF_FRAME?: string;
    /** Gravity model used */
    GRAVITY_MODEL?: string;
    /** Atmospheric model used */
    ATMOSPHERIC_MODEL?: string;
    /** N-body perturbation bodies */
    N_BODY_PERTURBATIONS?: string;
    /** Whether solar radiation pressure was modeled */
    SOLAR_RAD_PRESSURE?: 'YES' | 'NO';
    /** Whether Earth tides were modeled */
    EARTH_TIDES?: 'YES' | 'NO';
    /** Whether in-track thrust was modeled */
    INTRACK_THRUST?: 'YES' | 'NO';
}
/**
 * CDM Object state data section.
 * @see CCSDS 508.0-B-1 Section 3.5
 */
interface CdmObjectData {
    /** Object identifier (OBJECT1 or OBJECT2) */
    OBJECT: 'OBJECT1' | 'OBJECT2';
    /** Optional comment */
    COMMENT?: string;
    /** Time tag for state vector */
    TIME_LASTOB_START?: string;
    TIME_LASTOB_END?: string;
    /** X position (km) */
    X: Kilometers;
    /** Y position (km) */
    Y: Kilometers;
    /** Z position (km) */
    Z: Kilometers;
    /** X velocity (km/s) */
    X_DOT: KilometersPerSecond;
    /** Y velocity (km/s) */
    Y_DOT: KilometersPerSecond;
    /** Z velocity (km/s) */
    Z_DOT: KilometersPerSecond;
    /** Object mass (kg) */
    MASS?: number;
    /** Solar radiation pressure coefficient */
    CD_AREA_OVER_MASS?: number;
    /** Atmospheric drag coefficient */
    CR_AREA_OVER_MASS?: number;
    /** Thrust acceleration (m/s^2) */
    THRUST_ACCELERATION?: number;
    /** Solar radiation pressure area (m^2) */
    SEDR?: number;
    /** Radial-Radial covariance (km^2) */
    CR_R?: number;
    /** Transverse-Radial covariance (km^2) */
    CT_R?: number;
    /** Transverse-Transverse covariance (km^2) */
    CT_T?: number;
    /** Normal-Radial covariance (km^2) */
    CN_R?: number;
    /** Normal-Transverse covariance (km^2) */
    CN_T?: number;
    /** Normal-Normal covariance (km^2) */
    CN_N?: number;
    /** Rdot-R covariance (km^2/s) */
    CRDOT_R?: number;
    /** Rdot-T covariance (km^2/s) */
    CRDOT_T?: number;
    /** Rdot-N covariance (km^2/s) */
    CRDOT_N?: number;
    /** Rdot-Rdot covariance (km^2/s^2) */
    CRDOT_RDOT?: number;
    /** Tdot-R covariance (km^2/s) */
    CTDOT_R?: number;
    /** Tdot-T covariance (km^2/s) */
    CTDOT_T?: number;
    /** Tdot-N covariance (km^2/s) */
    CTDOT_N?: number;
    /** Tdot-Rdot covariance (km^2/s^2) */
    CTDOT_RDOT?: number;
    /** Tdot-Tdot covariance (km^2/s^2) */
    CTDOT_TDOT?: number;
    /** Ndot-R covariance (km^2/s) */
    CNDOT_R?: number;
    /** Ndot-T covariance (km^2/s) */
    CNDOT_T?: number;
    /** Ndot-N covariance (km^2/s) */
    CNDOT_N?: number;
    /** Ndot-Rdot covariance (km^2/s^2) */
    CNDOT_RDOT?: number;
    /** Ndot-Tdot covariance (km^2/s^2) */
    CNDOT_TDOT?: number;
    /** Ndot-Ndot covariance (km^2/s^2) */
    CNDOT_NDOT?: number;
}
/**
 * Fully parsed CDM structure containing all sections.
 */
interface ParsedCdm {
    /** CDM header information */
    header: CdmHeader;
    /** Relative metadata and data */
    relativeData: CdmRelativeData;
    /** Object 1 metadata */
    object1Metadata: CdmObjectMetadata;
    /** Object 1 state data */
    object1Data: CdmObjectData;
    /** Object 2 metadata */
    object2Metadata: CdmObjectMetadata;
    /** Object 2 state data */
    object2Data: CdmObjectData;
}
/**
 * Options for CDM export.
 */
interface CdmExportOptions {
    /** Originator identifier (organization creating the CDM) */
    originator?: string;
    /** Unique message identifier */
    messageId?: string;
    /** Intended recipient */
    messageFor?: string;
    /** Include full 6x6 covariance (default: position-only 3x3) */
    includeFullCovariance?: boolean;
    /** Include velocity covariance even if not full 6x6 */
    includeVelocityCovariance?: boolean;
    /** Optional comments to include in header */
    comments?: string[];
    /** Object 1 metadata overrides */
    object1Metadata?: Partial<CdmObjectMetadata>;
    /** Object 2 metadata overrides */
    object2Metadata?: Partial<CdmObjectMetadata>;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parser for CCSDS Conjunction Data Message (CDM) KVN format.
 *
 * Parses text-based CDM files conforming to CCSDS 508.0-B-1 standard.
 * Supports both reading CDM data and converting to ConjunctionEvent objects.
 *
 * @see https://public.ccsds.org/Pubs/508x0b1e2c2.pdf CCSDS CDM Standard
 *
 * @example
 * ```typescript
 * const cdmContent = fs.readFileSync('conjunction.cdm', 'utf-8');
 * const parsed = CdmParser.parse(cdmContent);
 * const event = CdmParser.toConjunctionEvent(parsed);
 * console.log(event.toString());
 * ```
 */
declare class CdmParser {
    private constructor();
    /**
     * Parse CDM KVN format text into structured data.
     * @param content - The raw CDM file content as a string
     * @returns Parsed CDM structure with all sections
     * @throws ParseError if the file cannot be parsed or is missing required fields
     */
    static parse(content: string): ParsedCdm;
    /**
     * Validate parsed CDM structure for required fields.
     * @param cdm - Parsed CDM to validate
     * @throws ParseError if required fields are missing
     */
    static validate(cdm: ParsedCdm): void;
    /**
     * Convert parsed CDM to a ConjunctionEvent object.
     *
     * Reconstructs the conjunction event from CDM data, including
     * state vectors, relative state, and covariance if available.
     *
     * @param cdm - Parsed CDM structure
     * @returns ConjunctionEvent with data from CDM
     */
    static toConjunctionEvent(cdm: ParsedCdm): ConjunctionEvent;
    /**
     * Parse all key-value pairs from CDM lines.
     */
    private static parseKeyValues_;
    /**
     * Check if a key is object-specific (should be prefixed).
     */
    private static isObjectSpecificKey_;
    /**
     * Parse header section.
     */
    private static parseHeader_;
    /**
     * Parse relative metadata/data section.
     */
    private static parseRelativeData_;
    /**
     * Parse object metadata section.
     */
    private static parseObjectMetadata_;
    /**
     * Parse object state data section.
     */
    private static parseObjectData_;
    /**
     * Parse covariance matrix from object data.
     * Returns 3x3 position covariance or null if not available.
     */
    private static parseCovariance_;
    /**
     * Parse optional float value from key-value map.
     */
    private static parseOptionalFloat_;
    /**
     * Validate parsed CDM for required fields.
     */
    private static validate_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Exporter for CCSDS Conjunction Data Message (CDM) KVN format.
 *
 * Exports ConjunctionEvent objects to text-based CDM files conforming
 * to CCSDS 508.0-B-1 standard.
 *
 * @see https://public.ccsds.org/Pubs/508x0b1e2c2.pdf CCSDS CDM Standard
 *
 * @example
 * ```typescript
 * const event = assessment.assess({ startTime, endTime });
 * const cdmContent = CdmExporter.export(event, {
 *   originator: 'OOTK',
 *   messageId: 'CDM-2025-001',
 * });
 * fs.writeFileSync('conjunction.cdm', cdmContent);
 * ```
 */
declare class CdmExporter {
    private constructor();
    /**
     * Export a ConjunctionEvent to CDM KVN format string.
     * @param event - The conjunction event to export
     * @param options - Export configuration options
     * @returns CDM KVN format string
     */
    static export(event: ConjunctionEvent, options?: CdmExportOptions): string;
    /**
     * Export multiple conjunction events to separate CDM strings.
     * @param events - Array of conjunction events
     * @param options - Export configuration options
     * @returns Array of CDM KVN format strings
     */
    static exportMultiple(events: ConjunctionEvent[], options?: CdmExportOptions): string[];
    /**
     * Format header section.
     */
    private static formatHeader_;
    /**
     * Format relative metadata/data section.
     */
    private static formatRelativeData_;
    /**
     * Format object metadata section.
     */
    private static formatObjectMetadata_;
    /**
     * Format object state data section.
     */
    private static formatObjectData_;
    /**
     * Format covariance matrix elements.
     */
    private static formatCovariance_;
    /**
     * Format Date to ISO 8601 string for CDM.
     */
    private static formatDateTime_;
    /**
     * Format a number with appropriate precision.
     */
    private static formatNumber_;
    /**
     * Format a number in scientific notation.
     */
    private static formatScientific_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * Base options for ODM (Orbit Data Message) export.
 */
interface OdmExportOptions {
    /** Originator of the file. Default: 'KeepTrack' */
    originator?: string;
    /** Optional unique message identifier */
    messageId?: string;
    /** Optional comment lines */
    comments?: string[];
    /** Reference frame for state vectors. Default: 'TEME' */
    refFrame?: 'TEME' | 'EME2000';
}
/**
 * OPM (Orbit Parameter Message) export options.
 */
interface OpmExportOptions extends OdmExportOptions {
    /** Include optional osculating Keplerian elements section */
    includeKeplerian?: boolean;
}
/**
 * OEM (Orbit Ephemeris Message) export options.
 */
interface OemExportOptions extends OdmExportOptions {
    /** Interpolation method. Default: 'LAGRANGE' */
    interpolation?: string;
    /** Interpolation order. Default: 7 */
    interpolationDegree?: number;
}
/**
 * OEM from state vectors export options.
 */
interface OemFromStateVectorsOptions extends OdmExportOptions {
    /** Interpolation method. Default: 'LAGRANGE' */
    interpolation?: string;
    /** Interpolation order. Default: 7 */
    interpolationDegree?: number;
    /** Center body name. Default: 'EARTH' */
    centerName?: string;
}
/**
 * OMM (Orbit Mean-Elements Message) export options.
 */
type OmmExportOptions = OdmExportOptions;

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Exporter for CCSDS Orbit Data Messages (ODM) in KVN format.
 *
 * Supports three message types from the CCSDS 502.0-B-3 standard:
 * - **OPM** (Orbit Parameter Message): single-epoch state vector
 * - **OEM** (Orbit Ephemeris Message): propagated ephemeris over a time span
 * - **OMM** (Orbit Mean-Elements Message): mean orbital elements (TLE equivalent)
 *
 * @see https://public.ccsds.org/Pubs/502x0b3e1.pdf CCSDS ODM Standard
 *
 * @example
 * ```typescript
 * const opm = OdmExporter.formatOpm(satellite, new Date(), {
 *   originator: 'KeepTrack',
 *   includeKeplerian: true,
 * });
 *
 * const oem = OdmExporter.formatOem(satellite, startTime, 24, 60);
 *
 * const omm = OdmExporter.formatOmm(satellite);
 * ```
 */
declare class OdmExporter {
    private constructor();
    /**
     * Export a satellite's state at a given epoch as OPM KVN.
     * @param satellite - The satellite to export
     * @param date - The epoch for the state vector
     * @param options - Export configuration
     * @returns OPM KVN format string
     */
    static formatOpm(satellite: Satellite, date: Date, options?: OpmExportOptions): string;
    /**
     * Export propagated ephemeris as OEM KVN.
     * @param satellite - The satellite to export
     * @param startTime - Start of ephemeris span
     * @param spanHours - Duration in hours
     * @param stepSec - Step size in seconds
     * @param options - Export configuration
     * @returns OEM KVN format string
     */
    static formatOem(satellite: Satellite, startTime: Date, spanHours: number, stepSec: number, options?: OemExportOptions): string;
    /**
     * Export an array of J2000 state vectors as OEM KVN.
     *
     * Unlike {@link formatOem}, which propagates a TLE-based satellite, this
     * method serializes pre-computed state vectors directly. Useful for
     * converting parsed ephemeris data (e.g., NASA Horizons) to CCSDS OEM.
     *
     * @param stateVectors - Array of J2000 state vectors to export
     * @param metadata - Object identification metadata
     * @param options - Export configuration
     * @returns OEM KVN format string
     */
    static formatOemFromStateVectors(stateVectors: J2000[], metadata: {
        objectName: string;
        objectId: string;
    }, options?: OemFromStateVectorsOptions): string;
    /**
     * Export a satellite's mean elements as OMM KVN.
     * @param satellite - The satellite to export
     * @param options - Export configuration
     * @returns OMM KVN format string
     */
    static formatOmm(satellite: Satellite, options?: OmmExportOptions): string;
    /**
     * Export multiple satellites' mean elements as concatenated OMM KVN blocks.
     * @param satellites - Array of satellites
     * @param options - Export configuration
     * @returns OMM KVN format string with all satellites
     */
    static formatOmmCatalog(satellites: Satellite[], options?: OmmExportOptions): string;
    /**
     * Format Date to CCSDS datetime string: YYYY-MM-DDTHH:MM:SS.ssssss
     */
    private static formatDateTime_;
    /**
     * Format number with 9 decimal places.
     */
    private static formatNumber_;
    /**
     * Append COMMENT lines if provided.
     */
    private static appendComments_;
    /**
     * Convert TLE epoch (2-digit year + fractional day) to a Date object.
     */
    private static tleEpochToDate_;
    /**
     * Extract ephemeris type from TLE line 1 column 62 (0-indexed).
     */
    private static getEphemerisType_;
    /**
     * Extract classification type from TLE line 1 column 7 (0-indexed).
     */
    private static getClassificationType_;
    /**
     * Extract element set number from TLE line 1 columns 64-67 (0-indexed).
     */
    private static getElementSetNo_;
    /**
     * Extract revolution number at epoch from TLE line 2 columns 63-67 (0-indexed).
     */
    private static getRevAtEpoch_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * OMM file header information from CCSDS format.
 * @see CCSDS 502.0-B-3 Table 4-1
 */
interface OmmHeader {
    /** Format version (e.g., '3.0') */
    CCSDS_OMM_VERS: string;
    /** File creation date/time in UTC */
    CREATION_DATE: string;
    /** Creating agency or operator */
    ORIGINATOR: string;
    /** Optional unique message identifier */
    MESSAGE_ID?: string;
    /** Optional classification/caveats */
    CLASSIFICATION?: string;
    /** Optional comment lines from header */
    COMMENT?: string[];
}
/**
 * OMM metadata block containing object and reference frame information.
 * @see CCSDS 502.0-B-3 Table 4-2
 */
interface OmmMetadata {
    /** Spacecraft name */
    OBJECT_NAME: string;
    /** Object identifier (international designator) */
    OBJECT_ID: string;
    /** Origin of the reference frame (e.g., 'EARTH') */
    CENTER_NAME: string;
    /** Reference frame (e.g., 'TEME', 'EME2000') */
    REF_FRAME: string;
    /** Epoch of reference frame, if not intrinsic */
    REF_FRAME_EPOCH?: string;
    /** Time system (e.g., 'UTC') */
    TIME_SYSTEM: string;
    /** Mean element theory (e.g., 'SGP4', 'DSST') */
    MEAN_ELEMENT_THEORY: string;
    /** Optional comment lines */
    COMMENT?: string[];
}
/**
 * Mean Keplerian elements data.
 * @see CCSDS 502.0-B-3 Table 4-3
 */
interface OmmMeanElements {
    /** Epoch of Mean Keplerian elements */
    EPOCH: string;
    /** Semi-major axis in km (mutually exclusive with MEAN_MOTION) */
    SEMI_MAJOR_AXIS?: number;
    /** Mean motion in rev/day (mutually exclusive with SEMI_MAJOR_AXIS) */
    MEAN_MOTION?: number;
    /** Eccentricity */
    ECCENTRICITY: number;
    /** Inclination in degrees */
    INCLINATION: number;
    /** Right ascension of ascending node in degrees */
    RA_OF_ASC_NODE: number;
    /** Argument of pericenter in degrees */
    ARG_OF_PERICENTER: number;
    /** Mean anomaly in degrees */
    MEAN_ANOMALY: number;
    /** Gravitational coefficient in km^3/s^2 */
    GM?: number;
    /** Optional comment lines */
    COMMENT?: string[];
}
/**
 * Spacecraft parameters.
 * @see CCSDS 502.0-B-3 Table 4-3
 */
interface OmmSpacecraftParameters {
    /** Spacecraft mass in kg */
    MASS?: number;
    /** Solar radiation pressure area in m^2 */
    SOLAR_RAD_AREA?: number;
    /** Solar radiation pressure coefficient */
    SOLAR_RAD_COEFF?: number;
    /** Drag area in m^2 */
    DRAG_AREA?: number;
    /** Drag coefficient */
    DRAG_COEFF?: number;
    /** Optional comment lines */
    COMMENT?: string[];
}
/**
 * TLE-related parameters.
 * @see CCSDS 502.0-B-3 Table 4-3
 */
interface OmmTleParameters {
    /** Ephemeris type (default 0) */
    EPHEMERIS_TYPE?: number;
    /** Classification type (default 'U') */
    CLASSIFICATION_TYPE?: string;
    /** NORAD catalog number */
    NORAD_CAT_ID?: number;
    /** Element set number */
    ELEMENT_SET_NO?: number;
    /** Revolution number at epoch */
    REV_AT_EPOCH?: number;
    /** SGP4 drag parameter (1/Earth radii) */
    BSTAR?: number;
    /** SGP4-XP ballistic coefficient (m^2/kg) */
    BTERM?: number;
    /** First time derivative of mean motion (rev/day^2) */
    MEAN_MOTION_DOT?: number;
    /** Second time derivative of mean motion (rev/day^3) */
    MEAN_MOTION_DDOT?: number;
    /** SGP4-XP solar radiation pressure coefficient (m^2/kg) */
    AGOM?: number;
    /** Optional comment lines */
    COMMENT?: string[];
}
/**
 * Position/Velocity covariance matrix (6x6 lower triangular form).
 * @see CCSDS 502.0-B-3 Table 4-3
 */
interface OmmCovarianceMatrix {
    /** Reference frame for covariance data */
    COV_REF_FRAME?: string;
    /** Covariance matrix elements (lower triangular, 21 values) */
    CX_X?: number;
    CY_X?: number;
    CY_Y?: number;
    CZ_X?: number;
    CZ_Y?: number;
    CZ_Z?: number;
    CX_DOT_X?: number;
    CX_DOT_Y?: number;
    CX_DOT_Z?: number;
    CX_DOT_X_DOT?: number;
    CY_DOT_X?: number;
    CY_DOT_Y?: number;
    CY_DOT_Z?: number;
    CY_DOT_X_DOT?: number;
    CY_DOT_Y_DOT?: number;
    CZ_DOT_X?: number;
    CZ_DOT_Y?: number;
    CZ_DOT_Z?: number;
    CZ_DOT_X_DOT?: number;
    CZ_DOT_Y_DOT?: number;
    CZ_DOT_Z_DOT?: number;
    /** Optional comment lines */
    COMMENT?: string[];
}
/**
 * User-defined parameters section.
 */
interface OmmUserDefined {
    [key: string]: string;
}
/**
 * Fully parsed OMM file structure.
 * @see CCSDS 502.0-B-3 Section 4.2
 */
interface ParsedOmm {
    /** File header information */
    header: OmmHeader;
    /** Metadata about the object and reference frame */
    metadata: OmmMetadata;
    /** Mean Keplerian elements */
    meanElements: OmmMeanElements;
    /** Optional spacecraft parameters */
    spacecraftParameters?: OmmSpacecraftParameters;
    /** Optional TLE-related parameters */
    tleParameters?: OmmTleParameters;
    /** Optional covariance matrix */
    covarianceMatrix?: OmmCovarianceMatrix;
    /** Optional user-defined parameters */
    userDefined?: OmmUserDefined;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parser for CCSDS Orbit Mean-Elements Message (OMM) KVN format.
 *
 * Parses text-based OMM files conforming to CCSDS 502.0-B-3 Section 4.
 * Supports TLE-compatible mean elements (SGP/SGP4/SGP4-XP) and other
 * mean element theories (DSST, USM).
 *
 * @see https://public.ccsds.org/Pubs/502x0b3e1.pdf CCSDS OMM Standard
 *
 * @example
 * ```typescript
 * const ommContent = fs.readFileSync('orbit.omm', 'utf-8');
 * const parsed = OmmParser.parse(ommContent);
 * console.log(parsed.meanElements.EPOCH);
 * console.log(parsed.meanElements.MEAN_MOTION);
 * ```
 */
declare class OmmParser {
    private constructor();
    /**
     * Parse OMM KVN format text into structured data.
     * @param content - The raw OMM file content as a string
     * @returns Parsed OMM structure with all sections
     * @throws ParseError if the file cannot be parsed or is missing required fields
     */
    static parse(content: string): ParsedOmm;
    /**
     * Check if a parsed OMM represents TLE-compatible data.
     * @param omm - Parsed OMM structure
     * @returns true if the OMM uses SGP, SGP4, or SGP4-XP mean element theory
     */
    static isTleCompatible(omm: ParsedOmm): boolean;
    /**
     * Parse a CelesTrak-style flat JSON OMM object into the structured ParsedOmm format.
     *
     * CelesTrak's JSON OMM format is a flat object with all fields at the top level,
     * omitting metadata fields like CENTER_NAME, REF_FRAME, TIME_SYSTEM, and
     * MEAN_ELEMENT_THEORY (which are always EARTH/TEME/UTC/SGP4 for GP data).
     *
     * @param omm - A flat OMM JSON object from CelesTrak
     * @returns Parsed OMM structure with inferred metadata
     */
    static parseJson(omm: OmmDataFormat): ParsedOmm;
    /**
     * Parse an array of CelesTrak-style flat JSON OMM objects.
     * @param ommArray - Array of flat OMM JSON objects from CelesTrak
     * @returns Array of parsed OMM structures
     */
    static parseJsonArray(ommArray: OmmDataFormat[]): ParsedOmm[];
    /**
     * Parse all key-value pairs from OMM lines (excluding COMMENT lines).
     */
    private static parseKeyValues_;
    /**
     * Parse COMMENT lines and assign them to sections based on position.
     *
     * Comments are assigned to sections based on the keywords that follow them.
     * The OMM KVN format allows comments at the beginning of each section.
     */
    private static parseComments_;
    /**
     * Parse header section.
     * @see CCSDS 502.0-B-3 Table 4-1
     */
    private static parseHeader_;
    /**
     * Parse metadata section.
     * @see CCSDS 502.0-B-3 Table 4-2
     */
    private static parseMetadata_;
    /**
     * Parse mean Keplerian elements section.
     * @see CCSDS 502.0-B-3 Table 4-3
     */
    private static parseMeanElements_;
    /**
     * Parse optional spacecraft parameters section.
     * @see CCSDS 502.0-B-3 Table 4-3
     */
    private static parseSpacecraftParameters_;
    /**
     * Parse optional TLE-related parameters section.
     * @see CCSDS 502.0-B-3 Table 4-3
     */
    private static parseTleParameters_;
    /**
     * Parse optional covariance matrix section.
     * @see CCSDS 502.0-B-3 Table 4-3
     */
    private static parseCovarianceMatrix_;
    /**
     * Parse user-defined parameters section.
     */
    private static parseUserDefined_;
    /**
     * Parse a required float field.
     * @throws ParseError if the field is missing or not a valid number
     */
    private static parseRequiredFloat_;
    /**
     * Parse an optional float field.
     */
    private static parseOptionalFloat_;
    /**
     * Parse an optional integer field.
     */
    private static parseOptionalInt_;
    /**
     * Validate parsed OMM for required fields and consistency.
     * @throws ParseError if validation fails
     */
    private static validate_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/** Frequency in Hertz */
type Hertz = number & {
    _brand: 'Hertz';
};
/** Power in Watts */
type Watts = number & {
    _brand: 'Watts';
};
/** Power in decibels relative to 1 milliwatt */
type Dbm = number & {
    _brand: 'Dbm';
};
/** Power in decibels relative to 1 watt */
type Dbw = number & {
    _brand: 'Dbw';
};
/** Gain or loss in decibels */
type Decibels = number & {
    _brand: 'Decibels';
};
/**
 * Modulation types for communication signals.
 */
declare enum ModulationType {
    /** Binary Phase Shift Keying */
    BPSK = "BPSK",
    /** Quadrature Phase Shift Keying */
    QPSK = "QPSK",
    /** 8-Phase Shift Keying */
    PSK8 = "8PSK",
    /** 16-Quadrature Amplitude Modulation */
    QAM16 = "16QAM",
    /** 64-Quadrature Amplitude Modulation */
    QAM64 = "64QAM",
    /** Frequency Modulation */
    FM = "FM",
    /** Amplitude Modulation */
    AM = "AM",
    /** On-Off Keying */
    OOK = "OOK",
    /** Gaussian Minimum Shift Keying */
    GMSK = "GMSK",
    /** Offset QPSK */
    OQPSK = "OQPSK"
}
/**
 * Communication device types for classification.
 */
declare enum CommDeviceType {
    TRANSMITTER = "TRANSMITTER",
    RECEIVER = "RECEIVER",
    TRANSPONDER = "TRANSPONDER",
    BEACON = "BEACON"
}
/**
 * Union type representing valid communication device platforms.
 * Devices can be mounted on ground objects (stations) or space objects (satellites).
 */
type CommPlatform = GroundObject | SpaceObject;
/**
 * Link budget calculation result.
 * All values in decibels unless otherwise noted.
 */
interface LinkBudget {
    /** Effective Isotropic Radiated Power (dBW) */
    eirp: Dbw;
    /** Free Space Path Loss (dB) - positive value representing loss */
    fspl: Decibels;
    /** Received power at receiver input (dBW) */
    receivedPower: Dbw;
    /** Signal-to-Noise Ratio (dB) */
    snr: Decibels;
    /** Distance between transmitter and receiver (km) */
    distance: number;
    /** Frequency used for calculation (Hz) */
    frequency: Hertz;
}
/**
 * Relay link budget for transponder relay calculations.
 * Includes both uplink and downlink budgets.
 */
interface RelayLinkBudget {
    /** Uplink budget (ground to satellite) */
    uplink: LinkBudget;
    /** Downlink budget (satellite to ground) */
    downlink: LinkBudget;
    /** Overall end-to-end SNR (dB) */
    endToEndSnr: Decibels;
    /** Total propagation delay including transponder delay (seconds) */
    totalDelay: number;
}
/**
 * Serialized representation of a communication device.
 */
interface SerializedCommDevice {
    /** The class name of the device */
    type: string;
    /** Unique identifier */
    id: number;
    /** Human-readable name */
    name: string;
    /** Device type classification */
    deviceType: CommDeviceType;
    /** Parent platform ID (reference only, not full object) */
    parentId?: number;
    /** Additional type-specific data */
    [key: string]: unknown;
}
/**
 * Serialized representation of an antenna.
 */
interface SerializedAntenna {
    /** Antenna gain in dB */
    gain: Decibels;
    /** Beamwidth in degrees (optional) */
    beamwidth?: number;
    /** Efficiency factor 0-1 (optional) */
    efficiency?: number;
}
/**
 * Converts Watts to dBW.
 * @param watts - Power in Watts
 * @returns Power in dBW
 */
declare function wattsToDbw(watts: Watts): Dbw;
/**
 * Converts dBW to Watts.
 * @param dbw - Power in dBW
 * @returns Power in Watts
 */
declare function dbwToWatts(dbw: Dbw): Watts;
/**
 * Converts dBm to dBW.
 * @param dbm - Power in dBm
 * @returns Power in dBW
 */
declare function dbmToDbw(dbm: Dbm): Dbw;
/**
 * Converts dBW to dBm.
 * @param dbw - Power in dBW
 * @returns Power in dBm
 */
declare function dbwToDbm(dbw: Dbw): Dbm;
/**
 * Calculates Free Space Path Loss.
 * FSPL = 20*log10(d) + 20*log10(f) + 20*log10(4*pi/c)
 * Simplified: FSPL(dB) = 20*log10(d_km) + 20*log10(f_Hz) - 147.55
 *
 * @param distanceKm - Distance in kilometers
 * @param frequencyHz - Frequency in Hertz
 * @returns Free space path loss in dB (positive value)
 */
declare function calculateFspl(distanceKm: number, frequencyHz: Hertz): Decibels;
/**
 * Speed of light in km/s for delay calculations.
 */
declare const SPEED_OF_LIGHT_KM_S = 299792.458;
/**
 * Calculates propagation delay for a given distance.
 * @param distanceKm - Distance in kilometers
 * @returns Delay in seconds
 */
declare function calculatePropagationDelay(distanceKm: number): number;

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing an Antenna.
 */
interface AntennaParams {
    /** Antenna gain in dB (isotropic reference) */
    gain: Decibels;
    /** 3dB beamwidth in degrees (optional) */
    beamwidth?: number;
    /** Antenna efficiency factor 0-1 (optional, default 0.55) */
    efficiency?: number;
}
/**
 * Represents an antenna for communication systems.
 *
 * Antennas are characterized primarily by their gain, which determines
 * how much they amplify signals in a particular direction compared to
 * an isotropic (omnidirectional) radiator.
 *
 * @example
 * ```typescript
 * // High-gain ground station antenna
 * const groundAntenna = new Antenna({
 *   gain: 45 as Decibels,
 *   beamwidth: 1.5,
 *   efficiency: 0.65,
 * });
 *
 * // Satellite antenna with moderate gain
 * const satAntenna = new Antenna({
 *   gain: 20 as Decibels,
 *   beamwidth: 15,
 * });
 *
 * // Simple omnidirectional antenna
 * const omni = Antenna.omnidirectional();
 * ```
 */
declare class Antenna {
    /** Antenna gain in dB (isotropic reference) */
    readonly gain: Decibels;
    /** 3dB beamwidth in degrees */
    readonly beamwidth?: number;
    /** Antenna efficiency factor 0-1 */
    readonly efficiency: number;
    constructor(params: AntennaParams);
    /**
     * Creates an omnidirectional (isotropic) antenna with 0 dB gain.
     * @returns An antenna with 0 dB gain
     */
    static omnidirectional(): Antenna;
    /**
     * Creates an antenna from a dish diameter and frequency.
     * Uses the standard parabolic antenna gain formula:
     * G = efficiency * (pi * D / lambda)^2
     *
     * @param diameterMeters - Dish diameter in meters
     * @param frequencyHz - Operating frequency in Hz
     * @param efficiency - Antenna efficiency (default 0.55)
     * @returns An antenna with calculated gain
     */
    static fromDishDiameter(diameterMeters: number, frequencyHz: number, efficiency?: number): Antenna;
    /**
     * Calculates gain reduction for off-axis pointing.
     * Uses a simple Gaussian approximation based on beamwidth.
     *
     * @param offAxisAngleDegrees - Angle off boresight in degrees
     * @returns Gain reduction in dB (negative value)
     */
    getOffAxisLoss(offAxisAngleDegrees: number): Decibels;
    /**
     * Gets the effective gain including off-axis loss.
     * @param offAxisAngleDegrees - Angle off boresight in degrees
     * @returns Effective gain in dB
     */
    getEffectiveGain(offAxisAngleDegrees: number): Decibels;
    /**
     * Creates a deep copy of this antenna.
     * @returns A new Antenna instance with the same properties
     */
    clone(): Antenna;
    /**
     * Creates a serializable representation of this antenna.
     */
    serialize(): SerializedAntenna;
    /**
     * Creates an Antenna from serialized data.
     * @param data - Serialized antenna data
     * @returns A new Antenna instance
     */
    static deserialize(data: SerializedAntenna): Antenna;
    /**
     * Returns a string representation of this antenna.
     */
    toString(): string;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing a CommunicationDevice.
 */
interface CommunicationDeviceParams {
    /** Unique identifier for the device */
    id: number;
    /** Human-readable name */
    name: string;
    /** Additional metadata */
    metadata?: Record<string, unknown>;
}
/**
 * Abstract base class for all communication devices.
 *
 * Communication devices are components that attach to platforms (ground stations
 * or satellites) rather than being location-based objects themselves. Position
 * is delegated to the parent platform.
 *
 * @example
 * ```typescript
 * // Create a transmitter and attach to ground station
 * const tx = new Transmitter({
 *   id: 'gs-uplink',
 *   name: 'Ground Station Uplink',
 *   frequency: 14e9 as Hertz,
 *   power: 1000 as Watts,
 *   antenna: new Antenna({ gain: 45 as Decibels }),
 * });
 *
 * groundStation.addCommDevice(tx);
 * tx.setParent(groundStation);
 * ```
 */
declare abstract class CommunicationDevice implements CommunicationDeviceInterface {
    /** Unique identifier */
    readonly id: number;
    /** Human-readable name */
    name: string;
    /** Additional metadata */
    metadata?: Record<string, unknown>;
    /** Parent platform this device is attached to */
    private parent_?;
    constructor(params: CommunicationDeviceParams);
    /**
     * Returns the device type classification.
     */
    abstract get deviceType(): CommDeviceType;
    /**
     * Creates a deep copy of this communication device.
     * The cloned device will not have a parent assigned.
     * @returns A new CommunicationDevice instance with the same properties
     */
    abstract clone(): CommunicationDevice;
    /**
     * Gets the parent platform this device is attached to.
     * @throws Error if device has no parent assigned
     */
    get parent(): CommPlatform;
    /**
     * Sets the parent platform for this device.
     * @param platform - The ground object or space object to attach to
     */
    setParent(platform: CommPlatform): void;
    /**
     * Checks if this device has a parent platform assigned.
     */
    hasParent(): boolean;
    /**
     * Gets the device's position in J2000 coordinates.
     * Delegates to the parent platform.
     * @param date - Time for position calculation (defaults to now)
     * @returns J2000 state vector
     * @throws Error if no parent platform assigned
     */
    getJ2000(date?: Date): J2000;
    /**
     * Calculates the distance to another communication device.
     * @param other - The other device
     * @param date - Time for calculation (defaults to now)
     * @returns Distance in kilometers
     */
    getDistanceTo(other: CommunicationDevice, date?: Date): number;
    /**
     * Creates a serializable representation of this device.
     */
    serialize(): SerializedCommDevice;
    /**
     * Returns device-type-specific serialization data.
     * Override in subclasses to add additional fields.
     */
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Returns a string representation of this device.
     */
    toString(): string;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing a Receiver.
 */
interface ReceiverParams extends CommunicationDeviceParams {
    /** Receive frequency in Hz */
    frequency: Hertz;
    /** Receiver bandwidth in Hz */
    bandwidth: Hertz;
    /** Receiver noise figure in dB */
    noiseFigure: Decibels;
    /** Minimum required SNR for successful reception in dB */
    minimumSnr: Decibels;
    /** Antenna for reception */
    antenna: Antenna;
    /** Line losses in dB (cables, connectors, etc.) */
    lineLoss?: Decibels;
}
/**
 * Receiver communication device.
 *
 * Represents a device that receives RF signals, such as a ground station
 * downlink receiver or satellite command receiver.
 *
 * @example
 * ```typescript
 * // Ground station downlink receiver
 * const downlink = new Receiver({
 *   id: 'gs-downlink',
 *   name: 'Ground Station Downlink',
 *   frequency: 12e9 as Hertz,    // 12 GHz (Ku-band downlink)
 *   bandwidth: 36e6 as Hertz,    // 36 MHz
 *   noiseFigure: 1.5 as Decibels,
 *   minimumSnr: 10 as Decibels,
 *   antenna: new Antenna({ gain: 45 as Decibels }),
 * });
 *
 * groundStation.addCommDevice(downlink);
 * downlink.setParent(groundStation);
 *
 * // Check if we can receive from satellite transmitter
 * if (downlink.canReceive(satelliteTransmitter, date)) {
 *   console.log('Link closed successfully');
 * }
 * ```
 */
declare class Receiver extends CommunicationDevice {
    /** Receive frequency in Hz */
    frequency: Hertz;
    /** Receiver bandwidth in Hz */
    bandwidth: Hertz;
    /** Receiver noise figure in dB */
    noiseFigure: Decibels;
    /** Minimum required SNR for successful reception in dB */
    minimumSnr: Decibels;
    /** Antenna for reception */
    antenna: Antenna;
    /** Line losses in dB */
    lineLoss: Decibels;
    constructor(params: ReceiverParams);
    get deviceType(): CommDeviceType;
    /**
     * Creates a deep copy of this receiver.
     * The cloned receiver will not have a parent assigned.
     * @returns A new Receiver instance with the same properties
     */
    clone(): Receiver;
    /**
     * Gets the noise floor in dBW.
     * Noise Floor = kTB + Noise Figure
     * = -228.6 dBW/K/Hz + 10*log10(290K) + 10*log10(BW) + NF
     * = -204 dBW/Hz + 10*log10(BW) + NF (at 290K)
     */
    get noiseFloor(): number;
    /**
     * Gets the system temperature in Kelvin (assuming 290K reference).
     * T_sys = T_ref * (10^(NF/10) - 1) + T_ref
     * Simplified: T_sys = T_ref * 10^(NF/10)
     */
    get systemTemperature(): number;
    /**
     * Gets the G/T (gain over system temperature) in dB/K.
     * This is a figure of merit for receive systems.
     */
    get gOverT(): number;
    /**
     * Checks if this receiver can receive from a transmitter.
     * Returns true if the calculated SNR exceeds the minimum required SNR.
     *
     * @param transmitter - The transmitter to check
     * @param date - Time for calculation (defaults to now)
     * @returns True if link closes successfully
     */
    canReceive(transmitter: Transmitter, date?: Date): boolean;
    /**
     * Gets the link margin for a given transmitter.
     * Link margin = Actual SNR - Minimum required SNR
     *
     * @param transmitter - The transmitter to check
     * @param date - Time for calculation (defaults to now)
     * @returns Link margin in dB (positive = link closes)
     */
    getLinkMargin(transmitter: Transmitter, date?: Date): Decibels;
    /**
     * Checks if the receiver's frequency is compatible with a transmitter.
     * Allows for small frequency differences (within bandwidth).
     *
     * @param transmitter - The transmitter to check
     * @returns True if frequencies are compatible
     */
    isFrequencyCompatible(transmitter: Transmitter): boolean;
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Creates a Receiver from serialized data.
     * @param data - Serialized receiver data
     * @returns A new Receiver instance
     */
    static deserialize(data: Record<string, unknown>): Receiver;
    toString(): string;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing a Transmitter.
 */
interface TransmitterParams extends CommunicationDeviceParams {
    /** Transmit frequency in Hz */
    frequency: Hertz;
    /** Transmit power in Watts */
    power: Watts;
    /** Signal bandwidth in Hz */
    bandwidth: Hertz;
    /** Antenna for transmission */
    antenna: Antenna;
    /** Modulation type (optional) */
    modulation?: ModulationType;
    /** Line losses in dB (cables, connectors, etc.) */
    lineLoss?: Decibels;
}
/**
 * Transmitter communication device.
 *
 * Represents a device that transmits RF signals, such as a ground station
 * uplink or satellite downlink transmitter.
 *
 * @example
 * ```typescript
 * // Ground station uplink transmitter
 * const uplink = new Transmitter({
 *   id: 'gs-uplink',
 *   name: 'Ground Station Uplink',
 *   frequency: 14e9 as Hertz,   // 14 GHz (Ku-band uplink)
 *   power: 1000 as Watts,       // 1 kW
 *   bandwidth: 36e6 as Hertz,   // 36 MHz
 *   antenna: new Antenna({ gain: 45 as Decibels }),
 *   modulation: ModulationType.QPSK,
 * });
 *
 * groundStation.addCommDevice(uplink);
 * uplink.setParent(groundStation);
 *
 * // Calculate link to satellite receiver
 * const linkBudget = uplink.calculateLinkBudget(satelliteReceiver, date);
 * console.log(`SNR: ${linkBudget.snr.toFixed(1)} dB`);
 * ```
 */
declare class Transmitter extends CommunicationDevice {
    /** Transmit frequency in Hz */
    frequency: Hertz;
    /** Transmit power in Watts */
    power: Watts;
    /** Signal bandwidth in Hz */
    bandwidth: Hertz;
    /** Antenna for transmission */
    antenna: Antenna;
    /** Modulation type */
    modulation?: ModulationType;
    /** Line losses in dB */
    lineLoss: Decibels;
    constructor(params: TransmitterParams);
    get deviceType(): CommDeviceType;
    /**
     * Creates a deep copy of this transmitter.
     * The cloned transmitter will not have a parent assigned.
     * @returns A new Transmitter instance with the same properties
     */
    clone(): Transmitter;
    /**
     * Gets the Effective Isotropic Radiated Power (EIRP) in dBW.
     * EIRP = Power(dBW) + Antenna Gain(dB) - Line Loss(dB)
     */
    get eirp(): Dbw;
    /**
     * Gets the wavelength in meters.
     */
    get wavelength(): number;
    /**
     * Calculates the link budget to a receiver.
     *
     * @param receiver - The target receiver
     * @param date - Time for calculation (defaults to now)
     * @returns Link budget with EIRP, FSPL, received power, and SNR
     */
    calculateLinkBudget(receiver: Receiver, date?: Date): LinkBudget;
    /**
     * Gets the propagation delay to a receiver.
     * @param receiver - The target receiver
     * @param date - Time for calculation (defaults to now)
     * @returns Propagation delay in seconds
     */
    getPropagationDelay(receiver: Receiver, date?: Date): number;
    /**
     * Checks if this transmitter has line of sight to a receiver.
     * Checks for Earth obstruction between ground-space and space-space links.
     *
     * @param receiver - The target receiver
     * @param date - Time for calculation (defaults to now)
     * @returns True if line of sight exists (Earth does not block the path)
     */
    isVisible(receiver: Receiver, date?: Date): boolean;
    /**
     * Checks if a line segment between two points intersects Earth.
     * Uses ray-sphere intersection test with Earth's mean radius.
     *
     * @param pos1 - First position in km (J2000/ECI)
     * @param pos2 - Second position in km (J2000/ECI)
     * @returns True if the line segment passes through Earth
     */
    private lineIntersectsEarth_;
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Creates a Transmitter from serialized data.
     * @param data - Serialized transmitter data
     * @returns A new Transmitter instance
     */
    static deserialize(data: Record<string, unknown>): Transmitter;
    toString(): string;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing a Transponder.
 */
interface TransponderParams extends CommunicationDeviceParams {
    /** Uplink (receive) frequency in Hz */
    uplinkFrequency: Hertz;
    /** Downlink (transmit) frequency in Hz */
    downlinkFrequency: Hertz;
    /** Transmit power in Watts */
    power: Watts;
    /** Transponder bandwidth in Hz */
    bandwidth: Hertz;
    /** Uplink antenna */
    uplinkAntenna: Antenna;
    /** Downlink antenna */
    downlinkAntenna: Antenna;
    /** Receiver noise figure in dB */
    noiseFigure?: Decibels;
    /** Processing delay in seconds (default 0) */
    delay?: number;
    /** Transponder gain (output power / input power) in dB */
    transponderGain?: Decibels;
}
/**
 * Satellite transponder for relay communications.
 *
 * A transponder receives signals on one frequency (uplink) and retransmits
 * them on another frequency (downlink). This is the core component for
 * satellite communication relay.
 *
 * @example
 * ```typescript
 * // Create a Ku-band transponder
 * const xponder = new Transponder({
 *   id: 'sat-xponder-1',
 *   name: 'Ku-band Transponder',
 *   uplinkFrequency: 14e9 as Hertz,     // 14 GHz uplink
 *   downlinkFrequency: 12e9 as Hertz,   // 12 GHz downlink
 *   power: 50 as Watts,
 *   bandwidth: 36e6 as Hertz,
 *   uplinkAntenna: new Antenna({ gain: 30 as Decibels }),
 *   downlinkAntenna: new Antenna({ gain: 30 as Decibels }),
 *   delay: 0.01,  // 10ms processing delay
 * });
 *
 * satellite.addCommDevice(xponder);
 * xponder.setParent(satellite);
 *
 * // Check if relay is possible
 * if (xponder.canRelay(groundUplink, groundDownlink, date)) {
 *   const budget = xponder.calculateRelayLink(groundUplink, groundDownlink, date);
 *   console.log(`End-to-end SNR: ${budget.endToEndSnr.toFixed(1)} dB`);
 * }
 * ```
 */
declare class Transponder extends CommunicationDevice {
    /** Internal receiver component */
    readonly receiver: Receiver;
    /** Internal transmitter component */
    readonly transmitter: Transmitter;
    /** Processing delay in seconds */
    delay: number;
    /** Transponder gain in dB */
    transponderGain: Decibels;
    constructor(params: TransponderParams);
    get deviceType(): CommDeviceType;
    /**
     * Creates a deep copy of this transponder.
     * The cloned transponder will not have a parent assigned.
     * @returns A new Transponder instance with the same properties
     */
    clone(): Transponder;
    /**
     * Gets the uplink frequency in Hz.
     */
    get uplinkFrequency(): Hertz;
    /**
     * Gets the downlink frequency in Hz.
     */
    get downlinkFrequency(): Hertz;
    /**
     * Gets the frequency offset (downlink - uplink) in Hz.
     */
    get frequencyOffset(): Hertz;
    /**
     * Gets the transponder bandwidth in Hz.
     */
    get bandwidth(): Hertz;
    /**
     * Gets the transmit power in Watts.
     */
    get power(): Watts;
    /**
     * Override setParent to also set parent on internal components.
     */
    setParent(platform: CommPlatform): void;
    /**
     * Checks if this transponder can relay between an uplink transmitter
     * and a downlink receiver.
     *
     * @param uplink - The ground station uplink transmitter
     * @param downlink - The ground station downlink receiver
     * @param date - Time for calculation (defaults to now)
     * @returns True if relay is possible
     */
    canRelay(uplink: Transmitter, downlink: Receiver, date?: Date): boolean;
    /**
     * Calculates the complete relay link budget.
     *
     * @param uplink - The ground station uplink transmitter
     * @param downlink - The ground station downlink receiver
     * @param date - Time for calculation (defaults to now)
     * @returns Complete relay link budget
     */
    calculateRelayLink(uplink: Transmitter, downlink: Receiver, date?: Date): RelayLinkBudget;
    /**
     * Gets the total propagation delay for a relay path.
     *
     * @param uplink - The ground station uplink transmitter
     * @param downlink - The ground station downlink receiver
     * @param date - Time for calculation (defaults to now)
     * @returns Total delay in seconds
     */
    getTotalDelay(uplink: Transmitter, downlink: Receiver, date?: Date): number;
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Creates a Transponder from serialized data.
     * @param data - Serialized transponder data
     * @returns A new Transponder instance
     */
    static deserialize(data: Record<string, unknown>): Transponder;
    toString(): string;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters for constructing a Beacon.
 */
interface BeaconParams extends TransmitterParams {
    /** Interval between transmissions in seconds */
    transmitInterval: number;
    /** Duration of each transmission in seconds */
    transmitDuration: number;
    /** Reference epoch for transmission timing */
    epoch: Date;
    /** Message format identifier (optional) */
    messageFormat?: string;
}
/**
 * Beacon transmitter for periodic satellite telemetry.
 *
 * A beacon is a transmitter that sends signals at regular intervals.
 * It extends Transmitter with timing behavior for periodic transmissions.
 *
 * @example
 * ```typescript
 * // Create a telemetry beacon
 * const beacon = new Beacon({
 *   id: 'sat-beacon',
 *   name: 'Telemetry Beacon',
 *   frequency: 437e6 as Hertz,      // 437 MHz (UHF amateur band)
 *   power: 1 as Watts,
 *   bandwidth: 10e3 as Hertz,       // 10 kHz
 *   antenna: Antenna.omnidirectional(),
 *   transmitInterval: 60,           // Every 60 seconds
 *   transmitDuration: 5,            // 5 second transmission
 *   epoch: new Date('2025-01-01T00:00:00Z'),
 *   modulation: ModulationType.BPSK,
 *   messageFormat: 'AX.25',
 * });
 *
 * satellite.addCommDevice(beacon);
 * beacon.setParent(satellite);
 *
 * // Check if beacon is currently transmitting
 * if (beacon.isTransmitting(new Date())) {
 *   console.log('Beacon is active');
 * }
 *
 * // Get next transmission window
 * const nextTx = beacon.getNextTransmission(new Date());
 * console.log(`Next beacon at ${nextTx.start}`);
 * ```
 */
declare class Beacon extends Transmitter {
    /** Interval between transmissions in seconds */
    transmitInterval: number;
    /** Duration of each transmission in seconds */
    transmitDuration: number;
    /** Reference epoch for transmission timing */
    epoch: Date;
    /** Message format identifier */
    messageFormat?: string;
    constructor(params: BeaconParams);
    get deviceType(): CommDeviceType;
    /**
     * Creates a deep copy of this beacon.
     * The cloned beacon will not have a parent assigned.
     * @returns A new Beacon instance with the same properties
     */
    clone(): Beacon;
    /**
     * Gets the duty cycle of the beacon (0-1).
     */
    get dutyCycle(): number;
    /**
     * Checks if the beacon is transmitting at a given time.
     *
     * @param date - Time to check (defaults to now)
     * @returns True if beacon is currently transmitting
     */
    isTransmitting(date?: Date): boolean;
    /**
     * Gets the time remaining in the current transmission.
     * Returns 0 if not currently transmitting.
     *
     * @param date - Time to check (defaults to now)
     * @returns Remaining transmission time in seconds
     */
    getRemainingTransmitTime(date?: Date): number;
    /**
     * Gets the next transmission window.
     *
     * @param afterDate - Find transmission after this time (defaults to now)
     * @returns Object with start and end times of next transmission
     */
    getNextTransmission(afterDate?: Date): {
        start: Date;
        end: Date;
    };
    /**
     * Gets all transmission windows within a time range.
     *
     * @param startDate - Start of time range
     * @param endDate - End of time range
     * @returns Array of transmission windows
     */
    getTransmissionsInRange(startDate: Date, endDate: Date): Array<{
        start: Date;
        end: Date;
    }>;
    /**
     * Gets the number of transmissions in a time range.
     *
     * @param startDate - Start of time range
     * @param endDate - End of time range
     * @returns Number of transmissions
     */
    getTransmissionCount(startDate: Date, endDate: Date): number;
    protected serializeSpecific(): Record<string, unknown>;
    /**
     * Creates a Beacon from serialized data.
     * @param data - Serialized beacon data
     * @returns A new Beacon instance
     */
    static deserialize(data: Record<string, unknown>): Beacon;
    toString(): string;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare abstract class FieldInterpolator extends Interpolator {
    Float64List?: Float64Array;
    /**
     * Interpolate field values at the provided [epoch].
     * @param final Final state vector.
     * @param EpochUTC Epoch of the final state vector.
     * @param epoch Epoch to interpolate field values at.
     * @throws [Error] if the interpolator is not initialized.
     */
    abstract interpolate(final: unknown, EpochUTC: unknown, epoch: unknown): unknown;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class ChebyshevCoefficients {
    a: Seconds;
    b: Seconds;
    private readonly cx_;
    private readonly cy_;
    private readonly cz_;
    cxd_: Float64Array;
    cyd_: Float64Array;
    czd_: Float64Array;
    constructor(a: Seconds, b: Seconds, cx_: Float64Array, cy_: Float64Array, cz_: Float64Array);
    /**
     * Calculates the derivative of a polynomial represented by Chebyshev coefficients.
     * @param a - The lower bound of the polynomial's domain.
     * @param b - The upper bound of the polynomial's domain.
     * @param c - The Chebyshev coefficients of the polynomial.
     * @returns The derivative of the polynomial as an array of coefficients.
     */
    private static _derivative;
    get sizeBytes(): number;
    /**
     * Evaluates the Chebyshev polynomial represented by the given coefficients at the specified value.
     * @param c - The coefficients of the Chebyshev polynomial.
     * @param t - The value at which to evaluate the polynomial _(POSIX seconds)_.
     * @returns The result of evaluating the polynomial at the specified value.
     */
    evaluate(c: Float64Array, t: number): number;
    /**
     * Interpolates the position and velocity at a given time (km, km/s).
     * @param t - The time value to interpolate at _(POSIX seconds)_.
     * @returns An object containing the interpolated position and velocity.
     */
    interpolate(t: number): PositionVelocity;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Compressed Chebyshev ephemeris interpolator.
 *
 * The ChebyshevInterpolator sacrifices state accuracy in order to gain
 * speed and memory requirements, so you can store many ephemerides in RAM
 * and interpolate through them quickly.
 *
 * Using more coefficients per revolution during lossy compression results
 * in increased accuracy and decreased performance.
 */
declare class ChebyshevInterpolator extends StateInterpolator {
    private readonly coefficients_;
    constructor(coefficients: ChebyshevCoefficients[]);
    private _calcSizeBytes;
    get sizeBytes(): number;
    interpolate(epoch: EpochUTC): J2000 | null;
    window(): EpochWindow;
    private _matchCoefficients;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * A segmented interpolator that uses separate LagrangeInterpolators per
 * physics phase. This prevents polynomial interpolation from spanning
 * a model boundary (e.g. parametric ascent → Keplerian orbit) where
 * the underlying data is not well-approximated by a single polynomial.
 *
 * Each segment uses data exclusively from its own physics model.
 * There may be a small gap between segments where interpolation
 * returns null — this is intentional to avoid cross-model artifacts.
 */
declare class SegmentedLagrangeInterpolator extends StateInterpolator {
    private readonly segments_;
    private constructor();
    /**
     * Create a segmented interpolator from phased ephemeris data.
     *
     * Each phase gets its own LagrangeInterpolator built from only its
     * own data — no cross-phase overlap. This ensures the polynomial
     * only fits data from a single physics model.
     *
     * @param states All J2000 state vectors in chronological order.
     * @param boundaryIndex Index of the last state in the first phase.
     *        The second phase starts at boundaryIndex + 1.
     * @param order Lagrange polynomial order (default 5).
     * @returns A SegmentedLagrangeInterpolator with two segments.
     */
    static fromPhasedEphemeris(states: J2000[], boundaryIndex: number, order?: number): SegmentedLagrangeInterpolator;
    /**
     * Create a segmented interpolator from ephemeris data with multiple phase boundaries.
     *
     * Splits the state vector array into N+1 segments at the given boundary indices.
     * Each segment gets its own LagrangeInterpolator to prevent cross-phase artifacts.
     *
     * @param states All J2000 state vectors in chronological order.
     * @param boundaryIndices Indices of the last state in each segment (except the final segment).
     *        E.g. [50, 120] creates 3 segments: [0..50], [51..120], [121..end].
     * @param order Lagrange polynomial order (default 5).
     * @returns A SegmentedLagrangeInterpolator with N+1 segments.
     */
    static fromMultipleBoundaries(states: J2000[], boundaryIndices: number[], order?: number): SegmentedLagrangeInterpolator;
    interpolate(epoch: EpochUTC): J2000 | null;
    window(): EpochWindow;
    get sizeBytes(): number;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/** Result of a plane change burn computation. */
interface PlaneChangeBurnResult {
    /** Delta-V magnitude in km/s for the plane change. */
    deltaV: number;
    /** Epoch at which the burn occurs. */
    burnEpoch: EpochUTC;
    /** Classical elements of the orbit after the burn. */
    postBurnElements: ClassicalElements;
    /** Which node the burn occurs at. */
    nodeType: 'ascending' | 'descending';
}
/**
 * Computes an impulsive inclination-change (plane change) maneuver.
 *
 * A pure plane change rotates the orbital plane around the line of nodes.
 * The most fuel-efficient location is at a node crossing, where the velocity
 * vector lies in the equatorial plane and the required rotation is minimized.
 *
 * Delta-v formula: Δv = 2 · v · sin(|Δi| / 2)
 */
declare class PlaneChangeBurn {
    /**
     * Compute the delta-v for a pure inclination plane change at a node.
     *
     * @param velocityAtNode Orbital velocity magnitude at the node (km/s).
     * @param deltaIncRad Inclination change in radians (can be negative).
     * @returns Delta-v in km/s.
     */
    static computeDeltaV(velocityAtNode: number, deltaIncRad: number): number;
    /**
     * Compute the time (seconds) from the current true anomaly to the next
     * ascending and descending node crossings.
     *
     * At an ascending node: argPerigee + trueAnomaly = 0 (mod 2π)
     * At a descending node: argPerigee + trueAnomaly = π (mod 2π)
     *
     * @param elements Classical orbital elements.
     * @returns Time in seconds to the next ascending and descending nodes.
     */
    static timeToNodes(elements: ClassicalElements): {
        ascending: number;
        descending: number;
    };
    /**
     * Compute the full plane change maneuver.
     *
     * @param elements Pre-burn classical elements.
     * @param targetInclinationRad Desired inclination after the burn (radians).
     * @param burnDelayOrbits Number of complete orbits to coast before the burn (default 0).
     * @param preferredNode Which node to burn at ('ascending', 'descending', or 'nearest').
     * @returns PlaneChangeBurnResult with burn epoch, delta-v, and post-burn elements.
     */
    static compute(elements: ClassicalElements, targetInclinationRad: number, burnDelayOrbits?: number, preferredNode?: 'ascending' | 'descending' | 'nearest'): PlaneChangeBurnResult;
    /**
     * Compute the time (seconds) to travel from true anomaly v1 to v2
     * in a Keplerian orbit with the given eccentricity and mean motion.
     * Always returns a positive value (forward in time).
     */
    private static timeFromTrueAnomaly_;
    /**
     * Convert true anomaly to mean anomaly.
     */
    private static trueToMeanAnomaly_;
    /**
     * Compute the velocity magnitude at a given true anomaly in a Keplerian orbit.
     *
     * @param semimajorAxis Semi-major axis in km.
     * @param eccentricity Orbital eccentricity.
     * @param trueAnomaly True anomaly in radians.
     * @param mu Gravitational parameter (km³/s²).
     * @returns Velocity magnitude in km/s.
     */
    static velocityAtTrueAnomaly(semimajorAxis: Kilometers, eccentricity: number, trueAnomaly: Radians, mu: number): number;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

declare class TwoBurnOrbitTransfer {
    vInit: number;
    vFinal: number;
    vTransA: number;
    vTransB: number;
    tTrans: Seconds;
    constructor(vInit: number, vFinal: number, vTransA: number, vTransB: number, tTrans: Seconds);
    /**
     * Calculates the parameters for a Hohmann transfer orbit between two circular orbits.
     * @param rInit The initial radius of the orbit. (km)
     * @param rFinal The final radius of the orbit. (km)
     * @returns An instance of TwoBurnOrbitTransfer containing the calculated parameters.
     */
    static hohmannTransfer(rInit: number, rFinal: number): TwoBurnOrbitTransfer;
    get deltaV(): number;
    /**
     * Calculates the two maneuver thrusts required for a two-burn orbit transfer.
     * @param epoch The epoch of the maneuver.
     * @param durationRate The duration rate of the maneuver (s/m/s).
     * @returns An array containing the two thrust objects representing the maneuvers.
     */
    toManeuvers(epoch: EpochUTC, durationRate?: SecondsPerMeterPerSecond): [Thrust, Thrust];
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Compresses satellite ephemeris data using Chebyshev polynomial approximation.
 *
 * This class takes a StateInterpolator (which provides satellite positions at
 * arbitrary times) and creates a compact ChebyshevInterpolator that can
 * reproduce those positions using far less data.
 *
 * The compression works by:
 * 1. Dividing the time span into windows (one orbital period each)
 * 2. Fitting Chebyshev polynomial coefficients for X, Y, Z position components
 * 3. Sampling at Chebyshev nodes (cosine-spaced points) to minimize interpolation error
 *
 * This is useful for storing and transmitting ephemeris data efficiently in
 * mission planning software.
 *
 * @example
 * ```typescript
 * const compressor = new ChebyshevCompressor(ephemerisInterpolator);
 * const compressed = compressor.compress(21);
 * // Now use compressed.interpolate(epoch) to get positions
 * ```
 */
declare class ChebyshevCompressor {
    private readonly interpolator_;
    /**
     * Creates a new ChebyshevCompressor from a StateInterpolator.
     * @param interpolator_ The source interpolator containing ephemeris data to compress.
     */
    constructor(interpolator_: StateInterpolator);
    /** Returns the cosine of π times x. */
    private static cosPi_;
    /**
     * Fits a single Chebyshev coefficient for the j-th term.
     * @param j The coefficient index.
     * @param n The total number of coefficients.
     * @param a The start time of the window (POSIX seconds).
     * @param b The end time of the window (POSIX seconds).
     * @returns A Vector3D containing the X, Y, Z coefficients for this term.
     */
    private fitCoefficient_;
    /**
     * Fits all Chebyshev coefficients for a single time window.
     * @param coeffs The number of coefficients to fit.
     * @param a The start time of the window (POSIX seconds).
     * @param b The end time of the window (POSIX seconds).
     * @returns ChebyshevCoefficients for the X, Y, Z position components.
     */
    private fitWindow_;
    /**
     * Compresses the ephemeris data into a ChebyshevInterpolator.
     *
     * The time span is divided into windows of one orbital period each, and
     * Chebyshev coefficients are fitted for each window. Higher cpr values
     * provide more accuracy but less compression.
     *
     * @param cpr Coefficients per revolution. Default is 21, which provides
     *            a good balance between accuracy and compression.
     * @returns A new ChebyshevInterpolator that can reconstruct positions
     *          from the polynomial coefficients.
     */
    compress(cpr?: number, segmentDuration?: Seconds): ChebyshevInterpolator;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * A cost function that evaluates a set of parameters and returns a score.
 *
 * Lower scores indicate better solutions. The function takes a Float64Array
 * of N parameters and returns a single numeric score representing how well
 * those parameters satisfy the optimization objective.
 *
 * @example
 * ```ts
 * // Cost function to find values closest to (3, 5)
 * const costFn: CostFunction = (params: Float64Array) => {
 *   const dx = params[0] - 3;
 *   const dy = params[1] - 5;
 *   return dx * dx + dy * dy; // squared distance from target
 * };
 * ```
 */
type CostFunction = (points: Float64Array) => number;

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Derivative-free Nelder-Mead simplex optimizer (also called "downhill simplex" or "amoeba method").
 *
 * The algorithm maintains a "simplex" - a geometric shape with N+1 vertices in N-dimensional
 * space (e.g., a triangle in 2D, tetrahedron in 3D). It iteratively transforms this simplex
 * to "crawl" toward the minimum by:
 *
 * 1. **Reflection** - Flipping the worst point through the centroid
 * 2. **Expansion** - If reflection found a good point, try going further
 * 3. **Contraction** - If reflection was poor, try a point closer to the centroid
 * 4. **Shrink** - If all else fails, shrink the entire simplex toward the best point
 *
 * This is useful for optimizing functions where you can't compute derivatives - common in
 * orbital mechanics for things like fitting orbits to observations, finding closest approach
 * times, or optimizing maneuvers.
 *
 * @example
 * ```ts
 * // Define a cost function to minimize
 * const costFn = (x: Float64Array) => (x[0] - 3) ** 2 + (x[1] - 5) ** 2;
 *
 * // Generate initial simplex from a starting guess
 * const initialGuess = new Float64Array([0, 0]);
 * const simplex = DownhillSimplex.generateSimplex(initialGuess, 0.1);
 *
 * // Run optimization
 * const result = DownhillSimplex.solveSimplex(costFn, simplex, {
 *   xTolerance: 1e-10,
 *   fTolerance: 1e-10,
 *   maxIter: 1000,
 * });
 * // result ≈ [3, 5]
 * ```
 */
declare class DownhillSimplex {
    private constructor();
    /**
     * Compute the centroid from a list of [SimplexEntry] objects, using cost
     * function [f].
     * @param f Cost function
     * @param xss Simplex entries
     * @returns The centroid.
     */
    private static centroid_;
    private static shrink_;
    /**
     * Generate a new simplex from initial guess [x0], and an optional
     * simplex [step] value.
     * @param x0 Initial guess
     * @param step Simplex step
     * @returns The simplex.
     */
    static generateSimplex(x0: Float64Array, step?: number): Float64Array[];
    /**
     * Perform derivative-free Nelder-Mead simplex optimization to minimize the
     * cost function [f] for the initial simplex [xs].
     *
     * Optional arguments:
     *  - `xTolerance`: centroid delta termination criteria
     * - `fTolerance`: cost function delta termination criteria
     * - `maxIter`: maximum number of optimization iterations
     * - `adaptive`: use adaptive coefficients if possible
     * - `printIter`: print a debug statement after each iteration
     * @param f Cost function
     * @param xs Initial simplex
     * @param root0 Root0
     * @param root0.xTolerance Root0.xTolerance
     * @param root0.fTolerance Root0.fTolerance
     * @param root0.maxIter Root0.maxIter
     * @param root0.adaptive Root0.adaptive
     * @param root0.printIter Root0.printIter
     * @returns The optimal input value.
     */
    static solveSimplex(f: CostFunction, xs: Float64Array[], { xTolerance, fTolerance, maxIter, adaptive, printIter, }: {
        xTolerance?: number;
        fTolerance?: number;
        maxIter?: number;
        adaptive?: boolean;
        printIter?: boolean;
    }): Float64Array;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Golden Section Search optimizer for finding the minimum or maximum of a
 * unimodal function within a bounded interval.
 *
 * ## Algorithm Overview
 *
 * The Golden Section Search is a derivative-free optimization technique that
 * efficiently narrows down the location of an extremum (minimum or maximum)
 * by exploiting the mathematical properties of the golden ratio
 * (φ ≈ 1.618033988749895).
 *
 * The algorithm works by:
 * 1. Maintaining a search interval [a, b] known to contain the optimum
 * 2. Selecting two interior probe points c and d using the golden ratio
 * 3. Evaluating the objective function at c and d
 * 4. Eliminating the subinterval that cannot contain the optimum
 * 5. Repeating until the interval width is below the specified tolerance
 *
 * The golden ratio ensures that one of the probe points from the previous
 * iteration can be reused, requiring only one new function evaluation per
 * iteration (though this implementation evaluates both for simplicity).
 *
 * ## Convergence
 *
 * The interval shrinks by a factor of φ⁻¹ ≈ 0.618 each iteration.
 * For an initial interval of width W and tolerance ε, the number of
 * iterations required is approximately: log(W/ε) / log(φ) ≈ 2.078 × log₁₀(W/ε)
 *
 * ## Requirements
 *
 * The objective function must be **unimodal** on the search interval, meaning:
 * - For minimization: exactly one local minimum exists in [lower, upper]
 * - For maximization: exactly one local maximum exists in [lower, upper]
 *
 * If the function has multiple local extrema, the algorithm may converge to
 * any one of them depending on the initial bounds.
 *
 * @example Finding minimum distance to a target position
 * ```typescript
 * import { GoldenSection } from 'ootk';
 *
 * // Find the time when a satellite is closest to a ground station
 * const distanceToStation = (minutesFromEpoch: number): number => {
 *   const satPosition = satellite.propagate(epoch.addMinutes(minutesFromEpoch));
 *   return satPosition.distanceTo(groundStation);
 * };
 *
 * // Search for minimum distance within a 90-minute orbital period
 * const optimalTime = GoldenSection.search(
 *   distanceToStation,
 *   0,      // start of search window (minutes)
 *   90,     // end of search window (minutes)
 *   { tolerance: 0.001 }  // precision of ~0.001 minutes (~60ms)
 * );
 *
 * console.log(`Closest approach at T+${optimalTime.toFixed(3)} minutes`);
 * ```
 *
 * @example Finding maximum elevation angle
 * ```typescript
 * import { GoldenSection } from 'ootk';
 *
 * // Find when satellite reaches maximum elevation above horizon
 * const elevationAngle = (minutesFromEpoch: number): number => {
 *   const look = groundStation.lookAngles(
 *     satellite.propagate(epoch.addMinutes(minutesFromEpoch))
 *   );
 *   return look.elevation;
 * };
 *
 * // Search for maximum elevation during a pass (solveMax = true)
 * const peakTime = GoldenSection.search(
 *   elevationAngle,
 *   riseTime,   // when satellite rises above horizon
 *   setTime,    // when satellite sets below horizon
 *   { tolerance: 1e-4, solveMax: true }
 * );
 *
 * console.log(`Maximum elevation at T+${peakTime.toFixed(4)} minutes`);
 * ```
 *
 * @see https://en.wikipedia.org/wiki/Golden-section_search
 */
declare class GoldenSection {
    /**
     * Inverse of the golden ratio (φ⁻¹ ≈ 0.6180339887).
     *
     * Used to position probe points within the search interval. The golden
     * ratio has the unique property that removing a golden-ratio-sized piece
     * from a segment leaves a segment with the same proportions, enabling
     * efficient reuse of function evaluations.
     */
    private static readonly grInv_;
    /**
     * Determines which subinterval to keep based on function values at probe
     * points and the optimization direction.
     * @param fc - Function value at probe point c (closer to lower bound)
     * @param fd - Function value at probe point d (closer to upper bound)
     * @param solveMax - If true, search for maximum; if false, search for minimum
     * @returns True if the interval [a, d] should be kept (discard [c, b]),
     *          false if [c, b] should be kept (discard [a, d])
     */
    private static check_;
    /**
     * Searches for the input value that optimizes (minimizes or maximizes) the
     * given objective function within the specified bounds.
     *
     * The search terminates when the remaining interval width falls below the
     * specified tolerance. The returned value is the midpoint of the final
     * interval, guaranteeing the true optimum is within ±(tolerance/2) of the
     * result.
     *
     * @param f - The objective function to optimize. Must be unimodal (have
     *            exactly one local extremum) on the interval [lower, upper].
     * @param lower - Lower bound of the search interval
     * @param upper - Upper bound of the search interval (must be > lower)
     * @param options - Configuration options for the search
     * @param options.tolerance - Convergence threshold for interval width.
     *                            Smaller values yield more precise results but
     *                            require more iterations. Default: 1e-5
     * @param options.solveMax - If true, search for a maximum; if false (default),
     *                           search for a minimum
     * @returns The input value that produces the optimal (minimum or maximum)
     *          output from the objective function
     *
     * @example Basic minimization of a quadratic function
     * ```typescript
     * // Find minimum of f(x) = (x - 3)² on interval [0, 10]
     * const minimum = GoldenSection.search(
     *   (x) => (x - 3) ** 2,
     *   0,
     *   10,
     *   { tolerance: 1e-8 }
     * );
     * console.log(minimum); // ≈ 3.0
     * ```
     */
    static search(f: DifferentiableFunction, lower: number, upper: number, { tolerance, solveMax, }: {
        tolerance?: number;
        solveMax?: boolean;
    }): number;
    /**
     * Searches for the input value that minimizes the given objective function
     * @param f - The objective function to minimize. Must be unimodal on [lower, upper].
     * @param lower - Lower bound of the search interval
     * @param upper - Upper bound of the search interval (must be > lower)
     * @param tolerance - Convergence threshold for interval width. Smaller values yield more precise results but require more iterations. Default: 1e-5
     * @returns The input value that produces the minimum output from the objective function
     */
    static searchMin(f: DifferentiableFunction, lower: number, upper: number, tolerance?: number): number;
    /**
     * Searches for the input value that maximizes the given objective function
     * @param f - The objective function to maximize. Must be unimodal on [lower, upper].
     * @param lower - Lower bound of the search interval
     * @param upper - Upper bound of the search interval (must be > lower)
     * @param tolerance - Convergence threshold for interval width. Smaller values yield more precise results but require more iterations. Default: 1e-5
     * @returns The input value that produces the maximum output from the objective function
     */
    static searchMax(f: DifferentiableFunction, lower: number, upper: number, tolerance?: number): number;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * Result container for polynomial regression optimization.
 *
 * This class encapsulates the output of fitting a polynomial curve to data points
 * using the {@link PolynomialRegression} optimizer. It provides three key pieces
 * of information needed to evaluate and use the fitted polynomial.
 *
 * ## Properties Explained
 *
 * - **coefficients**: The polynomial coefficients in descending power order.
 *   For a polynomial `y = ax² + bx + c`, coefficients would be `[a, b, c]`.
 *   Use with `evalPoly(x, coefficients)` to evaluate the polynomial at any point.
 *
 * - **rss** (Root Sum of Squares): A measure of how well the polynomial fits the data.
 *   Calculated as `√(Σ(yᵢ - ŷᵢ)²)` where yᵢ are observed values and ŷᵢ are predicted.
 *   Lower values indicate a better fit. Units match the y-data units.
 *
 * - **bic** (Bayesian Information Criterion): A model selection metric that balances
 *   fit quality against complexity. Lower BIC indicates a better model. Use this
 *   when comparing polynomials of different orders to avoid overfitting.
 *
 * ## Use Cases
 *
 * - Evaluating fitted polynomials at new x-values for interpolation/extrapolation
 * - Comparing multiple polynomial fits to select the best model
 * - Assessing fit quality before using coefficients for trajectory prediction
 * - Storing/transmitting compact polynomial representations of orbital data
 *
 * @example
 * ```typescript
 * import { PolynomialRegression, evalPoly } from 'ootk';
 *
 * // Fit a quadratic to satellite altitude data over time
 * const times = new Float64Array([0, 60, 120, 180, 240, 300]); // seconds
 * const altitudes = new Float64Array([400.1, 400.8, 402.3, 404.6, 407.7, 411.6]); // km
 *
 * const result = PolynomialRegression.solve(times, altitudes, 2);
 *
 * // Access the result properties
 * console.log('Coefficients:', result.coefficients);
 * // e.g., [0.00001, 0.002, 400] for y = 0.00001t² + 0.002t + 400
 *
 * console.log('RSS Error:', result.rss.toFixed(4), 'km');
 * // e.g., 0.0523 km - the polynomial fits within ~52 meters
 *
 * console.log('BIC Score:', result.bic.toFixed(2));
 * // e.g., -45.32 - use to compare with other polynomial orders
 *
 * // Predict altitude at t=360 seconds using the fitted polynomial
 * const predictedAlt = evalPoly(360, result.coefficients);
 * console.log('Predicted altitude at t=360s:', predictedAlt.toFixed(2), 'km');
 *
 * // Compare with a cubic fit to see if higher order is justified
 * const cubicResult = PolynomialRegression.solve(times, altitudes, 3);
 * if (cubicResult.bic < result.bic) {
 *   console.log('Cubic model is better (lower BIC)');
 * } else {
 *   console.log('Quadratic model is sufficient');
 * }
 * ```
 * @internal
 * @see PolynomialRegression - The optimizer that produces this result
 */
declare class PolynomicalRegressionResult {
    /**
     * Polynomial coefficients in descending power order.
     *
     * For a polynomial of order n: `y = c[0]xⁿ + c[1]xⁿ⁻¹ + ... + c[n-1]x + c[n]`
     *
     * The length of this array is `order + 1` (e.g., quadratic has 3 coefficients).
     */
    coefficients: Float64Array;
    /**
     * Root sum of squared errors (RSS) between the polynomial and observed data.
     *
     * Computed as `√(Σ(observed - predicted)²)`. Lower values indicate a better fit.
     * This value is in the same units as the y-data used for fitting.
     */
    rss: number;
    /**
     * Bayesian Information Criterion (BIC) score for model selection.
     *
     * Computed as `n * ln(SSE) + k * ln(n)` where n is the number of data points,
     * k is the polynomial order, and SSE is the sum of squared errors.
     *
     * Lower BIC values indicate a better balance between fit quality and model
     * simplicity. Use this to compare polynomials of different orders - the model
     * with the lowest BIC is preferred as it avoids overfitting.
     */
    bic: number;
    /**
     * Creates a new polynomial regression result.
     *
     * This constructor is typically called internally by {@link PolynomialRegression.solve}
     * or {@link PolynomialRegression.solveOrder} rather than directly by user code.
     *
     * @param coefficients - Polynomial coefficients in descending power order.
     * @param rss - Root sum of squared errors measuring fit quality.
     * @param bic - Bayesian Information Criterion for model comparison.
     */
    constructor(coefficients: Float64Array, rss: number, bic: number);
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Polynomial regression optimizer using the Downhill Simplex (Nelder-Mead) method.
 *
 * This class fits polynomial curves to data by finding coefficients that minimize
 * the sum of squared errors (SSE) between the polynomial and the observed data points.
 * It uses derivative-free optimization, making it robust for noisy data.
 *
 * ## How It Works
 *
 * 1. **Polynomial Model**: Fits a polynomial of the form:
 *    `y = c[0]*x^n + c[1]*x^(n-1) + ... + c[n-1]*x + c[n]`
 *    where n is the polynomial order.
 *
 * 2. **Optimization**: Uses the Downhill Simplex algorithm to iteratively adjust
 *    coefficients until the sum of squared errors is minimized.
 *
 * 3. **Model Selection**: The `solveOrder` method uses Bayesian Information Criterion (BIC)
 *    to balance fit quality against model complexity, preventing overfitting.
 *
 * ## Use Cases
 *
 * - Smoothing noisy orbital ephemeris data
 * - Fitting satellite position/velocity trends over time
 * - Interpolating between sparse observation points
 * - Compressing trajectory data into polynomial representations
 *
 * @example
 * ```typescript
 * // Fit a quadratic (order 2) polynomial to noisy position data
 * const times = new Float64Array([0, 1, 2, 3, 4, 5]);
 * const positions = new Float64Array([0.1, 1.9, 4.2, 8.8, 16.1, 25.3]);
 *
 * // Solve for quadratic coefficients: y = ax² + bx + c
 * const result = PolynomialRegression.solve(times, positions, 2);
 *
 * console.log(result.coefficients); // ~[1, 0, 0] for y ≈ x²
 * console.log(result.rss);          // Root sum of squared errors
 * console.log(result.bic);          // Bayesian Information Criterion
 *
 * // Use coefficients to predict new values
 * import { evalPoly } from 'ootk';
 * const predicted = evalPoly(6, result.coefficients); // Predict at t=6
 * ```
 *
 * @example
 * ```typescript
 * // Automatically find optimal polynomial order
 * const xs = new Float64Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
 * const ys = new Float64Array([1.2, 2.8, 5.1, 8.9, 14.2, 21.0, 29.8, 40.1, 52.0, 65.8]);
 *
 * // Find best order between 1 (linear) and 4 (quartic)
 * const result = PolynomialRegression.solveOrder(xs, ys, 1, 4);
 *
 * console.log(result.coefficients.length - 1); // Optimal order found
 * console.log(result.bic); // Lower BIC = better model
 * ```
 */
declare class PolynomialRegression {
    private constructor();
    /**
     * Computes the Bayesian Information Criterion (BIC) for model selection.
     *
     * BIC penalizes model complexity to prevent overfitting. Lower BIC values indicate
     * a better balance between goodness-of-fit and model simplicity.
     *
     * Formula: BIC = n * ln(SSE) + k * ln(n)
     *
     * @param n - Number of data points in the sample.
     * @param k - Number of parameters (polynomial order).
     * @param sse - Sum of squared errors from the fit.
     * @returns The BIC score (lower is better).
     */
    private static bayesInformationCriterea_;
    /**
     * Fits a polynomial of the specified order to the given data points.
     *
     * Uses the Downhill Simplex (Nelder-Mead) optimization algorithm to find
     * polynomial coefficients that minimize the sum of squared errors between
     * the polynomial curve and the observed y-values.
     *
     * The resulting polynomial has the form:
     * `y = coeffs[0]*x^order + coeffs[1]*x^(order-1) + ... + coeffs[order]`
     *
     * @param xs - Independent variable values (e.g., time points).
     * @param ys - Dependent variable values (e.g., positions or measurements).
     * @param order - Degree of the polynomial to fit (1=linear, 2=quadratic, 3=cubic, etc.).
     * @param options - Optional configuration.
     * @param options.printIter - If true, prints optimization progress to console.
     * @returns Result containing fitted coefficients, RSS error, and BIC score.
     *
     * @example
     * ```typescript
     * // Fit a cubic polynomial (order 3) to data
     * const result = PolynomialRegression.solve(xData, yData, 3);
     * // coefficients: [a, b, c, d] for y = ax³ + bx² + cx + d
     * ```
     */
    static solve(xs: Float64Array, ys: Float64Array, order: number, { printIter }?: {
        printIter?: boolean;
    }): PolynomicalRegressionResult;
    /**
     * Automatically finds the optimal polynomial order and fits coefficients.
     *
     * This method performs polynomial regression for each order in the specified range,
     * then selects the best model using Bayesian Information Criterion (BIC). BIC
     * penalizes model complexity, helping to find the simplest polynomial that
     * adequately describes the data without overfitting.
     *
     * Use this when you don't know the appropriate polynomial degree for your data.
     * The method will test all orders from minOrder to maxOrder and return the
     * result with the lowest BIC score.
     *
     * @param xs - Independent variable values (e.g., time points).
     * @param ys - Dependent variable values (e.g., positions or measurements).
     * @param minOrder - Minimum polynomial degree to try (e.g., 1 for linear).
     * @param maxOrder - Maximum polynomial degree to try (e.g., 5 for quintic).
     * @param options - Optional configuration.
     * @param options.printIter - If true, prints optimization progress to console.
     * @returns Result for the optimal order with fitted coefficients, RSS, and BIC.
     *
     * @example
     * ```typescript
     * // Let the algorithm find the best polynomial order (1 to 5)
     * const result = PolynomialRegression.solveOrder(xData, yData, 1, 5);
     *
     * // Check what order was selected
     * const selectedOrder = result.coefficients.length - 1;
     * console.log(`Optimal order: ${selectedOrder}`);
     * ```
     */
    static solveOrder(xs: Float64Array, ys: Float64Array, minOrder: number, maxOrder: number, { printIter }?: {
        printIter?: boolean;
    }): PolynomicalRegressionResult;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * Simple linear regression model that fits a line _(y = mx + b)_ to a set of data points.
 *
 * This class uses the ordinary least squares (OLS) method to find the best-fit line
 * that minimizes the sum of squared residuals between observed and predicted values.
 * It calculates the Pearson correlation coefficient internally to derive the slope,
 * which provides a statistically robust fit.
 *
 * The regression computes:
 * - **Slope (m)**: The rate of change of y with respect to x
 * - **Intercept (b)**: The y-value where the line crosses the y-axis (when x = 0)
 * - **Standard Error**: A measure of the average deviation of data points from the fitted line
 *
 * @example
 * ```ts
 * // Fit a line to satellite altitude decay data over time
 * const daysSinceEpoch = [0, 1, 2, 3, 4, 5, 6, 7];
 * const altitudeKm = [408.2, 407.9, 407.5, 407.2, 406.8, 406.5, 406.1, 405.8];
 *
 * const regression = new SimpleLinearRegression(daysSinceEpoch, altitudeKm);
 *
 * console.log(`Decay rate: ${regression.slope.toFixed(3)} km/day`);
 * // => Decay rate: -0.343 km/day
 *
 * console.log(`Initial altitude: ${regression.intercept.toFixed(2)} km`);
 * // => Initial altitude: 408.18 km
 *
 * // Predict altitude on day 10
 * const predictedAltitude = regression.evaluate(10);
 * console.log(`Predicted altitude on day 10: ${predictedAltitude.toFixed(2)} km`);
 * // => Predicted altitude on day 10: 404.75 km
 *
 * // Remove outliers beyond 2 standard deviations for cleaner fit
 * const cleanedRegression = regression.filterOutliers(2.0);
 * ```
 */
declare class SimpleLinearRegression {
    xs: number[];
    ys: number[];
    /**
     * Create a new [SimpleLinearRegression] object from lists of x and y
     * values.
     * @param xs x values
     * @param ys y values
     */
    constructor(xs: number[], ys: number[]);
    /** Line slope (m in y = mx + b). */
    private slope_;
    /** Y-axis intercept (b in y = mx + b). */
    private intercept_;
    /** Standard error of the regression (root mean square of residuals). */
    private error_;
    /**
     * The slope of the fitted line (m in y = mx + b).
     *
     * Represents the change in y for each unit increase in x.
     * A positive slope indicates y increases as x increases;
     * a negative slope indicates y decreases as x increases.
     */
    get slope(): number;
    /**
     * The y-intercept of the fitted line (b in y = mx + b).
     *
     * This is the predicted y value when x equals zero.
     */
    get intercept(): number;
    /**
     * The standard error of the regression.
     *
     * This measures the typical distance between observed y values and
     * the predicted y values on the regression line. Lower values indicate
     * a better fit. Calculated as the sample standard deviation of the residuals.
     */
    get error(): number;
    /**
     * The number of data points used in the regression.
     *
     * Returns the minimum of xs and ys lengths to handle mismatched arrays.
     */
    get length(): number;
    /**
     * Calculate the standard error of the regression.
     *
     * Computes the sample standard deviation of the residuals (differences
     * between observed and predicted y values). Uses (n-1) as the denominator
     * for Bessel's correction to provide an unbiased estimate.
     */
    private calcError_;
    /**
     * Recalculate the regression coefficients using the current xs and ys data.
     *
     * This method is called automatically by the constructor, but can be called
     * manually if you modify the xs or ys arrays directly after construction.
     *
     * The algorithm:
     * 1. Computes means of x and y values (xMu, yMu)
     * 2. Calculates the Pearson correlation coefficient (p)
     * 3. Computes sample standard deviations (xSig, ySig)
     * 4. Derives slope as: m = p * (ySig / xSig)
     * 5. Derives intercept as: b = yMu - m * xMu
     */
    update(): void;
    /**
     * Predict the y value for a given x using the fitted regression line.
     *
     * Evaluates y = mx + b where m is the slope and b is the intercept.
     * Can be used for interpolation (x within the data range) or
     * extrapolation (x outside the data range).
     * @param x - The x value to evaluate
     * @returns The predicted y value
     */
    evaluate(x: number): number;
    /**
     * Create a new SimpleLinearRegression with outlier data points removed.
     *
     * Points are considered outliers if their residual (distance from the
     * regression line) exceeds `sigma` times the standard error. This is
     * useful for cleaning noisy data to get a more robust fit.
     *
     * @param sigma - The number of standard deviations to use as the threshold.
     *                Points with residuals > sigma * error are removed. Default is 1.0.
     * @returns A new SimpleLinearRegression fitted to the filtered data.
     *
     * @example
     * ```ts
     * const regression = new SimpleLinearRegression(xs, ys);
     *
     * // Remove points more than 2 standard deviations from the line
     * const cleaned = regression.filterOutliers(2.0);
     *
     * // The cleaned regression will typically have a lower error
     * console.log(`Original error: ${regression.error}`);
     * console.log(`Cleaned error: ${cleaned.error}`);
     * ```
     */
    filterOutliers(sigma?: number): SimpleLinearRegression;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Represents a time window with start and end dates.
 * Used for coverage gap analysis.
 */
interface TimeWindow {
    /** Start of the time window */
    start: Date;
    /** End of the time window */
    end: Date;
    /** Duration in milliseconds */
    duration: number;
}
/**
 * Parameters for constructing a ScheduledContact.
 */
interface ScheduledContactParams {
    /** The underlying access window from AccessCalculator */
    accessWindow: AccessWindow;
    /** Priority assigned to this contact (higher = more important) */
    priority: number;
    /** Scheduled start time (may differ from access window start for partial contacts) */
    scheduledStart?: Date;
    /** Scheduled end time (may differ from access window end for partial contacts) */
    scheduledEnd?: Date;
    /** Optional metadata for user-defined properties */
    metadata?: Record<string, unknown>;
}
/**
 * Represents a scheduled contact between a ground station and satellite.
 *
 * ScheduledContact wraps an AccessWindow with scheduling-specific information
 * such as priority and potentially trimmed start/end times for partial contacts
 * or handovers.
 *
 * @example
 * ```typescript
 * const contact = new ScheduledContact({
 *   accessWindow: window,
 *   priority: 10,
 *   scheduledStart: window.start,
 *   scheduledEnd: window.end,
 * });
 *
 * console.log(contact.toString());
 * // [ScheduledContact]
 * //   Station: Goldstone
 * //   Satellite: ISS
 * //   Time: 10:00:00 - 10:15:00
 * //   Max Elevation: 45.2°
 * //   Priority: 10
 * ```
 */
declare class ScheduledContact {
    /** The underlying access window */
    readonly accessWindow: AccessWindow;
    /** Priority assigned to this contact (higher = more important) */
    readonly priority: number;
    /** Scheduled start time (may be trimmed from access window) */
    readonly scheduledStart: Date;
    /** Scheduled end time (may be trimmed from access window) */
    readonly scheduledEnd: Date;
    /** Duration of the scheduled contact in milliseconds */
    readonly scheduledDuration: number;
    /** Optional metadata for user-defined properties */
    readonly metadata?: Record<string, unknown>;
    constructor(params: ScheduledContactParams);
    /**
     * Access window start time.
     */
    get start(): Date;
    /**
     * Access window end time.
     */
    get end(): Date;
    /**
     * Access window duration in milliseconds.
     */
    get duration(): number;
    /**
     * Maximum elevation achieved during the pass.
     */
    get maxElevation(): Degrees;
    /**
     * Time of maximum elevation.
     */
    get maxElevationTime(): Date;
    /**
     * Range at maximum elevation.
     */
    get rangeAtMaxEl(): Kilometers;
    /**
     * The observing ground object.
     */
    get observer(): GroundObject;
    /**
     * The observed space object.
     */
    get target(): SpaceObject;
    /**
     * The ground station (convenience getter assuming observer is GroundStation).
     */
    get station(): GroundStation;
    /**
     * The satellite (convenience getter assuming target is Satellite).
     */
    get satellite(): Satellite;
    /**
     * Checks if this contact's scheduled time overlaps with another contact.
     * @param other - The other contact to check
     * @returns True if the scheduled times overlap
     */
    overlaps(other: ScheduledContact): boolean;
    /**
     * Checks if this contact conflicts with another contact at the same station.
     * Two contacts conflict if they use the same station and overlap in time.
     * @param other - The other contact to check
     * @param handoverMs - Optional handover time buffer in milliseconds
     * @returns True if both contacts use the same station and overlap in time
     */
    conflictsWith(other: ScheduledContact, handoverMs?: number): boolean;
    /**
     * Creates a copy of this contact with adjusted scheduled times.
     * @param newStart - New scheduled start time
     * @param newEnd - New scheduled end time
     * @returns A new ScheduledContact with the updated times
     */
    withTimes(newStart: Date, newEnd: Date): ScheduledContact;
    /**
     * Formats a Date as HH:MM:SS.
     */
    private static formatTime_;
    toString(): string;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Strategy for selecting contacts when conflicts occur.
 */
declare enum ContactSelectionStrategy {
    /** Prefer contacts with higher max elevation (better link quality) */
    MAX_ELEVATION = "maxElevation",
    /** Prefer longer duration contacts */
    LONGEST_DURATION = "longestDuration",
    /** Prefer higher priority contacts (user-defined priority) */
    PRIORITY = "priority",
    /** Prefer earlier contacts (first come, first served) */
    EARLIEST = "earliest",
    /** Optimize for maximum total contact time */
    MAX_TOTAL_TIME = "maxTotalTime"
}
/**
 * Configuration options for contact scheduling.
 */
interface ScheduleOptions {
    /** Access constraints to apply (from AccessCalculator) */
    accessConstraints?: AccessConstraints;
    /** Strategy for resolving conflicts (default: MAX_ELEVATION) */
    selectionStrategy?: ContactSelectionStrategy;
    /** Minimum contact duration in milliseconds (default: 60000 = 1 minute) */
    minContactDuration?: Milliseconds;
    /** Maximum contacts per satellite (default: unlimited) */
    maxContactsPerSatellite?: number;
    /** Maximum contacts per station (default: unlimited) */
    maxContactsPerStation?: number;
    /** Required gap between contacts at same station in ms (default: 0) */
    stationHandoverTime?: Milliseconds;
    /** User-defined priority function for satellites (higher = more important) */
    satellitePriority?: (satellite: Satellite) => number;
    /** User-defined priority function for stations (tie-breaker only) */
    stationPriority?: (station: GroundStation) => number;
    /** Maximum concurrent contacts per station - global default (default: 1) */
    maxConcurrentPerStation?: number;
    /** Per-station override for concurrency limit based on sensor capabilities */
    stationConcurrencyLimit?: (station: GroundStation) => number;
    /** Allow satellite handover between stations (default: false) */
    allowHandover?: boolean;
    /** Minimum duration at each station during handover in ms (default: 60000) */
    minHandoverDuration?: Milliseconds;
    /** Time step for access calculation in milliseconds (default: 10000) */
    accessStepMs?: number;
}
/**
 * Per-satellite coverage statistics.
 */
interface SatelliteCoverageStats {
    /** The satellite */
    satellite: Satellite;
    /** Number of contacts scheduled */
    contactCount: number;
    /** Total contact time in milliseconds */
    totalContactTime: number;
    /** Coverage percentage (contact time / total window) */
    coveragePercent: number;
    /** Coverage gaps for this satellite */
    gaps: TimeWindow[];
}
/**
 * Per-station utilization statistics.
 */
interface StationCoverageStats {
    /** The ground station */
    station: GroundStation;
    /** Number of contacts scheduled */
    contactCount: number;
    /** Total contact time in milliseconds */
    totalContactTime: number;
    /** Utilization percentage (contact time / total window) */
    utilizationPercent: number;
}
/**
 * Coverage statistics for a schedule.
 */
interface CoverageStatistics {
    /** Total scheduled contact time in milliseconds */
    totalContactTime: number;
    /** Number of contacts scheduled */
    contactCount: number;
    /** Per-satellite statistics */
    bySatellite: Map<number, SatelliteCoverageStats>;
    /** Per-station statistics */
    byStation: Map<number, StationCoverageStats>;
    /** Overall coverage percentage (time with contact / total time) */
    overallCoveragePercent: number;
    /** Average gap duration in milliseconds */
    averageGapDuration: number;
    /** Maximum gap duration in milliseconds */
    maxGapDuration: number;
}
/**
 * Static utility class for scheduling satellite contacts with ground stations.
 *
 * ContactScheduler builds on AccessCalculator to create optimal, non-overlapping
 * contact schedules that maximize coverage while respecting station constraints.
 *
 * @example
 * ```typescript
 * const schedule = ContactScheduler.schedule(
 *   [station1, station2],
 *   [sat1, sat2, sat3],
 *   new Date(),
 *   new Date(Date.now() + 86400000),
 *   {
 *     selectionStrategy: ContactSelectionStrategy.MAX_ELEVATION,
 *     accessConstraints: { minElevation: 10 as Degrees },
 *     stationHandoverTime: 60000 as Milliseconds,
 *     satellitePriority: (sat) => sat.id === 'critical-sat' ? 10 : 1,
 *     stationConcurrencyLimit: (sta) =>
 *       sta.sensors.some(s => s.sensorType === SensorType.PHASED_ARRAY_RADAR) ? 4 : 1,
 *   }
 * );
 *
 * for (const contact of schedule) {
 *   console.log(contact.toString());
 * }
 *
 * // Find gaps for a specific satellite
 * const gaps = ContactScheduler.findCoverageGaps(schedule, sat1);
 *
 * // Get overall statistics
 * const stats = ContactScheduler.getCoverageStatistics(
 *   schedule, [sat1, sat2, sat3], start, end
 * );
 * console.log(`Overall coverage: ${stats.overallCoveragePercent.toFixed(1)}%`);
 * ```
 */
declare class ContactScheduler {
    /** Default minimum contact duration (1 minute) */
    private static readonly DEFAULT_MIN_DURATION_MS_;
    /** Default access calculation step (10 seconds) */
    private static readonly DEFAULT_STEP_MS_;
    /** Default priority for satellites without user-defined priority */
    private static readonly DEFAULT_PRIORITY_;
    /** Multiplier for priority in composite score calculation */
    private static readonly PRIORITY_MULTIPLIER_;
    /** Prevent instantiation */
    private constructor();
    /**
     * Creates an optimized contact schedule for multiple stations and satellites.
     *
     * The scheduling algorithm uses a greedy approach with priority-based scoring:
     * 1. Generate all access windows
     * 2. Apply handover splitting if enabled
     * 3. Score each candidate (priority * 1000 + quality)
     * 4. Sort by score descending
     * 5. Greedily select non-conflicting contacts
     *
     * @param stations - Ground stations available for contacts
     * @param satellites - Satellites to schedule contacts with
     * @param start - Start of the scheduling window
     * @param end - End of the scheduling window
     * @param options - Scheduling configuration options
     * @returns Array of scheduled contacts, sorted by start time
     */
    static schedule(stations: GroundStation[], satellites: Satellite[], start: Date, end: Date, options?: ScheduleOptions): ScheduledContact[];
    /**
     * Finds gaps in coverage for a specific satellite within a schedule.
     *
     * @param schedule - The current contact schedule
     * @param satellite - The satellite to analyze
     * @param start - Optional start of analysis window (defaults to first contact or now)
     * @param end - Optional end of analysis window (defaults to last contact)
     * @returns Array of time windows where the satellite has no scheduled contact
     */
    static findCoverageGaps(schedule: ScheduledContact[], satellite: Satellite, start?: Date, end?: Date): TimeWindow[];
    /**
     * Calculates coverage statistics for a schedule.
     *
     * @param schedule - The contact schedule to analyze
     * @param satellites - Satellites to include in analysis
     * @param start - Start of analysis window
     * @param end - End of analysis window
     * @returns Coverage statistics
     */
    static getCoverageStatistics(schedule: ScheduledContact[], satellites: Satellite[], start: Date, end: Date): CoverageStatistics;
    /**
     * Generates all access windows for all station-satellite pairs.
     * @internal
     */
    private static generateAllAccessWindows_;
    /**
     * Applies handover splitting to overlapping access windows.
     * When the same satellite is visible from multiple stations,
     * splits the windows at the handover point.
     * @internal
     */
    private static applyHandoverSplitting_;
    /**
     * Checks if two access windows overlap in time.
     * @internal
     */
    private static windowsOverlap_;
    /**
     * Creates a trimmed copy of an access window with new start/end times.
     * @internal
     */
    private static createTrimmedWindow_;
    /**
     * Converts access windows to candidate ScheduledContacts with priorities.
     * @internal
     */
    private static createCandidateContacts_;
    /**
     * Greedy scheduling algorithm: sorts by composite score and selects non-conflicting contacts.
     * @internal
     */
    private static greedySchedule_;
    /**
     * Calculates composite score for a contact based on priority and quality.
     * @internal
     */
    private static calculateScore_;
    /**
     * Checks if a contact can be added to a station without exceeding concurrency limits.
     * @internal
     */
    private static canAddToStation_;
    /**
     * Checks if two contacts overlap in time (considering handover buffer).
     * @internal
     */
    private static timeOverlaps_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Static utility class for generating satellite constellations.
 *
 * Supports Walker Delta constellation patterns, which are characterized by:
 * - T total satellites distributed across P orbital planes
 * - All planes at the same inclination
 * - Equal spacing between adjacent orbital planes in RAAN (360°/P)
 * - Equal spacing between satellites within each plane (360°/(T/P))
 * - A phasing parameter F that defines relative phase offset between adjacent planes
 *
 * The notation is typically "T/P/F" (e.g., "24/3/1" means 24 satellites, 3 planes, phasing factor 1).
 *
 * @example
 * ```typescript
 * // Generate a 24/3/1 Walker constellation at 550 km, 53 degrees inclination
 * const satellites = ConstellationGenerator.walker(
 *   550 as Kilometers,
 *   53 as Degrees,
 *   24,
 *   3,
 *   1,
 *   new Date()
 * );
 *
 * // Or using the pattern string format with altitude and inclination
 * const satellites = ConstellationGenerator.fromPattern(
 *   "550:53:24/3/1",
 *   new Date()
 * );
 * ```
 */
declare class ConstellationGenerator {
    private constructor();
    /**
     * Generates a Walker Delta constellation.
     *
     * A Walker Delta constellation distributes satellites evenly across multiple
     * orbital planes at the same inclination. The phasing factor determines the
     * relative angular offset between satellites in adjacent planes.
     *
     * @param altitude - Orbital altitude above Earth's surface in kilometers
     * @param inclination - Orbital inclination in degrees (0-180)
     * @param totalSats - Total number of satellites (T)
     * @param planes - Number of orbital planes (P)
     * @param phasing - Phasing factor (F), determines relative phasing between planes (0 to P-1)
     * @param epoch - Epoch for TLE generation
     * @returns Array of Satellite objects representing the constellation
     * @throws ValidationError if parameters are invalid
     *
     * @example
     * ```typescript
     * // GPS-like constellation: 24/6/1 at 20,200 km, 55 deg inclination
     * const gpsSats = ConstellationGenerator.walker(
     *   20200 as Kilometers,
     *   55 as Degrees,
     *   24, 6, 1,
     *   new Date()
     * );
     *
     * // Iridium-like constellation: 66/6/2 at 780 km, 86.4 deg inclination
     * const iridiumSats = ConstellationGenerator.walker(
     *   780 as Kilometers,
     *   86.4 as Degrees,
     *   66, 6, 2,
     *   new Date()
     * );
     * ```
     */
    static walker(altitude: Kilometers, inclination: Degrees, totalSats: number, planes: number, phasing: number, epoch: Date): Satellite[];
    /**
     * Generates a Walker constellation from a pattern string.
     *
     * Pattern formats supported:
     * - "T/P/F" - Basic Walker notation (requires altitude and inclination params)
     * - "altitude:inclination:T/P/F" - Extended format with orbital parameters
     *
     * @param pattern - Walker pattern string (e.g., "24/3/1" or "550:53:24/3/1")
     * @param epoch - Epoch for TLE generation
     * @param altitude - Optional altitude (required if not in pattern)
     * @param inclination - Optional inclination (required if not in pattern)
     * @returns Array of Satellite objects representing the constellation
     * @throws ValidationError if pattern is invalid or missing required parameters
     *
     * @example
     * ```typescript
     * // Using extended format
     * const sats = ConstellationGenerator.fromPattern("550:53:24/3/1", new Date());
     *
     * // Using basic format with explicit parameters
     * const sats = ConstellationGenerator.fromPattern(
     *   "24/3/1",
     *   new Date(),
     *   550 as Kilometers,
     *   53 as Degrees
     * );
     * ```
     */
    static fromPattern(pattern: string, epoch: Date, altitude?: Kilometers, inclination?: Degrees): Satellite[];
    /**
     * Validates Walker constellation parameters.
     */
    private static validateWalkerParams_;
    /**
     * Parses a Walker pattern string.
     *
     * Supported formats:
     * - "T/P/F" - Basic Walker notation
     * - "altitude:inclination:T/P/F" - Extended format
     */
    private static parseWalkerPattern_;
    /**
     * Parses the T/P/F portion of a Walker pattern.
     */
    private static parseTPF_;
    /**
     * Generates the Walker constellation satellites.
     */
    private static generateWalkerConstellation_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/** Configuration for generating a launch trajectory. */
interface LaunchTrajectoryConfig {
    /** Launch site latitude in degrees. */
    launchLatDeg: number;
    /** Launch site longitude in degrees. */
    launchLonDeg: number;
    /** Launch site altitude in km (default 0). */
    launchAltKm?: number;
    /** Target orbit perigee altitude in km. */
    perigeeAltKm: number;
    /** Target orbit apogee altitude in km. */
    apogeeAltKm: number;
    /** Target orbit inclination in degrees. */
    inclinationDeg: number;
    /** Launch direction: 'N' for northbound, 'S' for southbound. */
    direction: 'N' | 'S';
    /** Launch epoch. */
    launchTime: Date;
    /** Duration to propagate on the final orbit (hours, default 48). */
    orbitDurationHours?: number;
    /** Ascent timestep in seconds (default 5). */
    ascentStepSec?: number;
    /** Orbital phase timestep in seconds (default 60). */
    orbitalStepSec?: number;
}
/** Result of trajectory generation including phase boundary metadata. */
interface LaunchTrajectoryResult {
    /** All J2000 state vectors for the trajectory. */
    states: J2000[];
    /** Index of the last ascent state (insertion point). Orbital states begin at insertionIndex + 1. */
    insertionIndex: number;
    /** Index of the first state on the final orbit after a transfer (e.g. GTO→GEO circularization). */
    transferEndIndex?: number;
    /** Index of the last pre-burn state when a plane change is included. */
    planeChangeIndex?: number;
}
/** Configuration for a plane change burn phase. */
interface PlaneChangeConfig {
    /** Desired final inclination in degrees. */
    targetInclinationDeg: number;
    /** Number of complete orbits to coast before the burn (default 0). */
    burnDelayOrbits?: number;
    /** Which node to burn at (default 'nearest'). */
    preferredNode?: 'ascending' | 'descending' | 'nearest';
}
/**
 * Generates realistic launch trajectories from ground to orbit.
 *
 * Produces an array of J2000 state vectors covering:
 * 1. Parametric ascent from launch site to parking/target orbit
 * 2. (Optional) Hohmann/generalized transfer to final orbit
 * 3. On-orbit propagation for the specified duration
 *
 * The output can be fed directly into an OemSatellite for visualization.
 */
declare class LaunchTrajectoryGenerator {
    /**
     * Generate the full launch trajectory as J2000 state vectors.
     */
    static generate(config: LaunchTrajectoryConfig): J2000[];
    /**
     * Generate the full launch trajectory with phase boundary metadata.
     * Use the insertionIndex to create a SegmentedLagrangeInterpolator
     * that avoids interpolating across the ascent→orbit physics boundary.
     */
    static generateWithBoundary(config: LaunchTrajectoryConfig): LaunchTrajectoryResult;
    /**
     * Generate a launch trajectory with an optional plane change burn phase.
     *
     * When the target inclination is lower than the minimum achievable from the launch site
     * (|launchLatDeg|), this method:
     * 1. Generates ascent + any Hohmann transfer + on-orbit at the minimum achievable inclination
     * 2. Identifies the transfer→final orbit boundary (for GEO/HEO)
     * 3. Computes the plane change burn on the circularized final orbit
     * 4. Truncates the base trajectory at the burn point and appends corrected orbit states
     *
     * For GEO this produces 4 phases: Ascent → Transfer (GTO) → Inclined GEO → Corrected GEO.
     * For LEO (no transfer) this produces 3 phases: Ascent → Inclined Orbit → Corrected Orbit.
     *
     * When no plane change is needed, delegates to generateWithBoundary unchanged.
     */
    static generateWithPlaneChange(config: LaunchTrajectoryConfig, planeChange?: PlaneChangeConfig): LaunchTrajectoryResult;
    /**
     * Compute launch azimuth from inclination and launch site latitude.
     * @param incDeg Target inclination in degrees.
     * @param latDeg Launch site latitude in degrees.
     * @param direction 'N' for northbound, 'S' for southbound.
     * @returns Launch azimuth in radians (from north, clockwise).
     */
    static computeLaunchAzimuth(incDeg: number, latDeg: number, direction: 'N' | 'S'): number;
    /**
     * Compute orbital inclination from a launch azimuth and launch site latitude.
     *
     * Inverse of {@link computeLaunchAzimuth}: from the spherical-triangle relation
     * `cos(i) = sin(azimuth) * cos(latitude)`. The result is the magnitude of the
     * inclination in degrees (always in [0, 180]); the launch direction (N/S) is
     * implied by the azimuth quadrant, not by this value.
     *
     * @param azimuthDeg Launch azimuth in degrees (from north, clockwise).
     * @param latDeg Launch site latitude in degrees.
     * @returns Orbital inclination in degrees, in [0, 180].
     */
    static computeInclinationFromAzimuth(azimuthDeg: number, latDeg: number): number;
    /**
     * Estimate ascent duration based on target insertion altitude.
     * Loosely calibrated: ~480s for 200km, ~540s for 400km, ~600s for 800km.
     */
    private static estimateAscentDuration_;
    /**
     * Estimate downrange distance at orbital insertion.
     * Based on average velocity during ascent being roughly half the orbital velocity.
     */
    private static estimateDownrange_;
    /**
     * Generate the parametric ascent profile as J2000 state vectors.
     *
     * Uses Hermite splines for altitude and downrange distance to produce
     * a gravity-turn-like trajectory.
     */
    private static generateAscentProfile_;
    /**
     * Hermite spline for altitude profile.
     * Starts at launchAlt with positive derivative (vertical launch).
     * Ends at insertionAlt with near-zero derivative (horizontal insertion).
     *
     * Uses smoothstep easing (3t²-2t³) to create an S-curve profile:
     * - Slow initial altitude gain (vertical phase, dense atmosphere)
     * - Rapid gain in middle (gravity turn, thinning atmosphere)
     * - Flattening approach to insertion altitude
     *
     * The verticalBoost term adds an early vertical kick that compensates
     * for smoothstep's zero derivative at t=0, modeling the initial
     * vertical launch phase before the gravity turn begins.
     */
    private static hermiteAltitude_;
    /**
     * Hermite cubic spline for downrange distance.
     * d(0) = 0, d'(0) = 0 (vertical start)
     * d(1) = dMax, d'(1) = endDerivative (matches orbital velocity at insertion)
     *
     * @param t Normalized time [0, 1].
     * @param dMax Downrange distance at insertion (km).
     * @param endDerivative d'(1) in unit-t coordinates = vOrbital * ascentDuration (km).
     */
    private static hermiteDownrange_;
    /**
     * Compute a point on a great circle from a starting point.
     * @param lat0 Starting latitude in radians.
     * @param lon0 Starting longitude in radians.
     * @param azimuth Azimuth from north in radians.
     * @param distanceKm Distance along the great circle in km.
     * @returns Latitude and longitude in radians.
     */
    private static greatCirclePoint_;
    /**
     * Convert geodetic coordinates to ECI position.
     * Uses spherical Earth approximation (consistent with lla2eci in transforms.ts).
     */
    private static geodeticToEci_;
    /**
     * Compute the orbital velocity vector at the insertion point.
     * The velocity is tangent to the orbit (perpendicular to the radial direction),
     * in the orbital plane defined by the launch azimuth.
     */
    private static computeInsertionVelocity_;
    /**
     * Generate the transfer phase from a parking orbit to the target orbit.
     * Uses a generalized two-burn transfer (Hohmann for circular targets).
     *
     * @returns Combined transfer + final orbit ephemeris.
     */
    private static generateTransferPhase_;
    /**
     * Generate on-orbit propagation using Kepler two-body.
     */
    static generateOrbitalPhase_(elements: ClassicalElements, durationHours: number, stepSec: number): J2000[];
    /**
     * Compute a generalized two-burn transfer between a circular parking orbit
     * and an arbitrary target orbit (circular or elliptical).
     *
     * @param rPark Parking orbit radius (km).
     * @param rPerigeeTarget Target orbit perigee radius (km).
     * @param rApogeeTarget Target orbit apogee radius (km).
     * @returns Delta-V values (km/s) for both burns and transfer time (seconds).
     */
    static computeGeneralizedTransfer(rPark: number, rPerigeeTarget: number, rApogeeTarget: number): {
        dv1: number;
        dv2: number;
        tTransfer: number;
    };
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Parameters describing an orbit's current state.
 */
interface OrbitParameters {
    meanAnomaly: number;
    argOfPerigee: number;
    raan: number;
    altitude: number;
    latitude: number;
    longitude: number;
}
/**
 * Options for OrbitFinder.
 */
interface OrbitFinderOptions {
    /** Optional callback for debug messages */
    debugCallback?: (message: string) => void;
}
/**
 * OrbitFinder is a utility class for manipulating satellite orbital parameters
 * to position a satellite over a specific latitude/longitude at a specific time.
 *
 * It works by taking an existing satellite's orbital parameters as a starting point
 * and searching for adjustments to orbital elements (mean anomaly, RAAN, argument of perigee)
 * until it finds a configuration that passes over the target location with the correct
 * directional motion (North or South).
 *
 * @example
 * ```typescript
 * // Create an OrbitFinder for a circular orbit
 * const finder = new OrbitFinder(
 *   satellite,
 *   45.0 as Degrees,  // target latitude
 *   -122.0 as Degrees, // target longitude
 *   'N',              // moving north at target
 *   new Date()
 * );
 * const result = finder.rotateOrbitToLatLon();
 * if (result[0] !== 'Error') {
 *   const [tle1, tle2] = result;
 *   // Use the new TLE
 * }
 *
 * // For elliptical orbits, specify target altitude
 * const ellipticalFinder = new OrbitFinder(
 *   satellite,
 *   45.0 as Degrees,
 *   -122.0 as Degrees,
 *   'S',
 *   new Date(),
 *   400 as Kilometers  // target altitude for perigee
 * );
 * ```
 */
declare class OrbitFinder {
    static readonly MAX_LAT_ERROR: Degrees;
    static readonly MAX_LON_ERROR: Degrees;
    static readonly MAX_ALT_ERROR: Kilometers;
    static readonly MAX_ITERATIONS = 5000;
    static readonly COARSE_STEP = 1;
    static readonly FINE_STEP = 0.005;
    private readonly sat_;
    private readonly goalParams_;
    private readonly now_;
    private readonly goalDirection_;
    private readonly debugCallback_?;
    private currentParams_;
    private lastLatitude_;
    private currentDirection_;
    constructor(sat: Satellite, goalLat: Degrees, goalLon: Degrees, goalDirection: 'N' | 'S', now: Date, goalAlt?: Kilometers, raanOffset?: number, options?: OrbitFinderOptions);
    /**
     * Rotates the orbit to pass over the target latitude/longitude at the specified time.
     * @returns A tuple of [TleLine1, TleLine2] on success, or ['Error', message] on failure.
     */
    rotateOrbitToLatLon(): [TleLine1, TleLine2] | ['Error', string];
    private debug_;
    private calculateTimeVariables_;
    private getCurrentOrbitParams_;
    private determineDirection_;
    private isCorrectDirection_;
    private updateOrbit_;
    private meanACalcLoop_;
    private meanACalc_;
    private linearSearchRaan_;
    private normalizeAngleDifference_;
    private calculateError_;
    private updateOrbitWithoutDirectionCheck_;
    private findPerigeePosition_;
    /**
     * Returns the 5-char satnum to embed in the synthesized TLEs.
     *
     * Why not {@link Satellite.sccNum}? For extended (7+ digit) IDs sccNum is
     * the full 9-digit canonical value, which would push the TLE past 69 chars
     * and break Sgp4.createSatrec. The input tle1 always has a valid 5-char
     * satnum at columns 2-6, and SGP4 itself doesn't care what value lives
     * there as long as line 1 and line 2 agree — so use that.
     */
    private tleSatNum_;
    private generateTle1_;
    private generateTle2_;
}

/**
 * @author Theodore Kruczek
 * @license AGPL-3.0-or-later
 * @copyright (c) 2025-2026 Kruczek Labs LLC
 *
 * Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Affero General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with
 * Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Result from repeat ground track calculation.
 */
interface RepeatOrbitResult {
    /** Orbital elements for this RGT orbit */
    elements: ClassicalElements;
    /** Number of revolutions in repeat cycle */
    revolutions: number;
    /** Number of days in repeat cycle */
    days: number;
    /** Altitude above Earth's mean radius (km) */
    altitude: Kilometers;
    /** Whether orbit is sun-synchronous */
    isSunSynchronous: boolean;
    /** Nodal precession rate (deg/day) */
    nodalPrecessionRate: number;
    /** Ground track spacing at equator (km) */
    groundTrackSpacing: Kilometers;
}
/**
 * Options for RGT calculation.
 */
interface RepeatGroundTrackOptions {
    /** Orbital eccentricity (default: 0.0001 for near-circular) */
    eccentricity?: number;
    /** Require sun-synchronous orbit (auto-calculates inclination) */
    sunSynchronous?: boolean;
    /** Maximum iterations for convergence (default: 50) */
    maxIterations?: number;
    /** Convergence tolerance in km (default: 0.001) */
    tolerance?: Kilometers;
    /** Epoch for generated elements (default: current date) */
    epoch?: Date;
}
/**
 * Options for finding nearest RGT orbits.
 */
interface FindNearestOptions extends RepeatGroundTrackOptions {
    /** Orbital inclination in degrees (required unless sunSynchronous=true) */
    inclination?: Degrees;
    /** Maximum repeat cycle length in days (default: 30) */
    maxDays?: number;
    /** Maximum number of results to return (default: 10) */
    maxResults?: number;
}
/**
 * Static utility class for calculating repeat ground track (RGT) orbits.
 *
 * A repeat ground track orbit is one where the satellite's ground track repeats
 * exactly after a specific number of orbital revolutions over a specific number
 * of days. This is essential for Earth observation missions that require
 * consistent revisit patterns.
 *
 * @example
 * ```typescript
 * // Calculate Landsat-8 style orbit: 233 revs / 16 days
 * const elements = RepeatGroundTrack.calculate(233, 16, 98.2 as Degrees);
 * console.log(`Altitude: ${elements.semimajorAxis - Earth.radiusMean} km`);
 *
 * // Find RGT orbits near 700 km
 * const orbits = RepeatGroundTrack.findNearest(
 *   700 as Kilometers,
 *   50 as Kilometers,
 *   { sunSynchronous: true }
 * );
 * ```
 */
declare class RepeatGroundTrack {
    private constructor();
    /**
     * Calculate orbital elements for a repeat ground track orbit.
     *
     * The calculation accounts for J2 perturbation effects on the mean motion,
     * which is critical for accurate altitude determination.
     *
     * @param revolutions - Number of orbital revolutions in repeat cycle (must be positive integer)
     * @param days - Number of days in repeat cycle (must be positive integer)
     * @param inclination - Orbital inclination in degrees (optional if sunSynchronous=true)
     * @param options - Additional calculation options
     * @returns Classical elements for the RGT orbit
     * @throws ValidationError if parameters are invalid
     *
     * @example
     * ```typescript
     * // Landsat-8 style orbit: 233 revs / 16 days, sun-synchronous
     * const elements = RepeatGroundTrack.calculate(233, 16, 98.2 as Degrees);
     * console.log(`Altitude: ${elements.semimajorAxis - Earth.radiusMean} km`);
     * // Output: ~705 km
     *
     * // Sun-synchronous RGT (inclination auto-calculated)
     * const ssoElements = RepeatGroundTrack.calculate(233, 16, undefined, {
     *   sunSynchronous: true
     * });
     * ```
     */
    static calculate(revolutions: number, days: number, inclination?: Degrees, options?: RepeatGroundTrackOptions): ClassicalElements;
    /**
     * Find repeat ground track orbits near a target altitude.
     *
     * Searches through possible R/D combinations to find RGT orbits within
     * the specified altitude range, sorted by proximity to the target.
     *
     * @param targetAltitude - Desired orbital altitude in km
     * @param maxDeviation - Maximum altitude deviation to search in km
     * @param options - Search options including inclination constraints
     * @returns Array of nearby RGT orbits sorted by altitude proximity
     *
     * @example
     * ```typescript
     * // Find sun-synchronous RGT orbits near 700 km within ±50 km
     * const orbits = RepeatGroundTrack.findNearest(
     *   700 as Kilometers,
     *   50 as Kilometers,
     *   { sunSynchronous: true }
     * );
     *
     * for (const orbit of orbits) {
     *   console.log(`${orbit.revolutions}/${orbit.days}: ${orbit.altitude.toFixed(1)} km`);
     * }
     * ```
     */
    static findNearest(targetAltitude: Kilometers, maxDeviation: Kilometers, options?: FindNearestOptions): RepeatOrbitResult[];
    /**
     * Calculate the sun-synchronous inclination for a given altitude.
     *
     * For a sun-synchronous orbit, the nodal precession rate must equal
     * Earth's orbital motion around the Sun (~0.9856°/day).
     *
     * @param altitude - Orbital altitude in km
     * @param eccentricity - Orbital eccentricity (default: 0.0001)
     * @returns Inclination in degrees for sun-synchronous orbit
     * @throws ValidationError if no sun-synchronous solution exists at this altitude
     *
     * @example
     * ```typescript
     * // Calculate SSO inclination for 700 km altitude
     * const inc = RepeatGroundTrack.sunSynchronousInclination(700 as Kilometers);
     * console.log(`Sun-synchronous inclination: ${inc.toFixed(2)}°`);
     * // Output: ~98.2°
     * ```
     */
    static sunSynchronousInclination(altitude: Kilometers, eccentricity?: number): Degrees;
    /**
     * Validates calculation parameters.
     */
    private static validateParams_;
    /**
     * Calculate sun-synchronous inclination for a given semi-major axis.
     * @param sma - Semi-major axis in km
     * @param eccentricity - Orbital eccentricity
     * @returns Inclination in radians
     */
    private static calculateSunSyncInclination_;
    /**
     * Generate candidate R/D pairs for a given altitude range.
     * @param minAlt - Minimum altitude in km
     * @param maxAlt - Maximum altitude in km
     * @param maxDays - Maximum repeat cycle length in days
     * @returns Array of {revs, days} candidates
     */
    private static findRgtCandidates_;
    /**
     * Calculate greatest common divisor.
     */
    private static gcd_;
}

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 };
