import type { SessionAuth, SessionParent, SessionTurn } from "#context/keys.js";
import type { SandboxProviderRuntime } from "#shared/sandbox-provider.js";
import type { RuntimeSandboxSession, RuntimeSandboxSessionFor, SandboxSession } from "#shared/sandbox-session.js";
declare const ENVIRONMENT: unique symbol;
declare const PROVIDER_RUNTIME: unique symbol;
declare const CONFIGURATION_HASH: unique symbol;
export interface SandboxSelectorContext {
    readonly session: {
        readonly auth: SessionAuth;
        readonly id: string;
        readonly parent?: SessionParent;
        readonly turn: SessionTurn;
    };
}
export type SandboxSelector = (context: SandboxSelectorContext) => Promise<RuntimeSandboxSession> | RuntimeSandboxSession;
export type SandboxOpenArguments<Options> = Options extends undefined ? [] : Record<never, never> extends Options ? [options?: Options] : [options: Options];
export interface SandboxEnvironmentIdentity {
    readonly [CONFIGURATION_HASH]: string;
    readonly [ENVIRONMENT]: true;
    readonly [PROVIDER_RUNTIME]: SandboxProviderRuntime;
    readonly provider: string;
}
export interface SandboxEnvironment<Options extends object | undefined = object, Session extends SandboxSession = SandboxSession> extends SandboxEnvironmentIdentity {
    open(...args: SandboxOpenArguments<Options>): Promise<RuntimeSandboxSessionFor<Session>>;
}
interface ConstructorRuntime {
    open(input: {
        readonly configurationHash: string;
        readonly environment: object;
        readonly environmentConfigurationHash: string;
        readonly options: object | undefined;
        readonly provider: SandboxProviderRuntime;
    }): Promise<RuntimeSandboxSession>;
}
export declare function createSandboxEnvironment<Options extends object | undefined = object, Session extends SandboxSession = SandboxSession>(input: {
    readonly configuration?: unknown;
    readonly runtime: SandboxProviderRuntime;
}): SandboxEnvironment<Options, Session>;
export declare function getSandboxEnvironmentConfigurationHash(environment: SandboxEnvironmentIdentity): string;
export declare function getSandboxEnvironmentRuntime(environment: SandboxEnvironmentIdentity): SandboxProviderRuntime;
export declare function bindSandboxEnvironment(selector: SandboxSelector, environment: SandboxEnvironmentIdentity): SandboxSelector;
export declare function getBoundSandboxEnvironment(value: unknown): SandboxEnvironmentIdentity | undefined;
export declare function isSandboxEnvironment(value: unknown): value is SandboxEnvironmentIdentity;
export declare function runWithSandboxConstructorRuntime<T>(runtime: ConstructorRuntime, callback: () => Promise<T> | T): Promise<T>;
export {};
