export interface AppiumServerConfig {
    /** Enable embedded Appium server */
    enabled?: boolean;
    /**
     * Appium server arguments - pass everything here exactly as Appium expects
     * All server configuration goes in this object and will be passed directly to Appium
     *
     * Defaults (applied if not specified):
     * - "log-level": "debug" (for complete log visibility including ADB commands, proxying, etc.)
     * - "log-timestamp": true (shows timestamps in logs)
     *
     * Common options:
     * - port: 4723 (if not specified, will auto-detect)
     * - address: '0.0.0.0' or '127.0.0.1'
     * - "allow-cors": true
     * - "use-drivers": ["uiautomator2", "xcuitest"]
     * - "use-plugins": ["images", "relaxed-caps"]
     * - "relaxed-security": true
     * - "session-override": true
     * - "base-path": "/wd/hub"
     * - "log-level": "debug" (or "info", "warn", "error")
     * - "log-timestamp": true
     * - "allow-insecure": ["adb_shell"]
     * - "default-capabilities": { key: "value" }
     * - appiumHome: "/path/to/.appium"
     *
     * For all available options, see:
     * @see https://appium.io/docs/en/latest/guides/config/
     */
    serverArgs?: Record<string, unknown>;
    /**
     * Max time (ms) to wait for the Appium server process to come up before
     * giving up and killing it. Default: 30000 (30 seconds).
     * Can also be overridden via the APPIUM_START_TIMEOUT_MS env var.
     */
    startTimeoutMs?: number;
}
export interface NodeConfig {
    hubUrl: string;
    accessKey: string;
    token: string;
    name: string;
    host: string;
    os: string;
    tags: string | null;
    capabilityPortRange?: {
        min: number;
        max: number;
    };
    chromeDriverPath?: string;
    platform?: 'android' | 'ios' | 'both';
    bootedSimulators?: boolean;
    /** iOS device type filter */
    iosDeviceType?: 'real' | 'simulated' | 'both';
    /** Android device type filter */
    androidDeviceType?: 'real' | 'simulated' | 'both';
    /** Appium server configuration */
    appiumServer?: AppiumServerConfig;
    /** Temporary session logs directory (default: './tmp') - logs are uploaded to hub after session ends */
    tempLogsDir?: string;
    /** Absolute path to store WDA resigned IPA files (default: ~/.cache/device-farm) */
    wdaResignedIpaPath?: string;
    /** List of Android app package names to uninstall after session ends (e.g., ["com.example.app1", "com.example.app2"]) */
    androidCleanUpApps?: string[];
    /** List of iOS app bundle IDs to uninstall after session ends (e.g., ["com.example.app1", "com.example.app2"]) */
    iosCleanUpApps?: string[];
    /** Device reconciliation configuration */
    deviceReconciliation?: {
        /** How often to reconcile device state (in milliseconds). Default: 60000 (60 seconds) */
        intervalMs?: number;
        /** Whether reconciliation is enabled. Default: true */
        enabled?: boolean;
    };
    /** Write tap coordinates to a JSONL file per session (customer-specific, off by default) */
    coordinateLogEnabled?: boolean;
    /** Enable DFStreamer (ReplayKit broadcast) streaming for iOS real devices */
    dfStreamerEnabled?: boolean;
    /** DFStreamer configuration for externally-signed IPA */
    dfStreamer?: {
        /** Hub upload ID of the signed DFStreamer IPA (from frontend WDA upload) */
        id?: string;
        /** Bundle ID of the signed DFStreamer app (changes after resign) */
        bundleId?: string;
    };
    /** scrcpy streaming configuration for Android devices */
    scrcpy?: {
        /** Enable scrcpy-based streaming for Android (default: true) */
        enabled?: boolean;
        /** Video bitrate in bits/sec (default: 2000000 = 2 Mbps) */
        videoBitRate?: number;
        /** Maximum FPS (default: 30) */
        maxFps?: number;
        /** Maximum screen dimension, 0 = original resolution (default: 1280) */
        maxSize?: number;
        /** Path to scrcpy-server binary (default: bundled) */
        serverJarPath?: string;
        /** Force a specific video encoder, e.g. 'OMX.google.h264.encoder' or 'c2.android.avc.encoder' for SW fallback when hardware encoder crashes */
        videoEncoder?: string;
    };
    /** MJPEG streaming configuration for iOS devices (FFmpeg re-encoding) */
    mjpeg?: {
        /** Output width in pixels (default: 1280) */
        width?: number;
        /** Output height in pixels (default: 720) */
        height?: number;
        /** Frames per second (default: 24) */
        fps?: number;
        /** Video bitrate, e.g. '1500k' (default: '1500k') */
        bitrate?: string;
        /** FFmpeg preset: ultrafast, superfast, veryfast, faster, fast, medium (default: 'ultrafast') */
        preset?: string;
    };
}
/**
 * Load configuration from file or return default
 */
export declare function loadConfig(configPath?: string): Partial<NodeConfig>;
/**
 * Save configuration to file
 */
export declare function saveConfig(config: NodeConfig, configPath?: string): void;
/**
 * Parse CLI arguments
 */
export declare function parseCLIArgs(): Partial<NodeConfig>;
/**
 * Get config file path from CLI arguments
 */
export declare function getConfigPathFromCLI(): string | undefined;
/**
 * Merge config from file, CLI args, and environment variables
 */
export declare function getMergedConfig(configPath?: string): NodeConfig;
/**
 * Get the temporary logs directory path
 * @param configPath - Optional config path override
 * @returns Absolute path to temp logs directory
 */
export declare function getTempLogsDir(configPath?: string): string;
//# sourceMappingURL=node.config.d.ts.map