@bitmagic/cli 0.1.59-dev.1 → 0.1.59-dev.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +148 -2
  2. package/dist/assets/file-kind.d.ts +8 -0
  3. package/dist/assets/file-kind.js +24 -0
  4. package/dist/assets/file-kind.js.map +1 -1
  5. package/dist/assets/materials.d.ts +165 -0
  6. package/dist/assets/materials.js +395 -0
  7. package/dist/assets/materials.js.map +1 -0
  8. package/dist/assets/vxl-summary.js +12 -5
  9. package/dist/assets/vxl-summary.js.map +1 -1
  10. package/dist/cli.d.ts +1 -0
  11. package/dist/cli.js +2 -0
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/assets.d.ts +25 -0
  14. package/dist/commands/assets.js +245 -2
  15. package/dist/commands/assets.js.map +1 -1
  16. package/dist/commands/forge.d.ts +2 -2
  17. package/dist/commands/forge.js +40 -17
  18. package/dist/commands/forge.js.map +1 -1
  19. package/dist/commands/generate.d.ts +29 -0
  20. package/dist/commands/generate.js +139 -3
  21. package/dist/commands/generate.js.map +1 -1
  22. package/dist/commands/theme.d.ts +3 -0
  23. package/dist/commands/theme.js +201 -0
  24. package/dist/commands/theme.js.map +1 -0
  25. package/dist/editor/animation-preview-page.d.ts +6 -0
  26. package/dist/editor/animation-preview-page.js +184 -0
  27. package/dist/editor/animation-preview-page.js.map +1 -0
  28. package/dist/editor/journal.d.ts +25 -0
  29. package/dist/editor/journal.js +8 -0
  30. package/dist/editor/journal.js.map +1 -1
  31. package/dist/editor/motion-panel.d.ts +20 -0
  32. package/dist/editor/motion-panel.js +432 -0
  33. package/dist/editor/motion-panel.js.map +1 -0
  34. package/dist/editor/motion-sink.d.ts +35 -0
  35. package/dist/editor/motion-sink.js +70 -0
  36. package/dist/editor/motion-sink.js.map +1 -0
  37. package/dist/editor/server.js +126 -0
  38. package/dist/editor/server.js.map +1 -1
  39. package/dist/editor/shell-page.js +23 -1
  40. package/dist/editor/shell-page.js.map +1 -1
  41. package/dist/forge/voxelize-session.d.ts +11 -0
  42. package/dist/forge/voxelize-session.js +23 -1
  43. package/dist/forge/voxelize-session.js.map +1 -1
  44. package/dist/generate/animation-from-video.d.ts +52 -0
  45. package/dist/generate/animation-from-video.js +152 -0
  46. package/dist/generate/animation-from-video.js.map +1 -0
  47. package/dist/project/jobs.d.ts +1 -1
  48. package/dist/project/jobs.js.map +1 -1
  49. package/dist/scaffold/project-files.d.ts +1 -0
  50. package/dist/scaffold/project-files.js +76 -2
  51. package/dist/scaffold/project-files.js.map +1 -1
  52. package/dist/scaffold/project.js +2 -1
  53. package/dist/scaffold/project.js.map +1 -1
  54. package/dist/theme/hud-theme-catalog.d.ts +236 -0
  55. package/dist/theme/hud-theme-catalog.js +386 -0
  56. package/dist/theme/hud-theme-catalog.js.map +1 -0
  57. package/dist/theme/theme-color-math.d.ts +21 -0
  58. package/dist/theme/theme-color-math.js +99 -0
  59. package/dist/theme/theme-color-math.js.map +1 -0
  60. package/dist/theme/theme-io.d.ts +49 -0
  61. package/dist/theme/theme-io.js +190 -0
  62. package/dist/theme/theme-io.js.map +1 -0
  63. package/dist/theme/theme-merge.d.ts +36 -0
  64. package/dist/theme/theme-merge.js +81 -0
  65. package/dist/theme/theme-merge.js.map +1 -0
  66. package/dist/theme/theme-report.d.ts +28 -0
  67. package/dist/theme/theme-report.js +142 -0
  68. package/dist/theme/theme-report.js.map +1 -0
  69. package/dist/theme/theme-stored.d.ts +21 -0
  70. package/dist/theme/theme-stored.js +50 -0
  71. package/dist/theme/theme-stored.js.map +1 -0
  72. package/dist/theme/theme-validate.d.ts +41 -0
  73. package/dist/theme/theme-validate.js +406 -0
  74. package/dist/theme/theme-validate.js.map +1 -0
  75. package/dist/verify/classify.js +19 -0
  76. package/dist/verify/classify.js.map +1 -1
  77. package/dist/verify/hud-theme.d.ts +55 -0
  78. package/dist/verify/hud-theme.js +70 -0
  79. package/dist/verify/hud-theme.js.map +1 -0
  80. package/package.json +4 -4
