import { type CommandRunDeps } from './run-deps.js'; import { type AddAssetResult } from '../assets/add.js'; import type { VoxelizeGlb } from '../assets/voxelize-glb.js'; import { type AssetRow } from '../assets/list.js'; import { type RevoxelizeResult } from '../assets/revoxelize.js'; import { type MaterialVerdictInput } from '../assets/materials.js'; /** The Creator's voxelize-dialog defaults (assetsVoxelizeDialog.ts), so a plain `add` bakes the same way. */ export declare const DEFAULT_MIN_VOXEL_SIZE = 0.1; export declare const DEFAULT_MAX_VOXEL_SIZE = 0.5; export interface AssetsRunDeps extends CommandRunDeps { /** Test-only override for the headless bake, so the lane runs without Chrome. */ voxelize?: VoxelizeGlb; } /** * Whether to fill the model's interior with voxels. * * `--hollow` and `--solid` are explicit; otherwise this mirrors `generate prop`'s size rule * (`shouldFillInterior`), which the web lane has always applied: prop-scale objects fill solid so * nothing reads as a shell when the camera clips inside, while building-scale ones stay hollow * because a solid-filled building is millions of wasted voxels. `assets add` has no `fitBox`, so * the only size it knows is `--height` — enough to catch the case that actually hurts. */ export declare const SOLID_FILL_MAX_HEIGHT_M = 6; export interface AddOptions { file: string; name?: string; assetId?: string; /** `--keep-glb`: register a .glb as a mesh. Also the default in a low-poly project. */ keepGlb: boolean; /** `--voxelize`: bake a .glb even in a low-poly project. Contradicts `--keep-glb`. */ voxelize?: boolean; force: boolean; voxelSize?: string; maxVoxelSize?: string; height?: string; hollow: boolean; solid: boolean; json: boolean; deps?: AssetsRunDeps; } export declare function runAssetsAdd(options: AddOptions): Promise; export declare function runAssetsList(options: { json: boolean; deps?: AssetsRunDeps; }): Promise; export interface RemoveOptions { assetId: string; force: boolean; json: boolean; deps?: AssetsRunDeps; } export interface RemoveResult { assetId: string; name: string; /** Placed instances removed alongside the asset (only ever non-zero under --force). */ instancesRemoved: number; /** References that remain, by path — under --force only. */ remainingReferences: string[]; } export declare function runAssetsRemove(options: RemoveOptions): Promise; export interface RevoxelizeOptions { assetId: string; voxelSize?: string; maxVoxelSize?: string; height?: string; hollow?: boolean; solid?: boolean; /** `--no-materials`: leave the re-baked asset matte rather than classifying it again. */ materials?: boolean; json: boolean; deps?: AssetsRunDeps; } /** * `bitmagic assets revoxelize` — re-bake an existing asset at a different voxel size. * * No generation, so nothing is billed: it re-reads whichever source the asset already records. * See assets/revoxelize.ts for which source that is and why the choice is the asset's to answer. */ export declare function runAssetsRevoxelize(options: RevoxelizeOptions): Promise; export declare function runAssetsMaterials(options: { assetId: string; set?: string; clear?: boolean; /** `--auto`: let api-server's light model write the verdicts. */ auto?: boolean; json?: boolean; /** Test-only, matching the other subcommands' seam. */ deps?: AssetsRunDeps; }): Promise; /** * Read and validate a `--set` file. * * Validated here rather than in the engine so a malformed answer costs nothing: a * browser launch is seconds, and a typo in a class name should be a message, not a * timeout. */ export declare function readAssignmentFile(filePath: string): { signatureVersion: number; signatureHash: string; verdicts: MaterialVerdictInput[]; }; export declare const assetsCommand: import("citty").CommandDef;