@bitmagic/cli 0.1.1 → 0.1.3

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 (46) hide show
  1. package/dist/cli.d.ts +30 -0
  2. package/dist/cli.js +23 -11
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/forge.d.ts +107 -0
  5. package/dist/commands/forge.js +393 -0
  6. package/dist/commands/forge.js.map +1 -0
  7. package/dist/commands/generate.js +58 -45
  8. package/dist/commands/generate.js.map +1 -1
  9. package/dist/commands/verify.js +16 -16
  10. package/dist/commands/verify.js.map +1 -1
  11. package/dist/forge/apply-modifications.d.ts +19 -0
  12. package/dist/forge/apply-modifications.js +184 -0
  13. package/dist/forge/apply-modifications.js.map +1 -0
  14. package/dist/forge/bake-progress.d.ts +44 -0
  15. package/dist/forge/bake-progress.js +77 -0
  16. package/dist/forge/bake-progress.js.map +1 -0
  17. package/dist/forge/browser-host.d.ts +100 -0
  18. package/dist/forge/browser-host.js +351 -0
  19. package/dist/forge/browser-host.js.map +1 -0
  20. package/dist/forge/local-store.d.ts +30 -0
  21. package/dist/forge/local-store.js +130 -0
  22. package/dist/forge/local-store.js.map +1 -0
  23. package/dist/forge/run-pipeline.d.ts +105 -0
  24. package/dist/forge/run-pipeline.js +269 -0
  25. package/dist/forge/run-pipeline.js.map +1 -0
  26. package/dist/forge/stream.d.ts +106 -0
  27. package/dist/forge/stream.js +286 -0
  28. package/dist/forge/stream.js.map +1 -0
  29. package/dist/forge/transport.d.ts +58 -0
  30. package/dist/forge/transport.js +145 -0
  31. package/dist/forge/transport.js.map +1 -0
  32. package/dist/forge/upload-proxy.d.ts +21 -0
  33. package/dist/forge/upload-proxy.js +134 -0
  34. package/dist/forge/upload-proxy.js.map +1 -0
  35. package/dist/generate/stream.d.ts +1 -10
  36. package/dist/generate/stream.js +5 -62
  37. package/dist/generate/stream.js.map +1 -1
  38. package/dist/http/sse.d.ts +40 -0
  39. package/dist/http/sse.js +98 -0
  40. package/dist/http/sse.js.map +1 -0
  41. package/dist/local-port.d.ts +30 -0
  42. package/dist/local-port.js +53 -0
  43. package/dist/local-port.js.map +1 -0
  44. package/dist/scaffold/project-files.js +89 -9
  45. package/dist/scaffold/project-files.js.map +1 -1
  46. package/package.json +3 -2
@@ -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
- ...(args.referenceImageUrl !== undefined ? { referenceImageUrl: args.referenceImageUrl } : {}),
33
- };
50
+ referenceImageUrl: args.referenceImageUrl,
51
+ });
34
52
  }
35
53
  export function buildSoundBody(args) {
36
- const durationSeconds = parseNumberFlag('duration', args.duration, { min: 0.5, max: 22 });
37
- const promptInfluence = parseNumberFlag('prompt-influence', args.promptInfluence, { min: 0, max: 1 });
38
- return {
54
+ return withoutAbsentFlags({
39
55
  prompt: args.prompt,
40
- ...(durationSeconds !== undefined ? { durationSeconds } : {}),
41
- ...(promptInfluence !== undefined ? { promptInfluence } : {}),
42
- ...(args.loop !== undefined ? { loop: args.loop } : {}),
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
- const width = parseNumberFlag('width', args.width, { min: 1, integer: true });
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
- ...(width !== undefined ? { width } : {}),
52
- ...(height !== undefined ? { height } : {}),
53
- ...(args.referenceImageUrl !== undefined ? { referenceImageUrl: args.referenceImageUrl } : {}),
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
- const headScale = parseNumberFlag('head-scale', args.headScale, { min: 50, max: 300 });
58
- return {
71
+ return withoutAbsentFlags({
59
72
  name: args.name,
60
73
  prompt: args.prompt,
61
- ...(args.applyToPlayer !== undefined ? { applyToPlayer: args.applyToPlayer } : {}),
62
- ...(headScale !== undefined ? { headScale } : {}),
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
- const length = parseNumberFlag('length', args.length);
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
- ...(length !== undefined ? { length } : {}),
72
- ...(cfgScale !== undefined ? { cfgScale } : {}),
73
- ...(seed !== undefined ? { seed } : {}),
74
- ...(args.footIk !== undefined ? { footIk: args.footIk } : {}),
75
- ...(args.inPlace !== undefined ? { inPlace: args.inPlace } : {}),
76
- ...(args.loop !== undefined ? { loop: args.loop } : {}),
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 result;
141
+ let request;
123
142
  try {
124
- result = await requestAssetGeneration(type, body, deps);
143
+ request = await requestAssetGeneration(type, body, deps);
125
144
  }
126
145
  catch (error) {
127
- if (error instanceof CliError) {
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 } = result;
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
- if (error instanceof CliError) {
142
- throw new CliError(`Generated ${label} successfully, but could not write it into world.json: ${error.message} ` +
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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"}
@@ -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
- /** Bind to port 0 so the OS picks a free one — verify must never collide with a running `dev`. */
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
- return new Promise((resolve, reject) => {
15
- const server = net.createServer();
16
- server.on('error', reject);
17
- server.listen(0, () => {
18
- const address = server.address();
19
- if (address === null || typeof address === 'string') {
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,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAqB,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,kGAAkG;AAClG,KAAK,UAAU,QAAQ;IACrB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;YACpB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACpD,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,QAAQ,CAAC,oDAAoD,CAAC,CAAC,CAAC;gBAC3E,OAAO;YACT,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,KAAmB,EAAE,SAAuB;IACrE,OAAO,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;QACtC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAChC,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,CAAC,mDAAmD;YAChF,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO;YACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,CACJ,IAAI,QAAQ,CACV,mDAAmD,IAAI,IAAI;gBACzD,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAChC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,CAAC,IAAI,QAAQ,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;qGACqG;AACrG,SAAS,eAAe,CAAC,GAAuB;IAC9C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,iBAAiB,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,QAAQ,CAChB,4DAA4D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CACnF,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wDAAwD,EAAE;IAC/F,IAAI,EAAE;QACJ,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,iBAAiB,IAAI,EAAE;KAC9F;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAE9C,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,QAAQ,CAAC,0CAA0C,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,+EAA+E;YAC/E,MAAM,IAAI,QAAQ,CAAC,8CAA8C,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QACnE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAE1D,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAgC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,EAAE;gBAC7D,GAAG,EAAE,OAAO,CAAC,IAAI;gBACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;aACpC,CAAC,CAAC;YACH,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBAClC,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC;gBAC3B,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC;aAC5C,CAAC,CAAC;YAEH,4FAA4F;YAC5F,2DAA2D;YAC3D,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC;gBAC1C,GAAG,EAAE,oBAAoB,IAAI,eAAe;gBAC5C,cAAc;gBACd,WAAW;gBACX,QAAQ;aACT,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;YAC/C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ;oBAAE,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;gBACrE,OAAO,CAAC,KAAK,CAAC,gBAAgB,WAAW,KAAK,cAAc,EAAE,CAAC,CAAC;gBAChE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,qCAAqC,WAAW,EAAE,CAAC,CAAC;QAClE,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
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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"}