package/README.md CHANGED
@@ -204,6 +204,7 @@ browser reloads itself on every change and the assets panel shows each generatio
204
204
  | `bitmagic generate <skybox\|background\|block-type\|sound\|image\|character\|animation\|model\|prop\|vehicle> ...` | Generate one asset directly into `src/work/world.json`. Costs sparks. `model` mints a **new** 3D object from a prompt, `prop` upgrades an existing placeholder **in place** (both produce voxels directly; `--mesh` takes the older mesh path), `vehicle` adds a new drivable one, `animation` takes a parameter spec rather than a prompt, `block-type` registers a custom voxel block — see below. `skybox` and `background` write the **same** field: pick one. |
205
205
  | `bitmagic assets add <file> [--name <n>] [--asset-id <id>] [--keep-glb] [--voxel-size <m>] [--max-voxel-size <m>] [--height <m>] [--hollow\|--solid] [--force]` | Upload **your own** file — `.glb`, `.vxl`, `.png/.jpg/.webp`, `.opus/.ogg/.m4a/.mp3`, `.json` — into the game's assets and write its entry into `src/work/world.json`. A `.glb` is voxelized in a headless browser (Chrome + a free port in 3000–3199, like `prop`) unless `--keep-glb`. Free — no sparks. See **Adding your own assets** below. |
206
206
  | `bitmagic assets list` | The assets in `world.json`: id, name, type, size, placed instances, and total references. Local, no network. |
207
+ | `bitmagic assets materials <assetId> [--set <file.json>] [--auto] [--clear]` | Show what an asset's voxels look like, or say what they are **made of** — so a sword's steel blade shines and its leather grip does not. With no flag it prints the asset's colour groups; `--set` applies your verdicts; `--auto` lets a model decide (what `generate prop` and `generate model` already do on their own); `--clear` removes them. Free — no sparks, nothing generated. See **Voxel materials** below. |
207
208
  | `bitmagic assets remove <assetId> [--force]` | Remove an asset from `world.json` (the uploaded file stays in storage). Refuses while anything in `world.json` still references it; `--force` removes the asset and its placed instances together. |
208
209
  | `bitmagic cover [--prompt "..."] [--force] [--no-start-screen]` | Generate the game's cover art from `GAME-DESIGN.md`: sets the start screen, saves `.bitmagic/cover.webp`, becomes the publish thumbnail. Costs sparks. |
209
210
  | `bitmagic reference <make\|accept\|show\|clear> ...` | Make a concept image of the game's world, iterate until it is right, and `accept` one — the accepted image becomes the default style reference for `generate skybox\|background\|block-type\|image`, `cover` and `forge`. Only `make` costs sparks (priced like an image). See **Reference image** below. |
@@ -251,6 +252,35 @@ Two things the spec will refuse, both before anything is sent:
251
252
  `playCustomAnimation("mLimpStride01")` resolves. It is not the minted `asset_…` id — pass that
252
253
  as `--asset-id` if you have one.
253
254
 
