import type { Spellbook } from "@usirin/spellbook";
import { type ClientTransport } from "./transport";
/**
 * Options for creating a SpellCaster
 */
export interface SpellCasterOptions {
    /**
     * Transport to use for communication
     */
    transport: ClientTransport;
}
/**
 * Type-safe interface for casting spells
 */
export interface SpellCasterSpec<TSpellbook extends Spellbook> {
    /**
     * Cast a spell using the provided transport
     *
     * @param name - The name of the spell to cast
     * @param parameters - The parameters to pass to the spell
     * @returns A promise that resolves to the result of the spell
     */
    cast<TName extends keyof TSpellbook["spells"]>(name: TName, parameters: Parameters<TSpellbook["spells"][TName]["execute"]>[0]): Promise<ReturnType<TSpellbook["spells"][TName]["execute"]>>;
    /**
     * Get the current transport
     */
    getTransport(): ClientTransport;
}
/**
 * Create a SpellCaster for a specific spellbook type
 *
 * @param options - SpellCaster options
 * @returns A SpellCaster instance
 */
export declare const createSpellCaster: <TSpellbook extends Spellbook>(options: SpellCasterOptions) => import("@usirin/forge").Entity<"caster"> & SpellCasterSpec<TSpellbook>;
export type SpellCaster<TSpellbook extends Spellbook = Spellbook> = ReturnType<typeof createSpellCaster<TSpellbook>>;
export declare function cast<TSpellbook extends Spellbook, TSpellName extends keyof TSpellbook["spells"] = keyof TSpellbook["spells"]>(transport: ClientTransport, name: TSpellName, parameters: Parameters<TSpellbook["spells"][TSpellName]["execute"]>[0]): Promise<ReturnType<TSpellbook["spells"][TSpellName]["execute"]>>;
//# sourceMappingURL=caster.d.ts.map