import 'reflect-metadata';
import ExtensionGraph, { DependencyGraphOptions } from './extension-graph/extension-graph';
import { Extension, ExtensionManifest } from './extension';
import { Config } from './config';
import { Aspect } from './aspect';
import { Runtimes } from './runtimes/runtimes';
import { RuntimeDefinition } from './runtimes/runtime-definition';
export type GlobalConfig = {
    [key: string]: object;
};
export type RequireFn = (aspect: Extension, runtime: RuntimeDefinition) => Promise<void>;
export declare class Harmony {
    /**
     * extension graph
     */
    readonly graph: ExtensionGraph;
    /**
     * harmony top level config
     */
    readonly config: Config;
    readonly runtimes: Runtimes;
    readonly activeRuntime: string;
    private depOptions;
    constructor(
    /**
     * extension graph
     */
    graph: ExtensionGraph, 
    /**
     * harmony top level config
     */
    config: Config, runtimes: Runtimes, activeRuntime: string, depOptions: DependencyGraphOptions);
    current: string | null;
    private runtime;
    /**
     * list all registered extensions
     */
    get extensions(): Map<string, Extension>;
    /**
     * list all registered extensions ids
     */
    get extensionsIds(): string[];
    /**
     * load an Aspect into the dependency graph.
     */
    load(extensions: ExtensionManifest[]): Promise<void>;
    /**
     * set extensions during Harmony runtime.
     * hack!
     */
    set(extensions: ExtensionManifest[]): Promise<void>;
    private runOne;
    getDependencies(aspect: Extension): Extension[];
    initExtension(id: string): void;
    endExtension(): void;
    /**
     * get an extension from harmony.
     */
    get<T>(id: string): T;
    resolveRuntime(name: string): RuntimeDefinition;
    run(requireFn?: RequireFn): Promise<void>;
    static load(aspects: Aspect[], runtime: string, globalConfig: GlobalConfig, options?: DependencyGraphOptions): Promise<Harmony>;
}
