import { type ItemDefVaultRef } from './gunConfigRules'; export declare const VAULT_ASSETS_PATH = "/api/v1/vault/assets"; export declare const ITEM_DISTRIBUTIONS_PATH = "/api/v1/item-distributions"; /** The listing a publish creates when no price flag is passed — deliberately above every kind's price floor. */ export declare const DEFAULT_LISTING_PRICE_LIX = 500; /** The transport slice publish needs — HelixApi satisfies it; tests inject a fake. */ export type ItemDefPublishApi = { postMultipart(path: string, form: FormData): Promise; request(method: string, path: string, body?: unknown): Promise; }; export type ItemDefPublishInput = { file: string; /** Product slug — unique platform-wide; defaults to `weapon-` (`emote-` on the emote lane). */ slug?: string; /** Keep the product off the marketplace (and out of the publish fee); the link still grants the creator an instance. */ keepPersonal?: boolean; /** Marketplace listing price in LIX. Absent = the Ⱡ500 default; `0` = free Claim. Positive prices must * clear the per-kind floor (`GET /universal-items/publish-config`) — the backend enforces it. */ price?: string; /** List free to claim — shorthand for `--price 0`. */ claim?: boolean; /** Publish WITHOUT a marketplace listing — for world-only items acquired through world distributions. */ noMarketplace?: boolean; /** Select a fixed-supply Collectible edition. The backend grants serial #1 * to the creator; omit for an unlimited Standard edition. */ collectibleSupply?: number; /** EMOTE ONLY: the slot family the listing occupies — `sit`/`lie` are spot-only postures a world's chair or * bed plays, `regular` (the backend's default when absent) rides the wheel. */ emoteCategory?: string; /** PAIRED EMOTE: the second performer's clip, and where they stand — `",,"`, metres in the * initiator's frame (+z is their facing). Both together, and only on a `regular` emote. */ joinerClip?: string; joinerOffset?: string; /** TRANSITIONS: the enter/exit clips the body clip is chained between. Each replaces the descriptor's own * `emote.intro` / `emote.outro` rather than joining it, and neither applies to a paired emote. */ introClip?: string; outroClip?: string; /** PAIRED EMOTE: seconds into the initiator's clip the offer pose holds while waiting for a partner. Wins * over an `emote.roles.offerAtS` the descriptor authors; absent on both means the clip's first frame. */ offerAt?: string; /** Publish these bytes as a NEW immutable VERSION of this existing definition asset instead of minting a * new one (compare-and-set against its served version). The product link is untouched, and worlds keep * serving the version they pin until each re-pins. */ versionOf?: string; }; export type ItemDefPublishReport = { id: string; title: string; definition: ItemDefVaultRef & { url: string | null; }; /** The prop mesh — a weapon's; an emote has none. */ prop?: ItemDefVaultRef; /** The animation clip — an emote's; a weapon has none. */ clip?: ItemDefVaultRef; /** The second animation clip — a PAIRED emote's joiner; absent on a solo one. */ joinerClip?: ItemDefVaultRef; /** The transition clips — an emote's enter/exit; absent when the emote authors none. */ introClip?: ItemDefVaultRef; outroClip?: ItemDefVaultRef; audio: Array<{ ref: string; assetId: string; version: number; }>; /** Absent on --version-of publishes — the existing product keeps serving the asset. */ product?: { slug: string; /** The UNIVERSAL ITEM the link minted — what a loadout, a config default or a world names. */ itemId: string | null; response: unknown; }; /** The marketplace listing the publish created. Absent on --keep-personal / --no-marketplace / * --version-of, and when the listing step failed (a warning then carries the retro `distribute` command). */ distribution?: { id: string | null; priceLix: number; }; warnings: string[]; }; /** * The listing price the publish will create, or null for none. Resolved BEFORE any upload so a * contradictory flag set costs nothing. keepPersonal keeps a draft (nothing to list) and versionOf * re-versions an already-listed product, so an explicit listing flag on either is a mistake, not a no-op. */ export declare function resolveListingPriceLix(input: Pick): number | null; export declare function publishItemDef(api: ItemDefPublishApi, input: ItemDefPublishInput): Promise;