import { Atom } from '@effect-atom/atom-react';
import * as Effect from 'effect/Effect';
import type * as Capability from './capability';
/**
 * Interface for the Capability Manager.
 * Provides methods for contributing, removing, and accessing capabilities.
 */
export interface CapabilityManager {
    contribute<T>(args: {
        module: string;
        interface: Capability.InterfaceDef<T>;
        implementation: T;
    }): void;
    remove<T>(interfaceDef: Capability.InterfaceDef<T>, implementation: T): void;
    /**
     * Get the Atom reference to the available capabilities for a given interface.
     * Primarily useful for deriving other Atom values based on the capabilities or
     * for subscribing to changes in the capabilities.
     * @returns An atom reference to the available capabilities.
     */
    atom<T>(interfaceDef: Capability.InterfaceDef<T>): Atom.Atom<T[]>;
    /**
     * Get capabilities from the capability manager.
     * @returns An array of capabilities.
     */
    getAll<T>(interfaceDef: Capability.InterfaceDef<T>): T[];
    /**
     * Requests a single capability from the capability manager.
     * @returns The capability.
     * @throws If no capability is found.
     */
    get<T>(interfaceDef: Capability.InterfaceDef<T>): T;
    /**
     * Waits for a capability to be available.
     * @returns The capability.
     */
    waitFor<T>(interfaceDef: Capability.InterfaceDef<T>): Effect.Effect<T, Error>;
}
/**
 * Creates a new Capability Manager instance.
 */
export declare const make: (options: CapabilityManagerOptions) => CapabilityManager;
//# sourceMappingURL=capability-manager.d.ts.map