/**
 * Multi-handler dispatch for client-side message routing.
 * See @specs/client.md#multiple-handlers and @specs/rules.md#server-client-asymmetry.
 */
import type { AnyMessageSchema, MessageHandler } from "./types.js";
export declare class HandlerRegistry {
    private handlers;
    private schemas;
    /**
     * Registers a handler for a message type.
     * Returns unsubscribe function that removes only this handler.
     */
    register<S extends AnyMessageSchema>(schema: S, handler: MessageHandler, extractType: (schema: S) => string): () => void;
    /**
     * Dispatches message to registered handlers.
     * Executes in registration order with error isolation.
     * Returns true if handlers were found, false otherwise.
     */
    dispatch(msg: {
        type: string;
        [key: string]: unknown;
    }): boolean;
    /**
     * Gets schema for validation by message type.
     */
    getSchema(type: string): AnyMessageSchema | undefined;
    /**
     * Validates message against registered schema.
     * Returns { success: true, data } if validation succeeds.
     * Returns { success: false, reason: "no-schema" } if no schema registered.
     * Returns { success: false, reason: "validation-failed" } if validation fails.
     */
    validate(msg: unknown, safeParse: (schema: AnyMessageSchema, data: unknown) => {
        success: boolean;
        data?: unknown;
        error?: unknown;
    }): {
        success: true;
        data: unknown;
    } | {
        success: false;
        reason: "no-schema";
    } | {
        success: false;
        reason: "validation-failed";
        error: unknown;
    };
}
//# sourceMappingURL=handlers.d.ts.map