255
+ ### From a video (`--video`)
256
+
257
+ The one exception to "no text-to-motion service": a clip can be made from a **video of a person
258
+ performing the move**, through Uthana's video-to-motion. The creator supplies the motion by doing
259
+ it, not by describing it, so it sits beside the authored forger rather than replacing it.
260
+
261
+ ```bash
262
+ bitmagic generate animation --video ~/wave.mov --name "Wave"
263
+ bitmagic generate animation --video ~/jog.webm --name "Jog" --slot run --loop
264
+ ```
265
+
266
+ - `.mp4`, `.mov`, `.avi` or `.webm`; **2–60 seconds**; under 200 MB. One person, whole body in
267
+ frame, plain background, good light. Anything else is re-encoded server-side, so a browser's
268
+ WebM recording is as good as a phone's mp4.
269
+ - `--slot idle|walk|run` pins the clip to that locomotion state for the player **and every NPC**
270
+ (persisted as `locomotionState` on the asset — no template code to edit). Omit it for a one-shot
271
+ clip and play it with `playCustomAnimation("<motionId>")`.
272
+ - It costs sparks (15, charged when Uthana accepts the video) and takes minutes: the command
273
+ uploads the file, submits a job, and polls until the clip lands in `src/work/world.json`.
274
+ - `--auto-trim` cuts the "walking to the camera" frames off both ends before Uthana sees the
275
+ clip: pose analysis finds where the person stepped back into frame after pressing record and
276
+ where they came forward to press stop. Use it for clips recorded that way; when the analysis
277
+ is not confident, nothing is trimmed. The result reports what was removed.
278
+ - `--spec`/`--family` cannot be combined with `--video`.
279
+
280
+ `bitmagic dev` has the same flow behind its **Record motion** button — record with the webcam
281
+ (auto-trim is applied to those recordings; picked files are sent as they are) or pick a file,
282
+ name it, choose a slot — and runs it through this command in the sidecar.
283
+
254
284
  ## Environments
255
285
 
256
286
  `--env` accepts `dev`, `prod`, or `local`. Each command resolves its target in this order, most
@@ -586,7 +616,10 @@ reloads. The same cache feeds the editor's right-click **Add object** palette, w
586
616
 
587
617
  **Click a row to look at the asset properly.** A mesh or a voxel asset opens in a viewer you can
588
618
  drag to turn and scroll to zoom, at full detail rather than the coarse version a 46px tile is drawn
589
- from; an image opens as the image; a sound gets a player. Beside it is everything the row has no
619
+ from; an image opens as the image; a sound gets a player; an animation plays on the engine's block
620
+ character — the same clip preview the Creator has — with play/pause and a speed slider. A clip
621
+ generated from a recording also shows its source video, with the auto-trimmed ends marked on a
622
+ seek bar. Beside it is everything the row has no
590
623
  room for — extent in world units, voxel count, triangle count, and the asset id, with a button to
591
624
  copy it so you can paste it into a `bitmagic generate prop --asset …`. Escape closes it. The game
592
625
  pauses while it is open and resumes when you close it.
@@ -696,7 +729,7 @@ What each file becomes:
696
729
  | `.opus .ogg .m4a .mp3` | `audio` | Uploaded as-is. The engine plays all four; the Creator would transcode to `.opus` for a smaller download, and the command prints the `ffmpeg` line that does the same. |
697
730
  | `.json` | `json` | The config-data assets `game/agent-docs/json-assets.md` describes. |
698
731
  | `.gltf` | refused | Its buffers and textures live in files beside it, and the game loads one URL. Export a self-contained `.glb`. |
699
- | `.vox .qb .fbx .spz .ply .sog .mp4` | refused | Each needs a conversion the Creator runs server-side (voxel-model import, FBX animation import, splat transcode, video faststart). Upload those through the Creator's Assets tab. |
732
+ | `.vox .qb .fbx .spz .ply .sog .mp4` | refused | Each needs a conversion the Creator runs server-side (voxel-model import, FBX animation import, splat transcode, video faststart). Upload those through the Creator's Assets tab. | (An `.mp4` you want turned into an **animation** goes to `bitmagic generate animation --video` instead.)
700
733
 
701
734
  The name defaults to the filename without its extension (`--name` overrides). The id is minted as
702
735
  `asset_<timestamp>_<random>` unless `--asset-id` gives one — re-running with the same id **replaces**
@@ -774,6 +807,119 @@ whose vendored engine predates voxel masters takes the mesh path regardless, and
774
807
  If the bake fails after the source exists, the error prints the exact command to retry the browser
775
808
  step **without paying again** — `--master-url …` for voxels, `--glb-url …` for a mesh.
776
809
 
