import type { EnvPick } from 'env-struct';
import type { BrowserContext } from 'playwright';
import type { env } from '../envVars';
import type { InteractionVisualizer } from '../managers/InteractionVisualizer';
import type { BrowserStateReference } from '../models/BrowserStateFlowReference';
import type { BrowserStorageState } from '../models/BrowserStorageState';
import type { ControlPanelFactory } from '../models/ControlPanel';
import type { CreateDonobuFlow } from '../models/CreateDonobuFlow';
import type { TargetRuntime } from './TargetRuntime';
/**
 * Parameters passed to {@link TargetRuntimePlugin.createRuntime}.
 *
 * All runtimes receive the same bag of parameters and use what they need.
 * Optional fields (e.g. `browserContextOverride`) are only relevant to
 * specific targets and are safely ignored by others.
 */
export interface TargetRuntimeParams {
    flowParams: CreateDonobuFlow;
    flowId: string;
    interactionVisualizer: InteractionVisualizer;
    controlPanelFactory: ControlPanelFactory;
    environ: EnvPick<typeof env, 'BROWSERBASE_API_KEY' | 'BROWSERBASE_PROJECT_ID'>;
    /**
     * Pre-created browser context override. When present, the web runtime
     * uses this instead of creating a new browser context. Used by the
     * self-healing path to reuse the parent test's browser session.
     */
    browserContextOverride?: BrowserContext;
    /**
     * Callback to resolve a {@link BrowserStorageState} from a reference.
     * Required by the web runtime when `flowParams.browser?.initialState` is set.
     */
    getBrowserStorageState?: (ref: BrowserStateReference) => Promise<BrowserStorageState>;
}
/**
 * Static metadata returned by {@link TargetRuntimePlugin.describe} so the
 * frontend can discover available targets and render appropriate UI.
 */
export interface TargetDescriptor {
    /** Human-readable display name (e.g. "Web Browser", "Mobile Device"). */
    label: string;
    /** Supported device/emulation names, if enumerable at startup. */
    supportedDevices?: string[];
}
/**
 * A target runtime plugin provides factories for creating
 * {@link TargetRuntime} instances for a specific target type.
 *
 * Plugins are registered with a string key matching the `target` field on
 * flow creation requests. They are self-contained — each plugin validates
 * its own configuration and manages its own lifecycle.
 *
 * The built-in `web` target is registered at startup. Additional targets
 * (e.g. `mobile`) are provided by plugins — see
 * {@link PluginModule.loadTargetRuntimePlugins}.
 */
export interface TargetRuntimePlugin {
    /** The target type string this plugin handles (e.g. `'web'`, `'mobile'`). */
    type: string;
    /**
     * Return static metadata about this target for frontend discovery.
     * Called by `GET /api/targets`.
     */
    describe(): TargetDescriptor;
    /**
     * Validate target-specific flow parameters. Throws
     * {@link InvalidParamValueException} on invalid configuration.
     *
     * Called before {@link createRuntime} to fail fast on bad input.
     */
    validate(flowParams: CreateDonobuFlow): Promise<void>;
    /**
     * Create a live {@link TargetRuntime} for a flow. This may start sessions,
     * create browser contexts, provision devices, etc.
     *
     * The caller is responsible for calling {@link TargetRuntime.destroy} when
     * the flow completes or errors.
     */
    createRuntime(params: TargetRuntimeParams): Promise<TargetRuntime>;
}
/**
 * An immutable registry of target runtime plugins, keyed by target type.
 * Created once at startup and threaded through the application.
 */
export declare class TargetRuntimePluginRegistry {
    private readonly plugins;
    constructor(plugins: TargetRuntimePlugin[]);
    /** Look up a registered target runtime plugin by target type. */
    get(type: string): TargetRuntimePlugin | undefined;
    /** Return all registered target runtime plugins. */
    getAll(): TargetRuntimePlugin[];
}
//# sourceMappingURL=TargetRuntimePlugin.d.ts.map