import { Atom, Registry } from '@effect-atom/atom-react';
import * as Effect from 'effect/Effect';
import * as PubSub from 'effect/PubSub';
import * as ActivationEvent from './activation-event';
import * as CapabilityManager from './capability-manager';
import * as Plugin from './plugin';
/**
 * Identifier denoting a Manager.
 */
export declare const ManagerTypeId: unique symbol;
export type ManagerTypeId = typeof ManagerTypeId;
export type ManagerOptions = {
    pluginLoader: (id: string) => Effect.Effect<Plugin.Plugin, Error>;
    plugins?: Plugin.Plugin[];
    core?: string[];
    enabled?: string[];
    registry?: Registry.Registry;
};
type ActivationMessage = {
    event: string;
    state: 'activating' | 'activated' | 'error';
    error?: Error;
};
/**
 * Interface for the Plugin Manager.
 */
export interface PluginManager {
    readonly [ManagerTypeId]: ManagerTypeId;
    readonly activation: PubSub.PubSub<ActivationMessage>;
    readonly capabilities: CapabilityManager.CapabilityManager;
    readonly registry: Registry.Registry;
    readonly plugins: Atom.Atom<readonly Plugin.Plugin[]>;
    readonly core: Atom.Atom<readonly string[]>;
    readonly enabled: Atom.Atom<readonly string[]>;
    readonly modules: Atom.Atom<readonly Plugin.PluginModule[]>;
    readonly active: Atom.Atom<readonly string[]>;
    readonly eventsFired: Atom.Atom<readonly string[]>;
    readonly pendingReset: Atom.Atom<readonly string[]>;
    getPlugins(): readonly Plugin.Plugin[];
    getCore(): readonly string[];
    getEnabled(): readonly string[];
    getModules(): readonly Plugin.PluginModule[];
    getActive(): readonly string[];
    getEventsFired(): readonly string[];
    getPendingReset(): readonly string[];
    add(id: string): Effect.Effect<boolean, Error>;
    enable(id: string): Effect.Effect<boolean, Error>;
    remove(id: string): boolean;
    disable(id: string): Effect.Effect<boolean, Error>;
    activate(event: ActivationEvent.ActivationEvent | string, params?: {
        before?: string;
        after?: string;
    }): Effect.Effect<boolean, Error>;
    deactivate(id: string): Effect.Effect<boolean, Error>;
    reset(event: ActivationEvent.ActivationEvent | string): Effect.Effect<boolean, Error>;
}
/**
 * Type guard to check if a value is a PluginManager.
 */
export declare const isManager: (value: unknown) => value is PluginManager;
/**
 * Creates a new Plugin Manager instance.
 */
export declare const make: (options: ManagerOptions) => PluginManager;
export {};
//# sourceMappingURL=plugin-manager.d.ts.map