810
+ ## Voxel materials
811
+
812
+ A generated voxel asset carries colours and nothing else, so every voxel shades identically: a
813
+ sword's steel blade responds to light exactly like its leather grip, and both read as flat paint.
814
+ Material classes fix that by saying what each colour is **made of**.
815
+
816
+ **You usually do not have to do anything.** `bitmagic generate prop` and `bitmagic generate model`
817
+ classify the asset right after the bake: a light model reads the same colour table shown below
818
+ together with the asset's prompt, and its verdicts are written into the `.vxl` before the command
819
+ returns (`Materials: metal, leather` in the output; `materials.classifier: "ai"` on the asset's
820
+ `world.json` entry). Pass `--no-materials` to skip it. A classification that cannot run — no model
821
+ credential, an engine too old to write classes — is a note, never a failed generation; the asset is
822
+ baked and matte, and `bitmagic assets materials <id> --auto` retries it later.
823
+
824
+ `bitmagic forge` does the same twice over: the level's own terrain gets classes the designer
825
+ authored per colour ("rock on steep slopes" bakes onto the stone tier), and every archetype
826
+ library asset the forge creates is classified right after the bake, in the same session. A matte
827
+ archetype is always retriable with `bitmagic assets materials <id> --auto`.
828
+
829
+ When the automatic answer is wrong, or for an asset added from a file (which records no prompt, so
830
+ nothing is classified automatically), `bitmagic assets materials` is two steps, and the CLI does not
831
+ guess at the middle one — **you do**, because you are the one who knows what the asset is meant to
832
+ be.
833
+
834
+ ```bash
835
+ bitmagic assets materials sword-01 # what does this asset look like?
836
+ bitmagic assets materials sword-01 --set m.json # here is what those colours are
837
+ bitmagic assets materials sword-01 --auto # or let the model decide again
838
+ ```
839
+
840
+ The first command prints the asset's colour groups:
841
+
842
+ ```
843
+ "Longsword" signature 4f2a91cd (version 1)
844
+
845
+ 20 voxels, 5 palette entries, bbox 1x20x1 voxels
846
+
847
+ id colour share height(min-max) extent(x,y,z) radial shape parts
848
+ g0 #dddddd 70.0% 0.33-0.98 0.00,0.65,0.00 0.00 thin-long 1
849
+ g1 #998866 20.0% 0.03-0.18 0.00,0.15,0.00 0.00 blob 1
850
+ g2 #eecc66 10.0% 0.23-0.28 0.00,0.05,0.00 0.00 blob 1
851
+ ```
852
+
853
+ Read with the asset's own prompt — printed underneath — that is enough to name the materials: g0 is
854
+ the steel blade (most of the model, upper two thirds, long and thin), g1 the leather grip at the
855
+ bottom, g2 a brass pommel between them. `share` is the fraction of the asset, `height` where it
856
+ sits from floor to top, `extent` its size along each axis relative to the whole, `radial` how far
857
+ from the centre axis, and `parts` how many separate pieces the colour forms — a colour scattered
858
+ across the whole model in many parts is dithering, not a material.
859
+
860
+ Then write the verdicts:
861
+
862
+ ```json
863
+ {
864
+ "signatureVersion": 1,
865
+ "signatureHash": "4f2a91cd",
866
+ "verdicts": [
867
+ { "id": "g0", "class": "metal", "confidence": 0.95 },
868
+ { "id": "g1", "class": "leather", "confidence": 0.9 },
869
+ { "id": "g2", "class": "gold", "confidence": 0.6 }
870
+ ]
871
+ }
872
+ ```
873
+
874
+ The `signatureHash` binds the answer to the asset it describes: re-bake or re-voxelize the asset
875
+ and the hash changes, so a stale set of verdicts is refused rather than applied to geometry it
876
+ never saw.
877
+
878
+ **Classes:** `matte` (the default — no special shading), `metal`, `gold`, `chrome`, `gem`, `glass`,
879
+ `wood`, `stone`, `cloth`, `fur`, `leather`, `plastic`, `paint`. The first five reflect the sky; the
880
+ rest get a highlight from the scene's own lights, which keeps their colours exactly as they are.
881
+ `fur` is the odd one out — it reflects nothing, but picks up a soft halo towards its silhouette the
882
+ way a pelt or plush does. Use it for exactly that: a teddy bear, an animal, a fur trim. Anything
883
+ merely soft is `cloth`.
884
+
885
+ The engine also has three classes that EMIT light — `filament`, `neon`, `lava` — which is why you
886
+ may see one in a `.vxl` that this command never wrote. They are not on the list above and must not
887
+ be used here, deliberately: whether a surface is a light is not answerable from its colour, and a
888
+ wrongly glowing surface is worse than a wrongly shiny one because it also lights everything around
889
+ it. They are picked in the voxel editor, where a person selected the voxels and knows. A verdict
890
+ naming one is refused over a quarter of an asset like any precious material, and arrives with no
891
+ glow even when it is accepted.
892
+
893
+ **Rules worth following:**
894
+
895
+ - `matte` is the right answer for most groups, and costs nothing. Leave a group out entirely rather
896
+ than inventing a material for it.
897
+ - The asset's prompt is the strongest evidence there is — it names the materials, and your job is
898
+ only to decide which colour group is which.
899
+ - A material the prompt does **not** name needs strong evidence from the geometry. A precious
900
+ material (`gold`, `gem`, `glass`) claimed over more than a quarter of the asset is refused
901
+ outright unless the prompt says so: a wooden crate is never 40% gem, and a wrongly shiny surface
902
+ is what a player notices.
903
+ - Use a low confidence rather than guessing. Below 0.45 a verdict is dropped, which is a better
904
+ outcome than a surface that shines when it should not.
905
+ - An asset that records no prompt or description has nothing saying what it is. Prefer leaving it
906
+ alone.
907
+
908
+ **Budget.** Four materials per asset. Each one is an extra draw call on every placed instance, so
909
+ over budget the smallest is folded into a related class (`gold` into `metal`, `gem` into `glass`)
910
+ rather than dropped — every fold is reported. Very small groups are dropped too, except for the
911
+ precious classes, where a fraction of a per cent is exactly the point.
912
+
913
+ Materials are written into the `.vxl` under the **same asset id**, so every placed instance changes
914
+ with it. `--clear` puts an asset back to the plain look — it strips the classes and keeps every
915
+ slot's glow, because taking a light away is the one thing this command must never do. A re-bake
916
+ (`bitmagic assets revoxelize`) produces a fresh `.vxl` whose palette the old verdicts no longer
917
+ describe, so it classifies again on its own — `--no-materials` there leaves the re-baked asset
918
+ plain. Nothing here generates anything or costs
919
+ sparks; what it costs is the headless browser bake, since only the engine can read and write a
920
+ `.vxl`. An asset whose base voxels glow (from the older per-colour glow that materials replaced) is
921
+ refused rather than having that glow silently traded for a shine.
922
+
777
923
  ## Drivable vehicles
