import { type AwsCredentialProviderWithMetaData } from '../aws/coreAuth.js';
import { type CustomCommand } from './AbstractCommand.js';
export type ClientConstructor<T> = new (args: any) => T;
export interface CustomClientMetadata {
    clientName: string;
}
export interface CommandWithInput {
    input: any;
}
/**
 * Base class for Custom AWS service clients
 */
export declare abstract class AbstractClient<CustomClientContext = {}> {
    protected customContext: CustomClientContext;
    config: any;
    middlewareStack: any;
    protected commandRegistry: Map<string, CustomCommand<any, CustomClientContext>>;
    protected credentials: AwsCredentialProviderWithMetaData;
    protected region: string | undefined;
    protected detailsCache: Record<string, Partial<Record<string, any>>>;
    protected cache(resourceId: string, type: string, data: any): void;
    protected getCached(resourceId: string, type: string): any;
    constructor(options: {
        credentials: AwsCredentialProviderWithMetaData;
        region: string | undefined;
    }, customContext: CustomClientContext);
    /**
     * Abstract method that each service client implements to register its commands
     */
    protected abstract registerCommands(): void;
    protected getCustomClientContext(): CustomClientContext;
    /**
     * Register a command implementation
     */
    protected registerCommand(customCommand: CustomCommand<any, CustomClientContext>): void;
    /**
     * Send a command using the registered implementation
     */
    send<Input, Output>(command: CommandWithInput): Promise<Partial<Output> | undefined>;
    /**
     * Destroy the client and cleanup resources
     */
    destroy(): void;
}
//# sourceMappingURL=AbstractClient.d.ts.map