import type { z } from 'zod';
import type { Procedure } from './define-procedure.js';
import { useFetch } from '#imports';
type InferProcedureInput<P> = P extends Procedure<infer I, any> ? I extends z.ZodUndefined ? unknown : z.infer<I> : never;
type InferProcedureOutput<P> = P extends Procedure<any, infer O> ? O extends z.ZodTypeAny ? z.infer<O> : unknown : never;
type Call<P extends Procedure<any, any>> = [unknown] extends [
    InferProcedureInput<P>
] ? () => Promise<InferProcedureOutput<P>> : (input: InferProcedureInput<P>) => Promise<InferProcedureOutput<P>>;
type UseCall<P extends Procedure<any, any>> = [unknown] extends [
    InferProcedureInput<P>
] ? () => ReturnType<typeof useFetch<InferProcedureOutput<P>>> : (input: InferProcedureInput<P>) => ReturnType<typeof useFetch<InferProcedureOutput<P>>>;
export declare function createCaller<P extends Procedure<any, any>>(url: string): {
    call: Call<P>;
    useCall: UseCall<P>;
};
export {};