778
924
 
779
925
  `bitmagic generate vehicle` designs a vehicle and registers it as a **new** asset — unlike
@@ -9,6 +9,14 @@ export interface AssetFileClass {
9
9
  /** Lower-case extension without the dot. */
10
10
  extension: string;
11
11
  }
12
+ /** Extensions `classifyVideoFile` accepts, for help text and the README. */
13
+ export declare const VIDEO_EXTENSIONS: string[];
14
+ export interface VideoFileClass {
15
+ contentType: string;
16
+ /** Lower-case extension without the dot. */
17
+ extension: string;
18
+ }
19
+ export declare function classifyVideoFile(filename: string): VideoFileClass;
12
20
  /** Every extension `classifyAssetFile` accepts, for help text and the README. */
13
21
  export declare const ACCEPTED_EXTENSIONS: string[];
14
22
  /**
@@ -39,6 +39,30 @@ const AUDIO_TYPES = {
39
39
  m4a: 'audio/mp4',
40
40
  mp3: 'audio/mpeg',
41
41
  };
42
+ /**
43
+ * What `bitmagic generate animation --video <file>` takes. Deliberately NOT part of
44
+ * `classifyAssetFile`: an `.mp4` handed to `assets add` is still refused (it would be a video
45
+ * asset needing the Creator's faststart pass), while the same file here is the INPUT to a
46
+ * video-to-motion job — asset-forger re-encodes whatever it gets, so `.webm` from a browser's
47
+ * MediaRecorder is as good as an `.mp4` from a phone.
48
+ */
49
+ const VIDEO_TYPES = {
50
+ mp4: 'video/mp4',
51
+ mov: 'video/quicktime',
52
+ avi: 'video/x-msvideo',
53
+ webm: 'video/webm',
54
+ };
55
+ /** Extensions `classifyVideoFile` accepts, for help text and the README. */
56
+ export const VIDEO_EXTENSIONS = Object.keys(VIDEO_TYPES);
57
+ export function classifyVideoFile(filename) {
58
+ const extension = fileExtension(filename);
59
+ const contentType = VIDEO_TYPES[extension];
60
+ if (contentType === undefined) {
61
+ throw new CliError(`--video takes ${VIDEO_EXTENSIONS.map((e) => `.${e}`).join(', ')}; `
62
+ + `${JSON.stringify(path.basename(filename))} is none of those.`);
63
+ }
64
+ return { contentType, extension };
65
+ }
42
66
  /** Every extension `classifyAssetFile` accepts, for help text and the README. */
