/**
 * @license
 * Copyright 2022-2026 Matter.js Authors
 * SPDX-License-Identifier: Apache-2.0
 */
import { ElementTag } from "#common/ElementTag.js";
import { Specification } from "#common/Specification.js";
import { MatterElement } from "../elements/index.js";
import type { ModelIndex } from "../logic/ModelIndex.js";
import { AttributeModel } from "./AttributeModel.js";
import { ClusterModel } from "./ClusterModel.js";
import { DatatypeModel } from "./DatatypeModel.js";
import { DeviceTypeModel } from "./DeviceTypeModel.js";
import { FabricModel } from "./FabricModel.js";
import { FieldModel } from "./FieldModel.js";
import { Model } from "./Model.js";
import { ResourceBundle } from "./Resource.js";
import { ScopeModel } from "./ScopeModel.js";
import { SemanticNamespaceModel } from "./SemanticNamespaceModel.js";
/**
 * The root of a Matter model.  This is the parent for global models.
 */
export declare class MatterModel extends ScopeModel<MatterElement, MatterModel.Child> implements MatterElement {
    #private;
    tag: MatterElement.Tag;
    revision?: Specification.Revision;
    /**
     * The default instance of the canonical MatterModel (also exported directly simply as "Matter").
     */
    static standard: MatterModel;
    /**
     * Clusters.
     */
    get clusters(): ModelIndex<ClusterModel>;
    /**
     * Device types.
     */
    get deviceTypes(): ModelIndex<DeviceTypeModel>;
    /**
     * Semantic tag namespaces.
     */
    get semanticNamespaces(): SemanticNamespaceModel[];
    /**
     * Global datatypes.
     */
    get datatypes(): ModelIndex<DatatypeModel>;
    /**
     * Global fields.
     */
    get fields(): ModelIndex<FieldModel>;
    /**
     * Global attributes.
     */
    get attributes(): ModelIndex<AttributeModel>;
    /**
     * Fabrics.
     */
    get fabrics(): FabricModel[];
    /**
     * All sub-cluster global elements from this model.
     *
     * This is the set of utility datatypes required by cluster definitions.
     *
     * The returned elements are clones as we use this to initialize empty models for testing or diagnostic purposes.
     */
    get seedGlobals(): MatterModel.Child[];
    /**
     * MatterModel always owns itself.
     */
    get root(): this;
    /**
     * The set of "permanent" datatypes.
     *
     * These are datatypes owned by this model with the "isSeed" value set.  For performance reasons we disallow
     * overriding these values.
     */
    get permanentDatatypes(): Record<string, Model<import("../elements/BaseElement.js").BaseElement, Model<import("../elements/BaseElement.js").BaseElement, any>>>;
    /**
     * The resource pool for the node.
     */
    get resources(): ResourceBundle | undefined;
    set resources(resources: ResourceBundle | undefined);
    constructor(definition?: MatterModel.Definition, ...children: Model.ChildDefinition<MatterModel>[]);
    toElement(omitResources?: boolean, extra?: Record<string, unknown>): MatterElement;
    static Tag: ElementTag;
}
export declare namespace MatterModel {
    type Child = ClusterModel | DeviceTypeModel | FieldModel | DatatypeModel | AttributeModel | FabricModel | SemanticNamespaceModel;
    type Definition = Omit<Model.Definition<MatterModel>, "name" | "children"> & {
        name?: string;
        children?: Model.ChildDefinition<MatterModel>[];
    };
}
//# sourceMappingURL=MatterModel.d.ts.map