@bitmagic/cli 0.1.20 → 0.1.22

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.
@@ -0,0 +1,227 @@
1
+ /**
2
+ * `bitmagic generate vehicle` — design a drivable vehicle and register it as an asset.
3
+ *
4
+ * Three steps, the same shape `generate prop` uses:
5
+ *
6
+ * 1. Ask api-server to design + build the vehicle (`POST /api/cli/v1/assets/vehicle/stream`).
7
+ * The designer LLM and the Asset Forger credentials live there and never reach this machine.
8
+ * 2. Voxelize the GLB in a browser. Only the engine can do this, so the CLI drives its own
9
+ * headless Chrome — the same arrangement `bitmagic forge` and `generate prop` use.
10
+ * 3. Upsert the finished asset into `assets[]`.
11
+ *
12
+ * Where this deliberately differs from `prop`, which upgrades an EXISTING asset in place:
13
+ *
14
+ * - No asset is looked up first, and none is required. A vehicle is a NEW asset; requiring a
15
+ * placeholder to already exist would make the command unusable.
16
+ * - No `fitBox` and no `assetId` are sent. The engine derives the vehicle's physics fitment from
17
+ * the GLB's own `bmVehicle` scene extras and mints the id. Passing a fitBox would rescale the
18
+ * body off its authored ride stance and silently produce wrong physics.
19
+ * - The bake resolution comes from the server frame, not a constant: it is derived from the
20
+ * vehicle's own proportions (a semi tractor and a go-kart do not bake at the same voxel size).
21
+ *
22
+ * The GLB survives a failure in steps 2-3: it is reported in the error so a retry can be pointed at
23
+ * it with `--glb-url` rather than paying for the design twice.
24
+ */
25
+ import { spawn } from 'child_process';
26
+ import { CliError } from '../errors.js';
27
+ import { applyModificationsToWorld } from '../forge/apply-modifications.js';
28
+ import { ForgeBrowserHost, readProjectGameData } from '../forge/browser-host.js';
29
+ import { projectWorldJsonPath } from '../forge/run-pipeline.js';
30
+ import { startUploadProxy } from '../forge/upload-proxy.js';
31
+ import { requestGeneration } from './stream.js';
32
+ import { reserveCorsAllowedPort } from '../local-port.js';
33
+ import { projectBin } from '../project/context.js';
34
+ import { waitForServer } from '../verify/wait-for-server.js';
35
+ /** Voxelizing a dense mesh is minutes of work in the browser, not seconds. */
36
+ const VOXELIZE_TIMEOUT_MS = 10 * 60 * 1000;
37
+ /**
38
+ * A vehicle body is a closed shell around a cabin; baked hollow it reads as a shell the moment the
39
+ * camera clips inside, and every preset is well under the size where a solid fill gets expensive.
40
+ * Matches what the agent lane's vehicle pipeline has always passed.
41
+ */
42
+ const FILL_INTERIOR = true;
43
+ function isRecord(value) {
44
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
45
+ }
46
+ /**
47
+ * Steps 1-3. Everything the caller must resolve first (project, environment, token) is a parameter,
48
+ * so this stays free of CLI output plumbing and of how the token was obtained.
49
+ */
50
+ export async function generateAndInstallVehicle(options) {
51
+ const { context, environment, token, prompt, presetName, name, log } = options;
52
+ if (options.glbUrl !== undefined) {
53
+ if (options.minVoxelSize === undefined) {
54
+ throw new CliError('--glb-url needs --voxel-size too: the bake resolution is derived from the vehicle\'s own '
55
+ + 'proportions during the design step, so it cannot be recovered from the other flags. '
56
+ + 'The failed run printed the exact command to retry with.');
57
+ }
58
+ if (name === undefined) {
59
+ throw new CliError('--glb-url needs --name too, so the asset can be registered under the right name.');
60
+ }
61
+ log(`Reusing the vehicle at ${options.glbUrl} — skipping the design step.`);
62
+ const result = await voxelizeAndInstallVehicle({
63
+ context,
64
+ environment,
65
+ token,
66
+ name,
67
+ glbUrl: options.glbUrl,
68
+ minVoxelSize: options.minVoxelSize,
69
+ // Unlike minVoxelSize this is a fixed LOD ceiling, so a retry can restate it.
70
+ maxVoxelSize: 0.5,
71
+ description: prompt ?? presetName ?? name,
72
+ log,
73
+ });
74
+ return { ...result, glbUrl: options.glbUrl };
75
+ }
76
+ const outcome = await requestGeneration(environment, token, 'vehicle', {
77
+ gameId: context.metadata.gameId,
78
+ ...(prompt !== undefined ? { prompt } : {}),
79
+ ...(presetName !== undefined ? { presetName } : {}),
80
+ ...(name !== undefined ? { name } : {}),
81
+ }, { fetch: options.fetchImpl ?? globalThis.fetch, onProgress: log });
82
+ if (!outcome.success)
83
+ throw new CliError(`${outcome.message} world.json is unchanged.`);
84
+ if (!outcome.glbUrl || !outcome.vehicle) {
85
+ throw new CliError('The generator reported success but returned no vehicle mesh. world.json is unchanged.');
86
+ }
87
+ const glbUrl = outcome.glbUrl;
88
+ const { vehicle } = outcome;
89
+ log(`Vehicle built: ${glbUrl}`);
90
+ for (const note of vehicle.notes)
91
+ log(` note: ${note}`);
92
+ const result = await voxelizeAndInstallVehicle({
93
+ context,
94
+ environment,
95
+ token,
96
+ name: vehicle.name,
97
+ glbUrl,
98
+ minVoxelSize: vehicle.minVoxelSize,
99
+ maxVoxelSize: vehicle.maxVoxelSize,
100
+ description: prompt ?? presetName ?? vehicle.name,
101
+ log,
102
+ });
103
+ return { ...result, glbUrl, notes: [...vehicle.notes, ...result.notes] };
104
+ }
105
+ /** How a failed voxelize tells the caller to retry without paying for the design again. */
106
+ function retryHint(name, glbUrl, minVoxelSize) {
107
+ return `The vehicle mesh is kept — retry the browser step with:\n`
108
+ + ` bitmagic generate vehicle --glb-url ${glbUrl} --voxel-size ${minVoxelSize} --name "${name}"`;
109
+ }
110
+ /**
111
+ * Steps 2 and 3. Split from the command so the browser work is callable directly on a retry that
112
+ * already has a GLB, and so the command file stays about flags and output.
113
+ */
114
+ export async function voxelizeAndInstallVehicle(options) {
115
+ const { context, environment, token, name, glbUrl, minVoxelSize, maxVoxelSize, description, log } = options;
116
+ const worldPath = projectWorldJsonPath(context.root);
117
+ const port = await reserveCorsAllowedPort();
118
+ if (port === null) {
119
+ throw new CliError('No free port between 3000 and 3199, which is the only range the asset CDN serves. '
120
+ + `Stop something in that range and retry.\n${retryHint(name, glbUrl, minVoxelSize)}`);
121
+ }
122
+ const vite = projectBin(context.root, 'vite');
123
+ let server;
124
+ let host;
125
+ let uploadProxy;
126
+ try {
127
+ server = spawn(vite, ['--port', String(port), '--strictPort'], {
128
+ cwd: context.root,
129
+ stdio: ['ignore', 'ignore', 'pipe'],
130
+ });
131
+ let viteStderr = '';
132
+ server.stderr?.on('data', (chunk) => { viteStderr += String(chunk); });
133
+ try {
134
+ await waitForServer(port, 30_000);
135
+ }
136
+ catch {
137
+ throw new CliError(`The project's dev server did not come up on port ${port}, so the vehicle cannot be voxelized.`
138
+ + (viteStderr.trim() ? `\n${viteStderr.trim()}` : '')
139
+ + `\n${retryHint(name, glbUrl, minVoxelSize)}`);
140
+ }
141
+ // The engine uploads the baked .vxl itself, to a presigned URL it asks for at a hardcoded
142
+ // path with no credentials. The proxy translates that into the authenticated api-server route
143
+ // and keeps the token out of the page — see forge/upload-proxy.ts.
144
+ uploadProxy = await startUploadProxy({
145
+ apiUrl: environment.apiUrl,
146
+ token,
147
+ gameId: context.metadata.gameId,
148
+ log,
149
+ });
150
+ host = new ForgeBrowserHost({
151
+ gamePort: port,
152
+ gameId: context.metadata.gameId,
153
+ gameData: readProjectGameData(context.root, context.metadata),
154
+ agentUrl: uploadProxy.url,
155
+ log,
156
+ });
157
+ await host.launch();
158
+ await host.loadGame();
159
+ log(`Voxelizing "${name}" at ${minVoxelSize}m…`);
160
+ const result = await host.transport.sendAndWait({
161
+ type: 'CREATE_ASSET_FROM_GLB_URL',
162
+ requestId: `vehicle-${port}`,
163
+ name,
164
+ glbUrl,
165
+ // No `assetId`: the engine mints one, and no `fitBox`: fitment comes from the GLB's own
166
+ // bmVehicle extras. See this file's header for why both matter.
167
+ options: {
168
+ minVoxelSize,
169
+ maxVoxelSize,
170
+ fillInterior: FILL_INTERIOR,
171
+ placeholder: false,
172
+ },
173
+ }, 'ASSET_FROM_GLB_URL_RESULT', VOXELIZE_TIMEOUT_MS, { maxRetries: 1 });
174
+ if (!result) {
175
+ throw new CliError(`Voxelizing "${name}" timed out.\n${retryHint(name, glbUrl, minVoxelSize)}`);
176
+ }
177
+ if (result.success === false || !isRecord(result.asset)) {
178
+ const reason = typeof result.error === 'string' ? result.error : 'unknown error';
179
+ throw new CliError(`Voxelizing "${name}" failed: ${reason}.\n${retryHint(name, glbUrl, minVoxelSize)}`);
180
+ }
181
+ const engineAsset = result.asset;
182
+ const assetId = typeof engineAsset.id === 'string' ? engineAsset.id : '';
183
+ if (assetId === '') {
184
+ throw new CliError(`The engine registered "${name}" but returned no asset id, so it cannot be written to `
185
+ + `world.json.\n${retryHint(name, glbUrl, minVoxelSize)}`);
186
+ }
187
+ const asset = {
188
+ ...engineAsset,
189
+ description: typeof engineAsset.description === 'string' && engineAsset.description.trim() !== ''
190
+ ? engineAsset.description
191
+ : description,
192
+ };
193
+ const modification = {
194
+ type: 'upsertRoot',
195
+ path: ['assets'],
196
+ predicate: (item) => isRecord(item) && item.id === assetId,
197
+ value: asset,
198
+ };
199
+ applyModificationsToWorld(worldPath, [modification]);
200
+ // No fitment means the asset registered but will not drive. Reported rather than thrown: the
201
+ // asset is real, and the usual cause is a project whose vendored engine predates fitment
202
+ // derivation — which `bitmagic upgrade` fixes without regenerating anything.
203
+ const drivable = isRecord(engineAsset.vehicleFitment);
204
+ const notes = drivable
205
+ ? []
206
+ : ['The engine returned no vehicleFitment, so this asset will not drive. '
207
+ + 'Run `bitmagic upgrade` to update the project\'s vendored engine, then regenerate.'];
208
+ return {
209
+ assetId,
210
+ assetName: name,
211
+ ...(typeof asset.url === 'string' ? { assetUrl: asset.url } : {}),
212
+ drivable,
213
+ notes,
214
+ };
215
+ }
216
+ finally {
217
+ // Ordered: the page first (it may still be mid-upload), then the proxy it was uploading
218
+ // through, then the server underneath both.
219
+ if (host)
220
+ await host.close();
221
+ if (uploadProxy)
222
+ await uploadProxy.close();
223
+ if (server)
224
+ server.kill('SIGTERM');
225
+ }
226
+ }
227
+ //# sourceMappingURL=vehicle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vehicle.js","sourceRoot":"","sources":["../../src/generate/vehicle.ts"],"names":[],"mappings":"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"}
@@ -392,21 +392,25 @@ own output. Read it to find out what the human did — and, for one event, what
392
392
  {"at":"…","event":"hq.requested","assetId":"asset_…","prompt":"…","command":"bitmagic generate prop …"}
