import { z } from 'zod';
export declare const CHARACTER_PROFILE: "pocket-humanoid-v2";
export declare const characterSlots: readonly ["head", "hair", "headwear", "top", "outerwear", "arms", "armwear", "legs", "feet", "belt", "shoulders", "neck", "back", "weapon"];
export type CharacterSlot = (typeof characterSlots)[number];
export declare const characterLimits: {
    readonly triangles: 40000;
    readonly joints: 64;
    readonly influences: 4;
    readonly drawCalls: 1;
    readonly materials: 1;
};
export declare const characterRecipeSchema: z.ZodObject<{
    version: z.ZodLiteral<1>;
    packRevision: z.ZodString;
    rig: z.ZodString;
    parts: z.ZodObject<{
        head: z.ZodOptional<z.ZodNullable<z.ZodString>>;
        hair: z.ZodOptional<z.ZodNullable<z.ZodString>>;
        headwear: z.ZodOptional<z.ZodNullable<z.ZodString>>;
        top: z.ZodOptional<z.ZodNullable<z.ZodString>>;
        outerwear: z.ZodOptional<z.ZodNullable<z.ZodString>>;
        arms: z.ZodOptional<z.ZodNullable<z.ZodString>>;
        armwear: z.ZodOptional<z.ZodNullable<z.ZodString>>;
        legs: z.ZodOptional<z.ZodNullable<z.ZodString>>;
        feet: z.ZodOptional<z.ZodNullable<z.ZodString>>;
        belt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
        shoulders: z.ZodOptional<z.ZodNullable<z.ZodString>>;
        neck: z.ZodOptional<z.ZodNullable<z.ZodString>>;
        back: z.ZodOptional<z.ZodNullable<z.ZodString>>;
        weapon: z.ZodOptional<z.ZodNullable<z.ZodString>>;
    }, z.core.$strict>;
    colors: z.ZodObject<{
        skin: z.ZodString;
        hair: z.ZodString;
        cloth: z.ZodString;
    }, z.core.$strict>;
    colorMode: z.ZodOptional<z.ZodEnum<{
        original: "original";
        custom: "custom";
    }>>;
    partColorModes: z.ZodOptional<z.ZodObject<{
        head: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
        hair: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
        headwear: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
        top: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
        outerwear: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
        arms: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
        armwear: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
        legs: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
        feet: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
        belt: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
        shoulders: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
        neck: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
        back: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
        weapon: z.ZodOptional<z.ZodEnum<{
            original: "original";
            custom: "custom";
        }>>;
    }, z.core.$strict>>;
}, z.core.$strict>;
export type CharacterRecipe = z.infer<typeof characterRecipeSchema>;
export type CharacterAsset = {
    file: string;
    sha256: string;
    bytes: number;
    url?: string;
};
export type CharacterPart = {
    id: string;
    name: string;
    rig: string;
    slot: CharacterSlot;
    family: string;
    source: string;
    sourceNode: string;
    triangles: number;
    asset: CharacterAsset;
    thumbnail?: CharacterAsset;
    collection?: string;
    adaptedFrom?: string;
    requires?: string[];
    compatibleWith?: Partial<Record<CharacterSlot, string[]>>;
    hides?: CharacterSlot[];
};
export type CharacterClip = {
    id: string;
    name: string;
    library: string;
    sourceName: string;
    duration: number;
    loop: boolean;
    rootMotion: 'in-place';
    asset: CharacterAsset;
};
export type CharacterRig = {
    id: string;
    name: string;
    asset: CharacterAsset;
    joints: number;
    requiredSlots: CharacterSlot[];
    defaults: Partial<Record<CharacterSlot, string>>;
    defaultAnimations: CharacterAsset;
    aliases: Record<string, string>;
    clips: CharacterClip[];
};
export type CharacterPack = {
    version: 1;
    profile: typeof CHARACTER_PROFILE;
    revision: string;
    rigs: CharacterRig[];
    parts: CharacterPart[];
    repairs?: string[];
};
export type CharacterAppearance = {
    recipe: CharacterRecipe;
    rig: CharacterAsset;
    defaultAnimations: CharacterAsset;
    parts: CharacterPart[];
};
/** Validate IDs and compatibility against the authority's immutable pack. No caller URLs. */
export declare function validateCharacterRecipe(input: unknown, pack: CharacterPack): CharacterRecipe;
export declare function defaultCharacterRecipe(pack: CharacterPack, rigId?: string): CharacterRecipe;
export declare function characterAppearance(recipe: CharacterRecipe, pack: CharacterPack): CharacterAppearance;
export declare function characterPartIssue(part: CharacterPart, recipe: CharacterRecipe, pack: CharacterPack): string | null;
export declare function characterHiddenSlots(recipe: CharacterRecipe, pack: CharacterPack): Map<"head" | "hair" | "headwear" | "top" | "outerwear" | "arms" | "armwear" | "legs" | "feet" | "belt" | "shoulders" | "neck" | "back" | "weapon", string>;
/** A base change removes only optional pieces that no longer fit, with names for the UI. */
export declare function reconcileCharacterParts(recipe: CharacterRecipe, pack: CharacterPack): {
    recipe: {
        version: 1;
        packRevision: string;
        rig: string;
        parts: {
            head?: string | null | undefined;
            hair?: string | null | undefined;
            headwear?: string | null | undefined;
            top?: string | null | undefined;
            outerwear?: string | null | undefined;
            arms?: string | null | undefined;
            armwear?: string | null | undefined;
            legs?: string | null | undefined;
            feet?: string | null | undefined;
            belt?: string | null | undefined;
            shoulders?: string | null | undefined;
            neck?: string | null | undefined;
            back?: string | null | undefined;
            weapon?: string | null | undefined;
        };
        colors: {
            skin: string;
            hair: string;
            cloth: string;
        };
        colorMode?: "original" | "custom" | undefined;
        partColorModes?: {
            head?: "original" | "custom" | undefined;
            hair?: "original" | "custom" | undefined;
            headwear?: "original" | "custom" | undefined;
            top?: "original" | "custom" | undefined;
            outerwear?: "original" | "custom" | undefined;
            arms?: "original" | "custom" | undefined;
            armwear?: "original" | "custom" | undefined;
            legs?: "original" | "custom" | undefined;
            feet?: "original" | "custom" | undefined;
            belt?: "original" | "custom" | undefined;
            shoulders?: "original" | "custom" | undefined;
            neck?: "original" | "custom" | undefined;
            back?: "original" | "custom" | undefined;
            weapon?: "original" | "custom" | undefined;
        } | undefined;
    };
    removed: string[];
};
