@bitmagic/cli 0.1.1 → 0.1.2
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.
- package/dist/cli.d.ts +30 -0
- package/dist/cli.js +23 -11
- package/dist/cli.js.map +1 -1
- package/dist/commands/forge.d.ts +107 -0
- package/dist/commands/forge.js +393 -0
- package/dist/commands/forge.js.map +1 -0
- package/dist/commands/generate.js +58 -45
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/verify.js +16 -16
- package/dist/commands/verify.js.map +1 -1
- package/dist/forge/apply-modifications.d.ts +19 -0
- package/dist/forge/apply-modifications.js +184 -0
- package/dist/forge/apply-modifications.js.map +1 -0
- package/dist/forge/bake-progress.d.ts +44 -0
- package/dist/forge/bake-progress.js +77 -0
- package/dist/forge/bake-progress.js.map +1 -0
- package/dist/forge/browser-host.d.ts +100 -0
- package/dist/forge/browser-host.js +351 -0
- package/dist/forge/browser-host.js.map +1 -0
- package/dist/forge/local-store.d.ts +30 -0
- package/dist/forge/local-store.js +130 -0
- package/dist/forge/local-store.js.map +1 -0
- package/dist/forge/run-pipeline.d.ts +105 -0
- package/dist/forge/run-pipeline.js +269 -0
- package/dist/forge/run-pipeline.js.map +1 -0
- package/dist/forge/stream.d.ts +106 -0
- package/dist/forge/stream.js +286 -0
- package/dist/forge/stream.js.map +1 -0
- package/dist/forge/transport.d.ts +58 -0
- package/dist/forge/transport.js +145 -0
- package/dist/forge/transport.js.map +1 -0
- package/dist/forge/upload-proxy.d.ts +21 -0
- package/dist/forge/upload-proxy.js +134 -0
- package/dist/forge/upload-proxy.js.map +1 -0
- package/dist/generate/stream.d.ts +1 -10
- package/dist/generate/stream.js +5 -62
- package/dist/generate/stream.js.map +1 -1
- package/dist/http/sse.d.ts +40 -0
- package/dist/http/sse.js +98 -0
- package/dist/http/sse.js.map +1 -0
- package/dist/local-port.d.ts +30 -0
- package/dist/local-port.js +53 -0
- package/dist/local-port.js.map +1 -0
- package/dist/scaffold/project-files.js +89 -9
- package/dist/scaffold/project-files.js.map +1 -1
- package/package.json +4 -3
|
@@ -26,55 +26,65 @@ function parseNumberFlag(flagName, raw, options = {}) {
|
|
|
26
26
|
}
|
|
27
27
|
return value;
|
|
28
28
|
}
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Body builders
|
|
31
|
+
//
|
|
32
|
+
// Each of these maps parsed CLI flags onto exactly the field names its generator's zod schema
|
|
33
|
+
// (shared/asset-core/src/generators/*.ts) expects. A flag the creator did not pass is OMITTED
|
|
34
|
+
// from the returned object entirely — never sent as `undefined`, never sent as a restated default
|
|
35
|
+
// — so the generator's own defaults (width 512, cfgScale 6.0, footIk true, ...) stay the single
|
|
36
|
+
// source of truth. Kept as pure functions, independent of citty's parsed-arg shape, so flag
|
|
37
|
+
// mapping is testable without constructing a CommandContext or touching the network.
|
|
38
|
+
// ============================================================================
|
|
39
|
+
/**
|
|
40
|
+
* Drops the keys an absent flag left `undefined`, which is what makes the omission contract above
|
|
41
|
+
* hold. Only `undefined` is dropped: `false` and `0` are things a creator can ask for deliberately
|
|
42
|
+
* (`--no-apply-to-player`, `--seed 0`) and must reach the generator verbatim.
|
|
43
|
+
*/
|
|
44
|
+
function withoutAbsentFlags(fields) {
|
|
45
|
+
return Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== undefined));
|
|
46
|
+
}
|
|
29
47
|
export function buildSkyboxBody(args) {
|
|
30
|
-
return {
|
|
48
|
+
return withoutAbsentFlags({
|
|
31
49
|
description: args.description,
|
|
32
|
-
|
|
33
|
-
};
|
|
50
|
+
referenceImageUrl: args.referenceImageUrl,
|
|
51
|
+
});
|
|
34
52
|
}
|
|
35
53
|
export function buildSoundBody(args) {
|
|
36
|
-
|
|
37
|
-
const promptInfluence = parseNumberFlag('prompt-influence', args.promptInfluence, { min: 0, max: 1 });
|
|
38
|
-
return {
|
|
54
|
+
return withoutAbsentFlags({
|
|
39
55
|
prompt: args.prompt,
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
};
|
|
56
|
+
durationSeconds: parseNumberFlag('duration', args.duration, { min: 0.5, max: 22 }),
|
|
57
|
+
promptInfluence: parseNumberFlag('prompt-influence', args.promptInfluence, { min: 0, max: 1 }),
|
|
58
|
+
loop: args.loop,
|
|
59
|
+
});
|
|
44
60
|
}
|
|
45
61
|
export function buildImageBody(args) {
|
|
46
|
-
|
|
47
|
-
const height = parseNumberFlag('height', args.height, { min: 1, integer: true });
|
|
48
|
-
return {
|
|
62
|
+
return withoutAbsentFlags({
|
|
49
63
|
name: args.name,
|
|
50
64
|
prompt: args.prompt,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
};
|
|
65
|
+
width: parseNumberFlag('width', args.width, { min: 1, integer: true }),
|
|
66
|
+
height: parseNumberFlag('height', args.height, { min: 1, integer: true }),
|
|
67
|
+
referenceImageUrl: args.referenceImageUrl,
|
|
68
|
+
});
|
|
55
69
|
}
|
|
56
70
|
export function buildCharacterBody(args) {
|
|
57
|
-
|
|
58
|
-
return {
|
|
71
|
+
return withoutAbsentFlags({
|
|
59
72
|
name: args.name,
|
|
60
73
|
prompt: args.prompt,
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
};
|
|
74
|
+
applyToPlayer: args.applyToPlayer,
|
|
75
|
+
headScale: parseNumberFlag('head-scale', args.headScale, { min: 50, max: 300 }),
|
|
76
|
+
});
|
|
64
77
|
}
|
|
65
78
|
export function buildAnimationBody(args) {
|
|
66
|
-
|
|
67
|
-
const cfgScale = parseNumberFlag('cfg-scale', args.cfgScale);
|
|
68
|
-
const seed = parseNumberFlag('seed', args.seed);
|
|
69
|
-
return {
|
|
79
|
+
return withoutAbsentFlags({
|
|
70
80
|
description: args.description,
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
};
|
|
81
|
+
length: parseNumberFlag('length', args.length),
|
|
82
|
+
cfgScale: parseNumberFlag('cfg-scale', args.cfgScale),
|
|
83
|
+
seed: parseNumberFlag('seed', args.seed),
|
|
84
|
+
footIk: args.footIk,
|
|
85
|
+
inPlace: args.inPlace,
|
|
86
|
+
loop: args.loop,
|
|
87
|
+
});
|
|
78
88
|
}
|
|
79
89
|
function defaultDeps() {
|
|
80
90
|
return {
|
|
@@ -83,6 +93,15 @@ function defaultDeps() {
|
|
|
83
93
|
log: (message) => console.log(message),
|
|
84
94
|
};
|
|
85
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* The error to rethrow from one of `runAssetGeneration`'s two failure spans, which differ only in
|
|
98
|
+
* wording: a CliError gets `decorate` applied to its message, while anything else is a genuine bug
|
|
99
|
+
* rather than a condition we designed a message for and passes through untouched, for cli.ts to
|
|
100
|
+
* hand to citty's default (stack-trace) handling.
|
|
101
|
+
*/
|
|
102
|
+
function decoratedError(error, decorate) {
|
|
103
|
+
return error instanceof CliError ? new CliError(decorate(error.message)) : error;
|
|
104
|
+
}
|
|
86
105
|
/**
|
|
87
106
|
* Everything up to and including the network round-trip: resolves the project, the world.json
|
|
88
107
|
* path, and an access token, then calls the generator. Split out from `runAssetGeneration` so
|
|
@@ -119,17 +138,14 @@ async function requestAssetGeneration(type, body, deps) {
|
|
|
119
138
|
* this generation, so the message says the asset was NOT lost, only not yet applied.
|
|
120
139
|
*/
|
|
121
140
|
export async function runAssetGeneration(type, label, body, deps = defaultDeps()) {
|
|
122
|
-
let
|
|
141
|
+
let request;
|
|
123
142
|
try {
|
|
124
|
-
|
|
143
|
+
request = await requestAssetGeneration(type, body, deps);
|
|
125
144
|
}
|
|
126
145
|
catch (error) {
|
|
127
|
-
|
|
128
|
-
throw new CliError(`${error.message} world.json is unchanged.`);
|
|
129
|
-
}
|
|
130
|
-
throw error;
|
|
146
|
+
throw decoratedError(error, (message) => `${message} world.json is unchanged.`);
|
|
131
147
|
}
|
|
132
|
-
const { outcome, worldPath } =
|
|
148
|
+
const { outcome, worldPath } = request;
|
|
133
149
|
if (!outcome.success) {
|
|
134
150
|
throw new CliError(`${outcome.message} world.json is unchanged.`);
|
|
135
151
|
}
|
|
@@ -138,11 +154,8 @@ export async function runAssetGeneration(type, label, body, deps = defaultDeps()
|
|
|
138
154
|
applyResult = applyPatchesToWorld(worldPath, outcome.patches);
|
|
139
155
|
}
|
|
140
156
|
catch (error) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
'world.json is unchanged — the asset was generated (and may have been billed) but is not yet in your project.');
|
|
144
|
-
}
|
|
145
|
-
throw error;
|
|
157
|
+
throw decoratedError(error, (message) => `Generated ${label} successfully, but could not write it into world.json: ${message} ` +
|
|
158
|
+
'world.json is unchanged — the asset was generated (and may have been billed) but is not yet in your project.');
|
|
146
159
|
}
|
|
147
160
|
deps.log(`Generated ${label}: ${outcome.message}`);
|
|
148
161
|
for (const line of applyResult.summary) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/verify.js
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
import { defineCommand } from 'citty';
|
|
2
2
|
import * as fs from 'fs';
|
|
3
|
-
import * as net from 'net';
|
|
4
3
|
import * as path from 'path';
|
|
5
4
|
import { spawn, spawnSync } from 'child_process';
|
|
6
5
|
import { CliError } from '../errors.js';
|
|
7
6
|
import { loadProjectContext, projectBin } from '../project/context.js';
|
|
7
|
+
import { reserveCorsAllowedPort, CORS_ALLOWED_PORT_MIN, CORS_ALLOWED_PORT_MAX } from '../local-port.js';
|
|
8
8
|
import { runHeadlessCheck } from '../verify/browser.js';
|
|
9
9
|
import { classifyVerifyRun } from '../verify/classify.js';
|
|
10
10
|
import { waitForServer } from '../verify/wait-for-server.js';
|
|
11
11
|
const DEFAULT_SETTLE_MS = 15_000;
|
|
12
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* A free port INSIDE the CORS-allowed window, never an OS-assigned ephemeral one.
|
|
14
|
+
*
|
|
15
|
+
* This matters more here than anywhere: verify drives an ORDINARY browser, so an out-of-window
|
|
16
|
+
* origin means the CDN refuses the game's forged `.vwld`, the engine builds an empty voxel world,
|
|
17
|
+
* and verify then reports a game that loads and renders while the player falls through the floor
|
|
18
|
+
* forever. Verify's whole job is to answer "did this break", so it must not be the thing breaking
|
|
19
|
+
* it. See local-port.ts.
|
|
20
|
+
*/
|
|
13
21
|
async function freePort() {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
server.close();
|
|
21
|
-
reject(new CliError('Could not reserve a local port for the dev server.'));
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
const { port } = address;
|
|
25
|
-
server.close(() => resolve(port));
|
|
26
|
-
});
|
|
27
|
-
});
|
|
22
|
+
const port = await reserveCorsAllowedPort();
|
|
23
|
+
if (port === null) {
|
|
24
|
+
throw new CliError(`No free port between ${CORS_ALLOWED_PORT_MIN} and ${CORS_ALLOWED_PORT_MAX}, which is the `
|
|
25
|
+
+ 'range the asset CDN allows as an origin. Stop whatever is holding them and verify again.');
|
|
26
|
+
}
|
|
27
|
+
return port;
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* Rejects if `child` exits (non-signal, non-zero) or errors before `waitForServer` resolves, so
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { WorldJsonModification } from '@bitmagic/world-forger/pipeline/index.js';
|
|
2
|
+
export interface ApplyModificationsOutcome {
|
|
3
|
+
applied: number;
|
|
4
|
+
/** One human-readable line per modification, for the command to print. */
|
|
5
|
+
summary: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Read world.json, apply every modification in order, write once.
|
|
9
|
+
*
|
|
10
|
+
* ORDER IS THE CONTRACT: `placeAndPersistLevel` returns the starter-scatter removals ahead of the
|
|
11
|
+
* level's own upserts, and applying them in any other order changes the result.
|
|
12
|
+
*
|
|
13
|
+
* Atomicity: nothing is written until every modification has been applied to the in-memory
|
|
14
|
+
* document, and the write itself goes through a temp file in the same directory then a rename, so
|
|
15
|
+
* a crash mid-command leaves world.json either wholly old or wholly new. A half-written world is
|
|
16
|
+
* worse than an unchanged one — the creator has no way to tell which half landed, and a forge is
|
|
17
|
+
* expensive enough that "run it again" is not an acceptable recovery.
|
|
18
|
+
*/
|
|
19
|
+
export declare function applyModificationsToWorld(worldPath: string, modifications: WorldJsonModification[]): ApplyModificationsOutcome;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apply a `WorldJsonModification[]` batch to the project's world.json, in one
|
|
3
|
+
* read-apply-write-once pass.
|
|
4
|
+
*
|
|
5
|
+
* ── Why NOT `generate/apply-patches.ts` ───────────────────────────────────────────────────
|
|
6
|
+
*
|
|
7
|
+
* That module applies `WorldPatch[]` (`@bitmagic/asset-core`), which is a deliberately
|
|
8
|
+
* SERIALIZABLE format: `set | push | setRoot | pushRoot | upsertRoot`, where the upsert names its
|
|
9
|
+
* match fields as `matchKeys: string[]` precisely so a predicate never has to cross a wire.
|
|
10
|
+
*
|
|
11
|
+
* Step 5 returns `WorldJsonModification[]`, which is a strictly larger in-process format: it adds
|
|
12
|
+
* `remove`/`removeRoot` and `update`/`updateRoot`, and every one of its predicates is an actual
|
|
13
|
+
* `(item: unknown) => boolean` FUNCTION. `placeAndPersistLevel` emits exactly such functions —
|
|
14
|
+
* the starter-scatter `removeRoot`s close over a `Set` of ids, and the persist plan's
|
|
15
|
+
* `upsertRoot`s carry closures — so converting to `WorldPatch[]` is not a reshape, it is a
|
|
16
|
+
* lossy one: `removeRoot` has no `WorldPatch` counterpart at all, and a closure cannot be
|
|
17
|
+
* reduced to `matchKeys` in general. Forcing the conversion would silently drop the removals.
|
|
18
|
+
*
|
|
19
|
+
* The modifications never cross a process boundary in this lane (step 5 runs in *this* process,
|
|
20
|
+
* which is the whole point of the transport seam), so keeping the richer format and applying it
|
|
21
|
+
* here is the correct direction. The semantics below mirror `applyModification` in
|
|
22
|
+
* game-play-agent's `utils/world-json-editor.ts` case for case — that is the reference
|
|
23
|
+
* implementation both lanes' persist plans were written against, and the two must not drift.
|
|
24
|
+
*
|
|
25
|
+
* ── One place they DO differ today ────────────────────────────────────────────────────────
|
|
26
|
+
*
|
|
27
|
+
* The web lane re-validates the document against the engine's `GameData` schema AFTER applying
|
|
28
|
+
* and refuses a write that introduces a NEW violation (`world-json-editor.ts:361,371`, baseline-
|
|
29
|
+
* diff so legacy games still accept unrelated writes). This applier has no such gate: it checks
|
|
30
|
+
* the document it READ and writes atomically, but does not check the result. Tracked in issue
|
|
31
|
+
* #819 — it needs the validator lifted somewhere the CLI can reach.
|
|
32
|
+
*/
|
|
33
|
+
import * as fs from 'fs';
|
|
34
|
+
import * as path from 'path';
|
|
35
|
+
import { CliError } from '../errors.js';
|
|
36
|
+
function isJsonObject(value) {
|
|
37
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
38
|
+
}
|
|
39
|
+
/** Walks `path`, creating intermediate objects, and returns the container of the final key. */
|
|
40
|
+
function getOrCreatePath(root, segments) {
|
|
41
|
+
let current = root;
|
|
42
|
+
for (const segment of segments.slice(0, -1)) {
|
|
43
|
+
const next = current[segment];
|
|
44
|
+
if (!isJsonObject(next)) {
|
|
45
|
+
current[segment] = {};
|
|
46
|
+
}
|
|
47
|
+
current = current[segment];
|
|
48
|
+
}
|
|
49
|
+
return current;
|
|
50
|
+
}
|
|
51
|
+
function ensureArray(parent, key) {
|
|
52
|
+
if (!Array.isArray(parent[key])) {
|
|
53
|
+
parent[key] = [];
|
|
54
|
+
}
|
|
55
|
+
return parent[key];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Apply one modification in place, returning the path it touched for the summary line.
|
|
59
|
+
*
|
|
60
|
+
* `*Root` types address the document root; the rest address paths inside `worldProfileData`.
|
|
61
|
+
* Writing a `set` at the root instead would put it where the engine never looks, which reads as
|
|
62
|
+
* success — the same trap `generate/apply-patches.ts` documents for `WorldPatch`.
|
|
63
|
+
*/
|
|
64
|
+
function applyOne(world, modification) {
|
|
65
|
+
const isRoot = modification.type.endsWith('Root');
|
|
66
|
+
let target;
|
|
67
|
+
let prefix;
|
|
68
|
+
if (isRoot) {
|
|
69
|
+
target = world;
|
|
70
|
+
prefix = '';
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
if (!isJsonObject(world.worldProfileData)) {
|
|
74
|
+
world.worldProfileData = {};
|
|
75
|
+
}
|
|
76
|
+
target = world.worldProfileData;
|
|
77
|
+
prefix = 'worldProfileData.';
|
|
78
|
+
}
|
|
79
|
+
const segments = modification.path;
|
|
80
|
+
const lastKey = segments[segments.length - 1];
|
|
81
|
+
if (lastKey === undefined) {
|
|
82
|
+
throw new CliError('The forge returned a world.json modification with an empty path.');
|
|
83
|
+
}
|
|
84
|
+
const parent = getOrCreatePath(target, segments);
|
|
85
|
+
const where = `${prefix}${segments.join('.')}`;
|
|
86
|
+
// Switched on `type` itself, not on a `Root`-stripped copy of it: `type` is the union's
|
|
87
|
+
// discriminant, so combining the root and non-root cases narrows `modification` to exactly the
|
|
88
|
+
// two members that share those fields. Stripping the suffix into a local first (which reads
|
|
89
|
+
// more neatly) defeats the narrowing entirely and forces a cast per branch — which would then
|
|
90
|
+
// be the only thing standing between a renamed field and a silently wrong write.
|
|
91
|
+
switch (modification.type) {
|
|
92
|
+
case 'set':
|
|
93
|
+
case 'setRoot':
|
|
94
|
+
parent[lastKey] = modification.value;
|
|
95
|
+
return `set ${where}`;
|
|
96
|
+
case 'push':
|
|
97
|
+
case 'pushRoot':
|
|
98
|
+
ensureArray(parent, lastKey).push(modification.value);
|
|
99
|
+
return `added to ${where}`;
|
|
100
|
+
case 'update':
|
|
101
|
+
case 'updateRoot': {
|
|
102
|
+
const { predicate, value } = modification;
|
|
103
|
+
const array = parent[lastKey];
|
|
104
|
+
if (!Array.isArray(array))
|
|
105
|
+
return `skipped ${where} (not an array)`;
|
|
106
|
+
const index = array.findIndex(predicate);
|
|
107
|
+
if (index === -1)
|
|
108
|
+
return `no match to update in ${where}`;
|
|
109
|
+
array[index] = typeof value === 'function'
|
|
110
|
+
? value(array[index])
|
|
111
|
+
: value;
|
|
112
|
+
return `updated ${where}[${index}]`;
|
|
113
|
+
}
|
|
114
|
+
case 'remove':
|
|
115
|
+
case 'removeRoot': {
|
|
116
|
+
const { predicate } = modification;
|
|
117
|
+
const array = parent[lastKey];
|
|
118
|
+
if (!Array.isArray(array))
|
|
119
|
+
return `skipped ${where} (not an array)`;
|
|
120
|
+
const kept = array.filter((item) => !predicate(item));
|
|
121
|
+
const removed = array.length - kept.length;
|
|
122
|
+
parent[lastKey] = kept;
|
|
123
|
+
return `removed ${removed} from ${where}`;
|
|
124
|
+
}
|
|
125
|
+
case 'upsert':
|
|
126
|
+
case 'upsertRoot': {
|
|
127
|
+
const { predicate, value } = modification;
|
|
128
|
+
const array = ensureArray(parent, lastKey);
|
|
129
|
+
const index = array.findIndex(predicate);
|
|
130
|
+
if (index === -1) {
|
|
131
|
+
array.push(value);
|
|
132
|
+
return `added to ${where}`;
|
|
133
|
+
}
|
|
134
|
+
array[index] = value;
|
|
135
|
+
return `updated ${where}[${index}]`;
|
|
136
|
+
}
|
|
137
|
+
default: {
|
|
138
|
+
// Not a degradation to swallow: an unknown type means this applier and the shared package's
|
|
139
|
+
// modification union have drifted, and continuing would write a partial level. Typed as
|
|
140
|
+
// `never` so a member ADDED to the union fails the build here rather than at runtime, in
|
|
141
|
+
// the middle of a paid forge.
|
|
142
|
+
const unhandled = modification;
|
|
143
|
+
throw new CliError('The forge returned a world.json modification this CLI cannot apply: '
|
|
144
|
+
+ `"${unhandled.type}".`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Read world.json, apply every modification in order, write once.
|
|
150
|
+
*
|
|
151
|
+
* ORDER IS THE CONTRACT: `placeAndPersistLevel` returns the starter-scatter removals ahead of the
|
|
152
|
+
* level's own upserts, and applying them in any other order changes the result.
|
|
153
|
+
*
|
|
154
|
+
* Atomicity: nothing is written until every modification has been applied to the in-memory
|
|
155
|
+
* document, and the write itself goes through a temp file in the same directory then a rename, so
|
|
156
|
+
* a crash mid-command leaves world.json either wholly old or wholly new. A half-written world is
|
|
157
|
+
* worse than an unchanged one — the creator has no way to tell which half landed, and a forge is
|
|
158
|
+
* expensive enough that "run it again" is not an acceptable recovery.
|
|
159
|
+
*/
|
|
160
|
+
export function applyModificationsToWorld(worldPath, modifications) {
|
|
161
|
+
let raw;
|
|
162
|
+
try {
|
|
163
|
+
raw = fs.readFileSync(worldPath, 'utf-8');
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
throw new CliError(`Cannot read ${worldPath}. Is this a Bitmagic project?`);
|
|
167
|
+
}
|
|
168
|
+
let world;
|
|
169
|
+
try {
|
|
170
|
+
world = JSON.parse(raw);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
throw new CliError(`${worldPath} is not valid JSON. Nothing has been changed.`);
|
|
174
|
+
}
|
|
175
|
+
if (!isJsonObject(world)) {
|
|
176
|
+
throw new CliError(`${worldPath} does not contain a world object. Nothing has been changed.`);
|
|
177
|
+
}
|
|
178
|
+
const summary = modifications.map((modification) => applyOne(world, modification));
|
|
179
|
+
const temp = path.join(path.dirname(worldPath), `.world.json.${process.pid}.tmp`);
|
|
180
|
+
fs.writeFileSync(temp, `${JSON.stringify(world, null, 2)}\n`);
|
|
181
|
+
fs.renameSync(temp, worldPath);
|
|
182
|
+
return { applied: modifications.length, summary };
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=apply-modifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-modifications.js","sourceRoot":"","sources":["../../src/forge/apply-modifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal progress for the level bake.
|
|
3
|
+
*
|
|
4
|
+
* The bake is the one step that can legitimately run for many minutes, and its transport wait is
|
|
5
|
+
* an IDLE timeout of 20 minutes (`VOXELIZE_TIMEOUT_MS`) — per-chunk progress re-arms the timer but
|
|
6
|
+
* is otherwise consumed silently inside the transport. Without a printed line a creator watching a
|
|
7
|
+
* still terminal concludes the command has hung and kills it mid-bake, losing the whole step. So
|
|
8
|
+
* the command subscribes to the page's own `VOXELIZE_GLB_AS_LEVEL_PROGRESS` messages
|
|
9
|
+
* (`game/src/engine/template/VoxelMessageHandlers.ts`) and prints them.
|
|
10
|
+
*
|
|
11
|
+
* Throttled, because the engine emits one message per chunk and a large level has thousands: an
|
|
12
|
+
* unthrottled relay would bury every other line of output. The formatter and the throttle are pure
|
|
13
|
+
* and separate from the subscription so both are testable without a browser.
|
|
14
|
+
*/
|
|
15
|
+
/** The engine's per-chunk progress payload. `chunkIndex: -1` marks the post-bake upload phase. */
|
|
16
|
+
export interface BakeProgress {
|
|
17
|
+
chunkIndex: number;
|
|
18
|
+
totalChunks: number;
|
|
19
|
+
nonEmptyChunks?: number;
|
|
20
|
+
label?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare const BAKE_PROGRESS_TYPE = "VOXELIZE_GLB_AS_LEVEL_PROGRESS";
|
|
23
|
+
/** Minimum gap between printed bake lines. Long enough not to flood, short enough that the
|
|
24
|
+
* terminal never looks frozen. */
|
|
25
|
+
export declare const BAKE_PROGRESS_MIN_INTERVAL_MS = 3000;
|
|
26
|
+
/** Read a bake-progress payload off a page message, or null if it is not one. */
|
|
27
|
+
export declare function asBakeProgress(message: unknown): BakeProgress | null;
|
|
28
|
+
/**
|
|
29
|
+
* The line to print for one progress message.
|
|
30
|
+
*
|
|
31
|
+
* `chunkIndex: -1` / `totalChunks: -1` is the engine's sentinel for the upload phase that follows
|
|
32
|
+
* the chunk loop; it carries a label instead of a count, so it is rendered as that label rather
|
|
33
|
+
* than as a nonsensical "chunk -1 of -1".
|
|
34
|
+
*/
|
|
35
|
+
export declare function formatBakeProgress(progress: BakeProgress): string;
|
|
36
|
+
/**
|
|
37
|
+
* A printer that emits at most one line per `minIntervalMs` — except for the final chunk and the
|
|
38
|
+
* label-only phases, which always print. The last chunk is what tells a creator the loop finished
|
|
39
|
+
* rather than stalled, so dropping it to a throttle would remove the single most informative line.
|
|
40
|
+
*/
|
|
41
|
+
export declare function createBakeProgressPrinter(log: (message: string) => void, options?: {
|
|
42
|
+
minIntervalMs?: number;
|
|
43
|
+
now?: () => number;
|
|
44
|
+
}): (message: unknown) => void;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal progress for the level bake.
|
|
3
|
+
*
|
|
4
|
+
* The bake is the one step that can legitimately run for many minutes, and its transport wait is
|
|
5
|
+
* an IDLE timeout of 20 minutes (`VOXELIZE_TIMEOUT_MS`) — per-chunk progress re-arms the timer but
|
|
6
|
+
* is otherwise consumed silently inside the transport. Without a printed line a creator watching a
|
|
7
|
+
* still terminal concludes the command has hung and kills it mid-bake, losing the whole step. So
|
|
8
|
+
* the command subscribes to the page's own `VOXELIZE_GLB_AS_LEVEL_PROGRESS` messages
|
|
9
|
+
* (`game/src/engine/template/VoxelMessageHandlers.ts`) and prints them.
|
|
10
|
+
*
|
|
11
|
+
* Throttled, because the engine emits one message per chunk and a large level has thousands: an
|
|
12
|
+
* unthrottled relay would bury every other line of output. The formatter and the throttle are pure
|
|
13
|
+
* and separate from the subscription so both are testable without a browser.
|
|
14
|
+
*/
|
|
15
|
+
export const BAKE_PROGRESS_TYPE = 'VOXELIZE_GLB_AS_LEVEL_PROGRESS';
|
|
16
|
+
/** Minimum gap between printed bake lines. Long enough not to flood, short enough that the
|
|
17
|
+
* terminal never looks frozen. */
|
|
18
|
+
export const BAKE_PROGRESS_MIN_INTERVAL_MS = 3000;
|
|
19
|
+
function isRecord(value) {
|
|
20
|
+
return typeof value === 'object' && value !== null;
|
|
21
|
+
}
|
|
22
|
+
/** Read a bake-progress payload off a page message, or null if it is not one. */
|
|
23
|
+
export function asBakeProgress(message) {
|
|
24
|
+
if (!isRecord(message) || message.type !== BAKE_PROGRESS_TYPE)
|
|
25
|
+
return null;
|
|
26
|
+
const { chunkIndex, totalChunks } = message;
|
|
27
|
+
if (typeof chunkIndex !== 'number' || typeof totalChunks !== 'number')
|
|
28
|
+
return null;
|
|
29
|
+
return {
|
|
30
|
+
chunkIndex,
|
|
31
|
+
totalChunks,
|
|
32
|
+
...(typeof message.nonEmptyChunks === 'number' ? { nonEmptyChunks: message.nonEmptyChunks } : {}),
|
|
33
|
+
...(typeof message.label === 'string' ? { label: message.label } : {}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The line to print for one progress message.
|
|
38
|
+
*
|
|
39
|
+
* `chunkIndex: -1` / `totalChunks: -1` is the engine's sentinel for the upload phase that follows
|
|
40
|
+
* the chunk loop; it carries a label instead of a count, so it is rendered as that label rather
|
|
41
|
+
* than as a nonsensical "chunk -1 of -1".
|
|
42
|
+
*/
|
|
43
|
+
export function formatBakeProgress(progress) {
|
|
44
|
+
if (progress.totalChunks <= 0) {
|
|
45
|
+
return ` bake: ${progress.label ?? 'working…'}`;
|
|
46
|
+
}
|
|
47
|
+
const percent = Math.floor(((progress.chunkIndex + 1) / progress.totalChunks) * 100);
|
|
48
|
+
const filled = progress.nonEmptyChunks !== undefined ? `, ${progress.nonEmptyChunks} non-empty` : '';
|
|
49
|
+
const label = progress.label ? ` — ${progress.label}` : '';
|
|
50
|
+
return ` bake: chunk ${progress.chunkIndex + 1}/${progress.totalChunks} (${percent}%${filled})${label}`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A printer that emits at most one line per `minIntervalMs` — except for the final chunk and the
|
|
54
|
+
* label-only phases, which always print. The last chunk is what tells a creator the loop finished
|
|
55
|
+
* rather than stalled, so dropping it to a throttle would remove the single most informative line.
|
|
56
|
+
*/
|
|
57
|
+
export function createBakeProgressPrinter(log, options = {}) {
|
|
58
|
+
const minIntervalMs = options.minIntervalMs ?? BAKE_PROGRESS_MIN_INTERVAL_MS;
|
|
59
|
+
const now = options.now ?? (() => Date.now());
|
|
60
|
+
// -Infinity, not 0: the FIRST message must always print. A zero start throttles it whenever
|
|
61
|
+
// `now()` begins near zero — which a monotonic clock does, and which is exactly the moment the
|
|
62
|
+
// creator most needs to see that the bake has begun.
|
|
63
|
+
let lastAt = -Infinity;
|
|
64
|
+
return (message) => {
|
|
65
|
+
const progress = asBakeProgress(message);
|
|
66
|
+
if (progress === null)
|
|
67
|
+
return;
|
|
68
|
+
const isFinalChunk = progress.totalChunks > 0 && progress.chunkIndex + 1 >= progress.totalChunks;
|
|
69
|
+
const isPhaseLabel = progress.totalChunks <= 0;
|
|
70
|
+
const at = now();
|
|
71
|
+
if (!isFinalChunk && !isPhaseLabel && at - lastAt < minIntervalMs)
|
|
72
|
+
return;
|
|
73
|
+
lastAt = at;
|
|
74
|
+
log(formatBakeProgress(progress));
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=bake-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bake-progress.js","sourceRoot":"","sources":["../../src/forge/bake-progress.ts"],"names":[],"mappings":"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"}
|