393
393
  \`\`\`
394
394
 
395
- A \`moved\`/\`added\`/\`deleted\` line is history: world.json already says so, and the line exists to
396
- tell you WHO changed it and from what. Nothing is expected of you.
395
+ Almost every line is history world.json already says so, and the line exists to tell you WHO
396
+ changed it and from what. Nothing is expected of you.
397
397
 
398
- **\`hq.requested\` is a request.** The human pressed "Generate high-quality version" on a
399
- placeholder asset. The editor cannot generate meshes, so it saved their description onto the asset
400
- and recorded the request with the exact command to run run that command:
398
+ \`hq.started\` / \`hq.completed\` mean the human pressed "Generate high-quality version" and the
399
+ editor ran it: an asset's mesh was regenerated and every placed instance upgraded with it. Read
400
+ these rather than being surprised by an asset that changed on its own. Nothing is expected of you
401
+ here either.
402
+
403
+ **\`hq.requested\` is the one line that asks something of you.** It appears only when the editor
404
+ could NOT run the generation — normally because nobody is logged in. It carries the command:
401
405
 
402
406
  \`\`\`
403
407
  bitmagic generate prop --asset <assetId> --prompt "<prompt>" --json
404
408
  \`\`\`
405
409
 
406
- It generates the mesh, voxelizes it to the asset's recorded \`fitBox\`, and upserts it under the
407
- same asset id, so every placed instance upgrades at once. It **costs sparks**, so run it because
408
- the human asked — do not re-run it on your own initiative, and do not run it twice for the same
409
- request. If it fails after the mesh was generated, the error carries the mesh URL: retry with
410
+ That generates the mesh, voxelizes it to the asset's recorded \`fitBox\`, and upserts it under the
411
+ same asset id, so every placed instance upgrades at once. It **costs sparks**: run it because the
412
+ human asked, not on your own initiative, and never twice for the same request. If it fails after
413
+ the mesh was generated, the error and the JSON result carry the mesh URL retry with
410
414
  \`--glb-url <url>\` to skip the paid step.
411
415
 
412
416
  The file is append-only and never rewritten, so you can re-read it from where you left off.
@@ -484,6 +488,7 @@ bitmagic generate sound --prompt "heavy wooden door slamming" [--duration 3]
484
488
  bitmagic generate image --name hero-portrait --prompt "..." [--width 512] [--height 512]
485
489
  bitmagic generate character --name guard --prompt "..." [--apply-to-player]
486
490
  bitmagic generate animation --description "a slow ceremonial bow" [--length 4] [--loop]
491
+ bitmagic generate vehicle --prompt "a rusty orange pickup" | --preset VAN
487
492
  \`\`\`
488
493
 
489
494
  Run \`bitmagic generate <type> --help\` for the full flags of any one.
@@ -543,12 +548,12 @@ one you can move through.
543
548
  export function renderGenerateSkill() {
544
549
  return `---
