/**
 * @license
 * Copyright 2022-2026 Matter.js Authors
 * SPDX-License-Identifier: Apache-2.0
 */
import type { Conformance } from "#aspects/Conformance.js";
import { ModelIndex } from "#logic/ModelIndex.js";
import { Access } from "../aspects/Access.js";
import { Quality } from "../aspects/Quality.js";
import { ElementTag, FeatureSet, Metatype } from "../common/index.js";
import { ClusterElement } from "../elements/index.js";
import { AttributeModel } from "./AttributeModel.js";
import { CommandModel } from "./CommandModel.js";
import { DatatypeModel } from "./DatatypeModel.js";
import { EventModel } from "./EventModel.js";
import type { FieldModel } from "./FieldModel.js";
import { Model } from "./Model.js";
import { ScopeModel } from "./ScopeModel.js";
export declare class ClusterModel extends ScopeModel<ClusterElement, ClusterModel.Child> implements ClusterElement, Conformance.FeatureContext {
    #private;
    tag: ClusterElement.Tag;
    classification?: ClusterElement.Classification;
    get diagnostics(): boolean | undefined;
    get quality(): Quality;
    set quality(definition: Quality | Quality.Definition);
    get effectiveQuality(): Quality;
    get attributes(): ModelIndex<AttributeModel>;
    get commands(): ModelIndex<CommandModel>;
    get events(): ModelIndex<EventModel>;
    get datatypes(): ModelIndex<DatatypeModel>;
    /**
     * Fields on a cluster are not part of the standard Matter data model.  They are used for internal extensions that
     * should not be served via the Matter protocol.
     */
    get fields(): ModelIndex<FieldModel>;
    /**
     * Attributes and fields, for treating a cluster as a struct.
     */
    get properties(): ModelIndex<AttributeModel | FieldModel>;
    get conformant(): ClusterModel.Conformant;
    get pics(): string | undefined;
    set pics(pics: string | undefined);
    /**
     * Get attributes, commands and events whether inherited or defined directly in this model.
     */
    get allAces(): ModelIndex<AttributeModel | CommandModel | EventModel>;
    get revision(): number;
    get features(): FieldModel[];
    get featureMap(): AttributeModel;
    get definedFeatures(): FeatureSet;
    get supportedFeatures(): FeatureSet;
    set supportedFeatures(features: FeatureSet.Definition | undefined);
    get effectiveMetatype(): Metatype;
    get effectiveAccess(): Access;
    constructor(definition: ClusterModel.Definition, ...children: Model.ChildDefinition<ClusterModel>[]);
    toElement(omitResources?: boolean, extra?: Record<string, unknown>): ClusterElement;
    static Tag: ElementTag;
}
export declare namespace ClusterModel {
    type Definition = Model.Definition<ClusterModel> & {
        supportedFeatures?: FeatureSet.Definition;
    };
    type Child = DatatypeModel | AttributeModel | CommandModel | EventModel | FieldModel;
    /**
     * A conformant view of {@link ClusterModel} child indices properties.
     */
    class Conformant {
        #private;
        constructor(model: ClusterModel);
        /**
         * The cluster's conformant attributes.
         */
        get attributes(): ModelIndex<AttributeModel>;
        /**
         * The cluster's conformant properties (includes fields and attributes).
         *
         * This offers compatibility with the equivalent field for ValueModel.  It is useful when treating a cluster as
         * a struct.
         */
        get properties(): ModelIndex<AttributeModel | FieldModel>;
        /**
         * The cluster's conformant fields.
         *
         * Fields are not formally allowed on clusters but we allow for extensions that should not be served via the
         * Matter protocol.
         *
         * This is primarily here to allow simplified access to fields in contexts where a variable is typed as a
         * ClusterModel or ValueModel.
         */
        get fields(): ModelIndex<FieldModel>;
        /**
         * The cluster's conformant commands.
         */
        get commands(): ModelIndex<CommandModel>;
        /**
         * The cluster's conformant events.
         */
        get events(): ModelIndex<EventModel>;
    }
}
//# sourceMappingURL=ClusterModel.d.ts.map