43
67
  export const ACCEPTED_EXTENSIONS = ['glb', 'vxl', 'png', 'jpg', 'jpeg', 'webp', 'opus', 'ogg', 'm4a', 'mp3', 'json'];
44
68
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"file-kind.js","sourceRoot":"","sources":["../../src/assets/file-kind.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-kind.js","sourceRoot":"","sources":["../../src/assets/file-kind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ import type { Environment } from '../config/environments.js';
2
+ import { withVoxelizeSession } from '../forge/voxelize-session.js';
3
+ import type { ProjectContext } from '../project/context.js';
4
+ /**
5
+ * Whether this project's vendored engine can answer these messages at all.
6
+ *
7
+ * A capability PROBE, not a version compare, exactly as `engineSupportsVxlMaster`
8
+ * does and for the reason its own doc gives: an engine with no handler never
9
+ * replies, so the request would stall for the full ten-minute bake timeout and
10
+ * then report a timeout, with nothing pointing at the real cause.
11
+ */
12
+ export declare function engineSupportsMaterialClasses(projectRoot: string): boolean;
13
+ /** One colour group of an asset, as the engine described it. */
14
+ export interface MaterialGroup {
15
+ id: string;
16
+ hex: string;
17
+ share: number;
18
+ shape: string;
19
+ }
20
+ /** What the engine reports about an asset's materials. */
21
+ export interface MaterialSignatureReply {
22
+ version: number;
23
+ hash: string;
24
+ voxelCount: number;
25
+ paletteSize: number;
26
+ groups: MaterialGroup[];
27
+ existingSlots: string[];
28
+ }
29
+ /** A single group's verdict, as written into a `--set` file. */
30
+ export interface MaterialVerdictInput {
31
+ id: string;
32
+ class: string;
33
+ confidence: number;
34
+ }
35
+ export interface MaterialsBaseOptions {
36
+ context: ProjectContext;
37
+ environment: Environment;
38
+ token: string;
39
+ assetId: string;
40
+ log: (message: string) => void;
41
+ fetchImpl?: typeof globalThis.fetch;
42
+ /** Injected in tests so the lane runs without Chrome. */
43
+ session?: typeof withVoxelizeSession;
44
+ }
45
+ export interface ReadMaterialsResult {
46
+ assetId: string;
47
+ assetName: string;
48
+ signature: MaterialSignatureReply;
49
+ /** The engine's own rendering of the signature — printed verbatim. */
50
+ table: string;
51
+ /** The asset's generation prompt or description, when it records one. */
52
+ promptText?: string;
53
+ }
54
+ /**
55
+ * The asset to work on, refused before the browser starts if it cannot be.
56
+ *
57
+ * Only a `vxl` asset has voxels to classify. A GLB kept as a mesh, an image, a
58
+ * sound: none of them have a palette, and saying so up front costs nothing while
59
+ * a browser launch costs seconds.
60
+ */
61
+ export declare function findVoxelAsset(world: Record<string, unknown>, assetId: string): {
62
+ asset: Record<string, unknown>;
63
+ url: string;
64
+ name: string;
65
+ };
66
+ /**
67
+ * The text this asset was generated from, if it records any.
68
+ *
69
+ * The single most valuable signal a classifier has — it names the materials
70
+ * outright — and also what the plausibility guard checks a precious-material
71
+ * claim against. Absent for an asset added from a file, which is exactly the case
72
+ * where classifying on colour alone would be guessing.
73
+ */
74
+ export declare function assetPromptText(asset: Record<string, unknown>): string | undefined;
75
+ /**
76
+ * Ask the engine what the asset is made of.
77
+ *
78
+ * Reads only — no upload, no world.json write, nothing spent. Safe to run as often
79
+ * as you like, which matters because it is the step an agent runs first.
80
+ */
81
+ export declare function readAssetMaterials(options: MaterialsBaseOptions): Promise<ReadMaterialsResult>;
82
+ export interface SetMaterialsOptions extends MaterialsBaseOptions {
83
+ /** The verdicts to apply, and the signature hash they were computed against. */
84
+ signatureVersion: number;
85
+ signatureHash: string;
86
+ verdicts: MaterialVerdictInput[];
87
+ }
88
+ export interface ClearMaterialsOptions extends MaterialsBaseOptions {
89
+ clear: true;
90
+ }
91
+ export interface SetMaterialsResult {
92
+ assetId: string;
93
+ assetName: string;
94
+ /** The material classes now on the asset. Empty after a --clear. */
95
+ slots: string[];
96
+ /** Classes that lost a share floor, the slot budget, or the plausibility guard. */
97
+ dropped: Array<{
98
+ class: string;
99
+ reason: string;
100
+ share: number;
101
+ }>;
102
+ /** Fraction of the asset left with the default look. */
103
+ baseShare: number;
104
+ /** True when nothing changed, so no upload and no world.json write happened. */
105
+ unchanged: boolean;
106
+ assetUrl?: string;
107
+ instanceCount: number;
108
+ }
109
+ /**
110
+ * Apply an assignment — or strip every class with `--clear` — and record the
111
+ * result in world.json.
112
+ *
113
+ * The engine hands back BYTES rather than uploading, the same split
114
+ * `REVOXELIZE_FROM_VXL_MASTER` uses: in a pro project the CLI owns world.json,
115
+ * and two writers on one asset thrash the reload watcher.
116
+ */
117
+ export declare function setAssetMaterials(options: SetMaterialsOptions | ClearMaterialsOptions): Promise<SetMaterialsResult>;
118
+ /** What api-server answers `POST /api/cli/v1/assets/materials/classify` with. */
119
+ export interface ClassifyReply {
120
+ signatureHash?: unknown;
121
+ verdicts?: unknown;
122
+ model?: unknown;
123
+ }
124
+ /** The model step, injectable so the lane is testable without api-server. */
125
+ export type ClassifyMaterials = (request: {
126
+ gameId: string;
127
+ assetName: string;
128
+ table: string;
129
+ signatureHash: string;
130
+ promptText?: string;
131
+ }) => Promise<ClassifyReply>;
132
+ export interface ClassifyMaterialsOptions extends MaterialsBaseOptions {
133
+ /** Test seam; the default posts to api-server. */
134
+ classify?: ClassifyMaterials;
135
+ }
136
+ export interface ClassifyMaterialsResult extends SetMaterialsResult {
137
+ /** The model that answered, for provenance. Absent when no verdicts came back. */
138
+ model?: string;
139
+ }
140
+ /**
141
+ * Read, classify and apply in ONE browser session: what `generate prop|model` run
142
+ * on the asset they just baked, and what `assets materials --auto` runs on demand.
143
+ *
144
+ * The middle step is api-server's light model rather than the creator's coding
145
+ * agent — the same prompt that agent would be shown, answered without a round
146
+ * trip through it, so a generated sword shines before anyone has looked at it.
147
+ * `assets materials --set` still overrides whatever this decided.
148
+ *
149
+ * An empty verdict list skips the APPLY entirely: the engine would leave the
150
+ * file byte-identical anyway, and not asking is one fewer thing to time out.
151
+ */
152
+ export declare function classifyAssetMaterials(options: ClassifyMaterialsOptions): Promise<ClassifyMaterialsResult>;
153
+ /**
154
+ * The tail of `generate prop|model` and `assets revoxelize`: classify the asset
155
+ * just baked, and say what happened.
156
+ *
157
+ * **Never throws.** The asset is baked, uploaded and in world.json by the time
158
+ * this runs, and a generation is paid for; a classification that fails —
159
+ * api-server without a model credential, a browser that would not come up a
160
+ * second time, a vendored engine too old to write classes — costs a note, never
161
+ * the asset. `bitmagic assets materials <id> --auto` re-runs it on demand.
162
+ */
163
+ export declare function classifyAssetMaterialsQuietly(options: ClassifyMaterialsOptions): Promise<{
164
+ slots: string[];
165
+ } | null>;