545
550
  name: generating-assets
546
- description: Use when this Bitmagic game needs a new skybox, sound effect, image, character or animation — anything that would otherwise require the web editor.
551
+ description: Use when this Bitmagic game needs a new skybox, sound effect, image, character, animation or drivable vehicle — anything that would otherwise require the web editor.
547
552
  ---
548
553
 
549
554
  # Generating game assets
550
555
 
551
- The \`bitmagic\` CLI generates content directly into this project. Five types work today:
556
+ The \`bitmagic\` CLI generates content directly into this project. Six types work today:
552
557
 
553
558
  | Command | Makes | Lands in |
554
559
  |---|---|---|
@@ -557,9 +562,22 @@ The \`bitmagic\` CLI generates content directly into this project. Five types wo
557
562
  | \`bitmagic generate image --name <id> --prompt "..."\` | a 2D image | \`assets[]\` |
558
563
  | \`bitmagic generate character --name <id> --prompt "..."\` | a rigged character | \`assets[]\` |
559
564
  | \`bitmagic generate animation --description "..."\` | an animation clip | \`assets[]\` |
565
+ | \`bitmagic generate vehicle --prompt "..."\` | a drivable vehicle | \`assets[]\` |
560
566
 
561
567
  \`--help\` on any subcommand lists its full flags.
562
568
 
569
+ \`vehicle\` is the one that needs more than a prompt to be useful. It creates a NEW asset (it does
570
+ not upgrade an existing one), it needs Chrome and a free port between 3000 and 3199 because only
571
+ the engine can voxelize, and \`--preset VAN\` builds a standard vehicle without calling the designer
572
+ at all — free, and the right choice when the request does not need a bespoke look. Once it lands,
573
+ spawn it by name:
574
+
575
+ \`\`\`js
576
+ engine.getVehicleSpawner().spawnAndEnterFromAsset({ x: 0, z: 0 }, '<assetName>', playerController);
577
+ \`\`\`
578
+
579
+ Headlights, taillights and beacons are built and lit automatically — never ask for them.
580
+
563
581
  Cover art is the one generation that is **not** a \`generate\` subcommand:
564
582
 
565
583
  | Command | Makes | Lands in |
@@ -1 +1 @@
1
- {"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../src/scaffold/project-files.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../src/scaffold/project-files.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitmagic/cli",
3
- "version": "0.1.20",
3
+ "version": "0.1.22",
4
4
  "description": "Build Bitmagic games from your own agent tool",
5
5
  "type": "module",
6
6
  "bin": {