@bitmagic/cli 0.1.52-dev.8 → 0.1.52

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 (94) hide show
  1. package/README.md +45 -9
  2. package/dist/assets/add.js +2 -1
  3. package/dist/assets/add.js.map +1 -1
  4. package/dist/assets/voxelize-glb.d.ts +17 -1
  5. package/dist/assets/voxelize-glb.js +43 -19
  6. package/dist/assets/voxelize-glb.js.map +1 -1
  7. package/dist/bin.js +25 -0
  8. package/dist/bin.js.map +1 -1
  9. package/dist/cli.d.ts +10 -0
  10. package/dist/cli.js +17 -7
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/generate.d.ts +27 -0
  13. package/dist/commands/generate.js +132 -46
  14. package/dist/commands/generate.js.map +1 -1
  15. package/dist/commands/judge.d.ts +5 -0
  16. package/dist/commands/judge.js +28 -7
  17. package/dist/commands/judge.js.map +1 -1
  18. package/dist/commands/levels.d.ts +10 -17
  19. package/dist/commands/levels.js +48 -48
  20. package/dist/commands/levels.js.map +1 -1
  21. package/dist/commands/publish.d.ts +6 -1
  22. package/dist/commands/publish.js +29 -15
  23. package/dist/commands/publish.js.map +1 -1
  24. package/dist/commands/verify.d.ts +4 -0
  25. package/dist/commands/verify.js +94 -51
  26. package/dist/commands/verify.js.map +1 -1
  27. package/dist/editor/journal.d.ts +4 -1
  28. package/dist/editor/journal.js +13 -7
  29. package/dist/editor/journal.js.map +1 -1
  30. package/dist/editor/server.js +3 -1
  31. package/dist/editor/server.js.map +1 -1
  32. package/dist/generate/model.d.ts +13 -2
  33. package/dist/generate/model.js +70 -21
  34. package/dist/generate/model.js.map +1 -1
  35. package/dist/generate/prop.d.ts +60 -4
  36. package/dist/generate/prop.js +169 -46
  37. package/dist/generate/prop.js.map +1 -1
  38. package/dist/generate/stream.d.ts +7 -0
  39. package/dist/generate/stream.js +2 -1
  40. package/dist/generate/stream.js.map +1 -1
  41. package/dist/judge/record.d.ts +3 -0
  42. package/dist/judge/record.js +3 -0
  43. package/dist/judge/record.js.map +1 -1
  44. package/dist/levels/registry.d.ts +5 -2
  45. package/dist/levels/registry.js +32 -27
  46. package/dist/levels/registry.js.map +1 -1
  47. package/dist/messages/check.d.ts +30 -0
  48. package/dist/messages/check.js +119 -0
  49. package/dist/messages/check.js.map +1 -0
  50. package/dist/messages/notice.d.ts +58 -0
  51. package/dist/messages/notice.js +54 -0
  52. package/dist/messages/notice.js.map +1 -0
  53. package/dist/messages/refresh.d.ts +19 -0
  54. package/dist/messages/refresh.js +42 -0
  55. package/dist/messages/refresh.js.map +1 -0
  56. package/dist/project/jobs.d.ts +1 -1
  57. package/dist/project/jobs.js +16 -20
  58. package/dist/project/jobs.js.map +1 -1
  59. package/dist/project/platform-declaration.d.ts +51 -0
  60. package/dist/project/platform-declaration.js +81 -0
  61. package/dist/project/platform-declaration.js.map +1 -0
  62. package/dist/publish/platform.d.ts +4 -8
  63. package/dist/publish/platform.js +19 -53
  64. package/dist/publish/platform.js.map +1 -1
  65. package/dist/scaffold/project-files.js +54 -21
  66. package/dist/scaffold/project-files.js.map +1 -1
  67. package/dist/verify/artifacts.d.ts +19 -0
  68. package/dist/verify/artifacts.js +34 -0
  69. package/dist/verify/artifacts.js.map +1 -0
  70. package/dist/verify/browser.d.ts +10 -0
  71. package/dist/verify/browser.js +79 -9
  72. package/dist/verify/browser.js.map +1 -1
  73. package/dist/verify/classify.d.ts +37 -1
  74. package/dist/verify/classify.js +66 -2
  75. package/dist/verify/classify.js.map +1 -1
  76. package/dist/verify/device.d.ts +43 -0
  77. package/dist/verify/device.js +59 -0
  78. package/dist/verify/device.js.map +1 -0
  79. package/dist/verify/iterate.d.ts +21 -2
  80. package/dist/verify/iterate.js +43 -36
  81. package/dist/verify/iterate.js.map +1 -1
  82. package/dist/verify/mobile-parity.d.ts +42 -0
  83. package/dist/verify/mobile-parity.js +84 -0
  84. package/dist/verify/mobile-parity.js.map +1 -0
  85. package/dist/verify/platform.d.ts +47 -0
  86. package/dist/verify/platform.js +89 -0
  87. package/dist/verify/platform.js.map +1 -0
  88. package/dist/verify/result.d.ts +90 -6
  89. package/dist/verify/result.js +89 -10
  90. package/dist/verify/result.js.map +1 -1
  91. package/dist/verify/url.d.ts +9 -1
  92. package/dist/verify/url.js +10 -2
  93. package/dist/verify/url.js.map +1 -1
  94. package/package.json +4 -4
@@ -50,6 +50,9 @@ export function readJudgeRecord(root) {
50
50
  model: record.model,
51
51
  screenshotPath: record.screenshotPath,
52
52
  ...(typeof record.genre === 'string' ? { genre: record.genre } : {}),
53
+ ...(record.platform === 'desktop' || record.platform === 'mobile'
54
+ ? { platform: record.platform }
55
+ : {}),
53
56
  };
54
57
  }
55
58
  //# sourceMappingURL=record.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/judge/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAuB,MAAM,sBAAsB,CAAC;AAEjF,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AAE/D,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;AAC5C,CAAC;AAeD,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAmB;IAChE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,MAAM,SAAS,GAAG,oBAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnE,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACpC,IACE,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;WACnC,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ;WAC7B,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;WAChC,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,EAC5C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,IAAI;QACzB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,GAAG,CAAC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/judge/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAuB,MAAM,sBAAsB,CAAC;AAEjF,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AAE/D,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;AAC5C,CAAC;AAkBD,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAmB;IAChE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,MAAM,SAAS,GAAG,oBAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnE,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACpC,IACE,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;WACnC,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ;WAC7B,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;WAChC,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,EAC5C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,IAAI;QACzB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,GAAG,CAAC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAC/D,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;YAC/B,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC"}
@@ -38,6 +38,11 @@ export interface LevelRow {
38
38
  }
39
39
  export declare function listLevels(world: JsonObject): LevelRow[];
40
40
  export interface LevelPlan {
41
+ /**
42
+ * The level the plan is about, as the registry holds it BEFORE the write — so a rename's plan
43
+ * still carries the old name. For `add` it is the entry the plan will create.
44
+ */
45
+ level: LevelEntry;
41
46
  modifications: WorldJsonModification[];
42
47
  /** Said after the write. Never a reason to refuse. */
43
48
  notes: string[];
@@ -52,7 +57,6 @@ export interface LevelPlan {
52
57
  export declare function planSetStart(world: JsonObject, levelId: string): LevelPlan;
53
58
  export declare function planRename(world: JsonObject, levelId: string, name: string): LevelPlan;
54
59
  export interface AddPlan extends LevelPlan {
55
- level: LevelEntry;
56
60
  /** True when this made the game multi-level for the first time. */
57
61
  converted: boolean;
58
62
  }
@@ -68,7 +72,6 @@ export declare function planAdd(world: JsonObject, vwldAssetId: string, options:
68
72
  makeStart: boolean;
69
73
  }): AddPlan;
70
74
  export interface RemovePlan extends LevelPlan {
71
- level: LevelEntry;
72
75
  /** Placed instances tagged to this level, which go with it. */
73
76
  placedRemoved: number;
74
77
  /** Doors and key items scoped to it, which also go. */
@@ -30,15 +30,20 @@ import { isJsonObject } from '../project/world-json.js';
30
30
  function asWorldJson(world) {
31
31
  return world;
32
32
  }
33
- function assetsOf(world) {
34
- return (Array.isArray(world.assets) ? world.assets : []).filter(isJsonObject);
33
+ /** The object members of a root array, or an empty list when it is absent or malformed. */
34
+ function arrayOf(world, key) {
35
+ const value = world[key];
36
+ return (Array.isArray(value) ? value : []).filter(isJsonObject);
35
37
  }
38
+ const assetsOf = (world) => arrayOf(world, 'assets');
39
+ const objectsOf = (world) => arrayOf(world, 'environmentObjects');
40
+ const levelsOf = (world) => getLevels(asWorldJson(world));
41
+ const startLevelOf = (world) => getStartLevel(asWorldJson(world));
36
42
  export function listLevels(world) {
37
- const start = getStartLevel(asWorldJson(world));
43
+ const start = startLevelOf(world);
38
44
  const assets = assetsOf(world);
39
- const objects = (Array.isArray(world.environmentObjects) ? world.environmentObjects : [])
40
- .filter(isJsonObject);
41
- return getLevels(asWorldJson(world)).map((level) => ({
45
+ const objects = objectsOf(world);
46
+ return levelsOf(world).map((level) => ({
42
47
  id: level.id,
43
48
  name: level.name,
44
49
  vwldAssetId: level.vwldAssetId,
@@ -49,7 +54,7 @@ export function listLevels(world) {
49
54
  }));
50
55
  }
51
56
  function requireLevel(world, levelId) {
52
- const levels = getLevels(asWorldJson(world));
57
+ const levels = levelsOf(world);
53
58
  const level = levels.find((entry) => entry.id === levelId);
54
59
  if (level === undefined) {
55
60
  throw new CliError(`No level with id "${levelId}" in this project. `
@@ -76,7 +81,7 @@ function vwldUrlFor(world, level) {
76
81
  */
77
82
  export function planSetStart(world, levelId) {
78
83
  const level = requireLevel(world, levelId);
79
- const current = getStartLevel(asWorldJson(world));
84
+ const current = startLevelOf(world);
80
85
  if (current !== null && current.id === levelId) {
81
86
  throw new CliError(`"${level.name}" is already the start level. world.json is unchanged.`);
82
87
  }
@@ -87,6 +92,7 @@ export function planSetStart(world, levelId) {
87
92
  + 'list` shows what is there). world.json is unchanged.');
88
93
  }
89
94
  return {
95
+ level,
90
96
  modifications: [
91
97
  { type: 'set', path: ['startLevelId'], value: levelId },
92
98
  // Without these the game boots the OLD level's terrain. See the file header.
@@ -105,8 +111,9 @@ export function planRename(world, levelId, name) {
105
111
  if (trimmed === level.name) {
106
112
  throw new CliError(`"${level.name}" already has that name. world.json is unchanged.`);
107
113
  }
108
- const clash = getLevels(asWorldJson(world)).some((e) => e.id !== levelId && e.name === trimmed);
114
+ const clash = levelsOf(world).some((e) => e.id !== levelId && e.name === trimmed);
109
115
  return {
116
+ level,
110
117
  modifications: [{
111
118
  type: 'update',
112
119
  path: ['levels'],
@@ -129,9 +136,10 @@ export function planRename(world, levelId, name) {
129
136
  * a second level would be the surprising outcome.
130
137
  */
131
138
  export function planAdd(world, vwldAssetId, options) {
132
- const asset = assetsOf(world).find((item) => item.id === vwldAssetId);
139
+ const assets = assetsOf(world);
140
+ const asset = assets.find((item) => item.id === vwldAssetId);
133
141
  if (asset === undefined) {
134
- const available = assetsOf(world).filter((item) => item.type === 'vwld');
142
+ const available = assets.filter((item) => item.type === 'vwld');
135
143
  throw new CliError(`No asset with id "${vwldAssetId}" in this project. `
136
144
  + (available.length > 0
137
145
  ? `Baked levels here: ${available.map((a) => `${String(a.id)} ("${String(a.name)}")`).join(', ')}. `
@@ -150,7 +158,8 @@ export function planAdd(world, vwldAssetId, options) {
150
158
  }
151
159
  // Two levels on one bake is the same place twice, and the forge's re-bake path resolves a level
152
160
  // by `vwldAssetId` — with duplicates it picks the first arbitrarily.
153
- const sharing = getLevels(asWorldJson(world)).find((entry) => entry.vwldAssetId === vwldAssetId);
161
+ const existing = levelsOf(world);
162
+ const sharing = existing.find((entry) => entry.vwldAssetId === vwldAssetId);
154
163
  if (sharing !== undefined) {
155
164
  throw new CliError(`Level "${sharing.name}" (${sharing.id}) already uses that bake. world.json is unchanged.`);
156
165
  }
@@ -160,22 +169,20 @@ export function planAdd(world, vwldAssetId, options) {
160
169
  name: (options.name ?? assetName).trim() || assetName,
161
170
  vwldAssetId,
162
171
  };
163
- const existing = getLevels(asWorldJson(world));
164
172
  if (existing.length > 0) {
165
- const makeStart = options.makeStart;
166
173
  return {
167
174
  level,
168
175
  converted: false,
169
176
  modifications: [
170
177
  { type: 'push', path: ['levels'], value: level },
171
- ...(makeStart
178
+ ...(options.makeStart
172
179
  ? [
173
180
  { type: 'set', path: ['startLevelId'], value: level.id },
174
181
  ...buildStartLevelMirrors(level, url),
175
182
  ]
176
183
  : []),
177
184
  ],
178
- notes: makeStart
185
+ notes: options.makeStart
179
186
  ? [`"${level.name}" is now the start level.`]
180
187
  : ['The start level is unchanged — pass --make-start, or use `bitmagic levels set-start`.'],
181
188
  };
@@ -240,11 +247,11 @@ function safeConversion(world) {
240
247
  */
241
248
  export function planRemove(world, levelId) {
242
249
  const level = requireLevel(world, levelId);
243
- const levels = getLevels(asWorldJson(world));
250
+ const levels = levelsOf(world);
244
251
  if (levels.length <= 1) {
245
252
  throw new CliError('This is the game\'s only level, and a levels-mode game needs one. world.json is unchanged.');
246
253
  }
247
- const start = getStartLevel(asWorldJson(world));
254
+ const start = startLevelOf(world);
248
255
  if (start !== null && start.id === levelId) {
249
256
  const other = levels.find((entry) => entry.id !== levelId);
250
257
  throw new CliError(`"${level.name}" is the start level. Removing it would leave the game booting one level's `
@@ -253,9 +260,7 @@ export function planRemove(world, levelId) {
253
260
  + 'world.json is unchanged.');
254
261
  }
255
262
  const profile = isJsonObject(world.worldProfileData) ? world.worldProfileData : {};
256
- const objects = (Array.isArray(world.environmentObjects) ? world.environmentObjects : [])
257
- .filter(isJsonObject);
258
- const placedRemoved = objects.filter((object) => object.levelId === levelId).length;
263
+ const placedRemoved = objectsOf(world).filter((object) => object.levelId === levelId).length;
259
264
  const modifications = [
260
265
  {
261
266
  type: 'remove',
@@ -275,8 +280,7 @@ export function planRemove(world, levelId) {
275
280
  // assetIds as referenced, so the placeholder assets can never be purged either.
276
281
  const scopedRemoved = [];
277
282
  for (const key of ['doors', 'keyItems']) {
278
- const entries = Array.isArray(profile[key]) ? profile[key].filter(isJsonObject) : [];
279
- const doomed = entries.filter((entry) => entry.levelId === levelId).length;
283
+ const doomed = arrayOf(profile, key).filter((entry) => entry.levelId === levelId).length;
280
284
  if (doomed === 0)
281
285
  continue;
282
286
  scopedRemoved.push(`${doomed} ${key}`);
@@ -294,16 +298,17 @@ export function planRemove(world, levelId) {
294
298
  notes.push(`Also removed: ${scopedRemoved.join(', ')}.`);
295
299
  // The start-screen chooser filters by id and is hand-authored; it warns and skips unknown ids on
296
300
  // its own, so this is reported rather than rewritten.
297
- if (choosersNaming(profile, levelId) > 0) {
301
+ if (isNamedByChooser(profile, levelId)) {
298
302
  notes.push('The main screen\'s level chooser still lists this level; it will skip it, but tidy '
299
303
  + '`hud.startScreen.selections[].levelIds` when you get a chance.');
300
304
  }
301
305
  return { level, modifications, notes, placedRemoved, scopedRemoved };
302
306
  }
303
- function choosersNaming(profile, levelId) {
307
+ /** Does a main-screen level chooser still offer this level? */
308
+ function isNamedByChooser(profile, levelId) {
304
309
  const hud = isJsonObject(profile.hud) ? profile.hud : {};
305
310
  const startScreen = isJsonObject(hud.startScreen) ? hud.startScreen : {};
306
- const selections = Array.isArray(startScreen.selections) ? startScreen.selections : [];
307
- return selections.filter((step) => isJsonObject(step) && Array.isArray(step.levelIds) && step.levelIds.includes(levelId)).length;
311
+ return arrayOf(startScreen, 'selections')
312
+ .some((step) => Array.isArray(step.levelIds) && step.levelIds.includes(levelId));
308
313
  }
309
314
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/levels/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/levels/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { EnvironmentName } from '../config/environments.js';
2
+ import { type UnreadMessagesCache } from './notice.js';
3
+ export declare function messagesCachePath(baseDir?: string): string;
4
+ /**
5
+ * The last recorded answer, or null if there is none to trust.
6
+ *
7
+ * Missing, unreadable and malformed all collapse to null on purpose: the caller's next move is
8
+ * identical in every case — say nothing now, refresh in the background.
9
+ */
10
+ export declare function readUnreadMessagesCache(baseDir?: string): UnreadMessagesCache | null;
11
+ export declare function writeUnreadMessagesCache(cache: UnreadMessagesCache, baseDir?: string): void;
12
+ /**
13
+ * The line bin.ts prints before a command runs — read from the cache, never the network.
14
+ *
15
+ * A cache belonging to a DIFFERENT environment answers a different question and is ignored:
16
+ * a dev broadcast must not nudge a prod session, or the other way round. The same rule
17
+ * `pendingUpdateNotice` applies to dist-tags.
18
+ */
19
+ export declare function pendingMessagesNotice(environment: EnvironmentName | undefined, baseDir?: string, now?: number): string | null;
20
+ /**
21
+ * Refresh the cache if it is stale. Fire-and-forget: callers must not await this for its value.
22
+ *
23
+ * A cache about a different environment is refreshed immediately however recent it is —
24
+ * switching environments must not leave the nudge mute for the rest of its interval.
25
+ *
26
+ * On failure the result is still written, with `unread: null`, so an offline machine backs off
27
+ * for the interval instead of asking on every command. That is why the failure marker is null
28
+ * rather than 0: zero would be a claim ("you have nothing unread"), null is an admission.
29
+ */
30
+ export declare function refreshUnreadMessagesInBackground(environment: EnvironmentName, apiUrl: string, accessToken: string, now?: number, baseDir?: string, fetchImpl?: typeof globalThis.fetch): Promise<void>;
@@ -0,0 +1,119 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { defaultBaseDir } from '../config/credentials.js';
4
+ import { apiServerHeaders } from '../telemetry/request-headers.js';
5
+ import { isMessagesCacheStale, unreadMessagesNotice, } from './notice.js';
6
+ /**
7
+ * Reading and refreshing the unread-messages count.
8
+ *
9
+ * Deliberately the same shape as update/check.ts, which already solved every hard part: the
10
+ * notice is decided from the CACHE ONLY (never the network, so printing costs nothing), the
11
+ * refresh is fire-and-forget and bounded, and every filesystem error is swallowed because this
12
+ * is a hint, not a thing worth failing a command over.
13
+ */
14
+ /**
15
+ * Cap on the background refresh.
16
+ *
17
+ * A pending fetch keeps Node alive, so an unbounded request would hold a finished command open
18
+ * for as long as the network sulks. Matches the update check's allowance.
19
+ */
20
+ const REFRESH_TIMEOUT_MS = 2000;
21
+ export function messagesCachePath(baseDir = defaultBaseDir()) {
22
+ return path.join(baseDir, 'messages-check.json');
23
+ }
24
+ function isCache(value) {
25
+ if (typeof value !== 'object' || value === null)
26
+ return false;
27
+ const c = value;
28
+ return ((c.environment === 'dev' || c.environment === 'prod' || c.environment === 'local') &&
29
+ (c.unread === null || typeof c.unread === 'number') &&
30
+ (c.inboxUrl === null || typeof c.inboxUrl === 'string') &&
31
+ typeof c.checkedAt === 'number');
32
+ }
33
+ /**
34
+ * The last recorded answer, or null if there is none to trust.
35
+ *
36
+ * Missing, unreadable and malformed all collapse to null on purpose: the caller's next move is
37
+ * identical in every case — say nothing now, refresh in the background.
38
+ */
39
+ export function readUnreadMessagesCache(baseDir = defaultBaseDir()) {
40
+ try {
41
+ const parsed = JSON.parse(fs.readFileSync(messagesCachePath(baseDir), 'utf-8'));
42
+ return isCache(parsed) ? parsed : null;
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ export function writeUnreadMessagesCache(cache, baseDir = defaultBaseDir()) {
49
+ try {
50
+ fs.mkdirSync(baseDir, { recursive: true });
51
+ fs.writeFileSync(messagesCachePath(baseDir), `${JSON.stringify(cache)}\n`);
52
+ }
53
+ catch {
54
+ // A cache we cannot write is a nudge one run late, not an error anyone should see.
55
+ }
56
+ }
57
+ /**
58
+ * The line bin.ts prints before a command runs — read from the cache, never the network.
59
+ *
60
+ * A cache belonging to a DIFFERENT environment answers a different question and is ignored:
61
+ * a dev broadcast must not nudge a prod session, or the other way round. The same rule
62
+ * `pendingUpdateNotice` applies to dist-tags.
63
+ */
64
+ export function pendingMessagesNotice(environment, baseDir, now = Date.now()) {
65
+ if (environment === undefined)
66
+ return null;
67
+ const cache = readUnreadMessagesCache(baseDir);
68
+ if (cache === null || cache.environment !== environment)
69
+ return null;
70
+ return unreadMessagesNotice(cache, now);
71
+ }
72
+ /** Ask api-server for the caller's count. Null on any failure — this never throws. */
73
+ async function fetchUnread(apiUrl, accessToken, fetchImpl) {
74
+ try {
75
+ const response = await fetchImpl(`${apiUrl}/api/cli/v1/messages/unread`, {
76
+ headers: {
77
+ ...apiServerHeaders(),
78
+ Authorization: `Bearer ${accessToken}`,
79
+ Accept: 'application/json',
80
+ },
81
+ signal: AbortSignal.timeout(REFRESH_TIMEOUT_MS),
82
+ });
83
+ if (!response.ok)
84
+ return null;
85
+ const data = await response.json();
86
+ if (typeof data !== 'object' || data === null)
87
+ return null;
88
+ const d = data;
89
+ if (typeof d.unreadCount !== 'number' || typeof d.inboxUrl !== 'string')
90
+ return null;
91
+ return { unreadCount: d.unreadCount, inboxUrl: d.inboxUrl };
92
+ }
93
+ catch {
94
+ return null;
95
+ }
96
+ }
97
+ /**
98
+ * Refresh the cache if it is stale. Fire-and-forget: callers must not await this for its value.
99
+ *
100
+ * A cache about a different environment is refreshed immediately however recent it is —
101
+ * switching environments must not leave the nudge mute for the rest of its interval.
102
+ *
103
+ * On failure the result is still written, with `unread: null`, so an offline machine backs off
104
+ * for the interval instead of asking on every command. That is why the failure marker is null
105
+ * rather than 0: zero would be a claim ("you have nothing unread"), null is an admission.
106
+ */
107
+ export async function refreshUnreadMessagesInBackground(environment, apiUrl, accessToken, now = Date.now(), baseDir, fetchImpl = globalThis.fetch) {
108
+ const cache = readUnreadMessagesCache(baseDir);
109
+ if (cache !== null && cache.environment === environment && !isMessagesCacheStale(cache, now))
110
+ return;
111
+ const result = await fetchUnread(apiUrl, accessToken, fetchImpl);
112
+ writeUnreadMessagesCache({
113
+ environment,
114
+ unread: result === null ? null : result.unreadCount,
115
+ inboxUrl: result === null ? null : result.inboxUrl,
116
+ checkedAt: now,
117
+ }, baseDir);
118
+ }
119
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/messages/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { EnvironmentName } from '../config/environments.js';
2
+ /**
3
+ * The unread-messages nudge.
4
+ *
5
+ * Bitmagic broadcasts reach web creators through the portal's notification bell. A CLI-lane
6
+ * creator may never open the portal at all, so a command prints a one-line pointer instead —
7
+ * the same shape as the update nudge next door, and for the same reason: a hint worth giving,
8
+ * never worth failing or slowing a command over.
9
+ *
10
+ * The CLI never CONSUMES a message. Reading is an act, and the read receipt is what tells an
11
+ * admin whether a broadcast actually landed — a terminal glancing at a count is not that.
12
+ */
13
+ /** What is remembered between runs, so no command pays for the network. */
14
+ export interface UnreadMessagesCache {
15
+ /**
16
+ * Which environment the count is about.
17
+ *
18
+ * Credentials are per environment and a creator can hold a prod and a dev login at once, so
19
+ * an answer about one says nothing about the other. Mirrors `UpdateCheckCache.tag`, including
20
+ * the consequence: a cache for the other environment reads as absent and is refreshed.
21
+ */
22
+ environment: EnvironmentName;
23
+ /** The count, or null when the last check could not reach the server (a back-off marker). */
24
+ unread: number | null;
25
+ /** Where to read them — the server hands this over; see check.ts. */
26
+ inboxUrl: string | null;
27
+ /** Epoch ms of that check. */
28
+ checkedAt: number;
29
+ }
30
+ /**
31
+ * How stale a count may be before it is refreshed.
32
+ *
33
+ * An hour, matching the release line's update check. Broadcasts are rare and never urgent to
34
+ * the minute, and the cost of being wrong is one extra line of stderr.
35
+ */
36
+ export declare const MESSAGES_CHECK_INTERVAL_MS: number;
37
+ /**
38
+ * How old a cached count may be and still be PRINTED.
39
+ *
40
+ * Separate from the refresh interval, and the thing that stops a laptop that has been offline
41
+ * for a fortnight nagging every single command about a message read in a browser on day one.
42
+ * Past this, the nudge goes quiet until a check succeeds again.
43
+ */
44
+ export declare const MESSAGES_NOTICE_MAX_AGE_MS: number;
45
+ /** Whether the cached answer should be refreshed in the background. */
46
+ export declare function isMessagesCacheStale(cache: UnreadMessagesCache | null, now: number): boolean;
47
+ /**
48
+ * The line to print, or null to stay quiet.
49
+ *
50
+ * Quiet for: no cache at all (a first-ever run pays one silent command, exactly as the update
51
+ * notice does), a failed check (`unread: null` — an unreachable server is not evidence of
52
+ * anything), nothing unread, no inbox URL to point at, and an answer past its max age.
53
+ *
54
+ * The wording is deliberately soft. The count can be up to an interval stale and the CLI cannot
55
+ * know whether the message was read in a browser five minutes ago, so it reports rather than
56
+ * instructs.
57
+ */
58
+ export declare function unreadMessagesNotice(cache: UnreadMessagesCache | null, now: number): string | null;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * How stale a count may be before it is refreshed.
3
+ *
4
+ * An hour, matching the release line's update check. Broadcasts are rare and never urgent to
5
+ * the minute, and the cost of being wrong is one extra line of stderr.
6
+ */
7
+ export const MESSAGES_CHECK_INTERVAL_MS = 60 * 60 * 1000;
8
+ /**
9
+ * How old a cached count may be and still be PRINTED.
10
+ *
11
+ * Separate from the refresh interval, and the thing that stops a laptop that has been offline
12
+ * for a fortnight nagging every single command about a message read in a browser on day one.
13
+ * Past this, the nudge goes quiet until a check succeeds again.
14
+ */
15
+ export const MESSAGES_NOTICE_MAX_AGE_MS = 24 * 60 * 60 * 1000;
16
+ /** Whether the cached answer should be refreshed in the background. */
17
+ export function isMessagesCacheStale(cache, now) {
18
+ if (cache === null)
19
+ return true;
20
+ // A clock that moved backwards (a resumed VM, a corrected clock) would otherwise pin the
21
+ // cache as fresh forever — the same guard the update cache carries.
22
+ if (cache.checkedAt > now)
23
+ return true;
24
+ return now - cache.checkedAt >= MESSAGES_CHECK_INTERVAL_MS;
25
+ }
26
+ /**
27
+ * The line to print, or null to stay quiet.
28
+ *
29
+ * Quiet for: no cache at all (a first-ever run pays one silent command, exactly as the update
30
+ * notice does), a failed check (`unread: null` — an unreachable server is not evidence of
31
+ * anything), nothing unread, no inbox URL to point at, and an answer past its max age.
32
+ *
33
+ * The wording is deliberately soft. The count can be up to an interval stale and the CLI cannot
34
+ * know whether the message was read in a browser five minutes ago, so it reports rather than
35
+ * instructs.
36
+ */
37
+ export function unreadMessagesNotice(cache, now) {
38
+ if (cache === null || cache.unread === null || cache.inboxUrl === null)
39
+ return null;
40
+ if (!Number.isFinite(cache.unread) || cache.unread <= 0)
41
+ return null;
42
+ if (cache.checkedAt > now)
43
+ return null;
44
+ if (now - cache.checkedAt >= MESSAGES_NOTICE_MAX_AGE_MS)
45
+ return null;
46
+ const n = Math.floor(cache.unread);
47
+ // Capped for the same reason the bell's badge is: a number that high means something else is
48
+ // wrong, and the exact figure helps nobody.
49
+ const shown = n > 99 ? '99+' : String(n);
50
+ return n === 1
51
+ ? `You have 1 unread message from Bitmagic. Read it at ${cache.inboxUrl}`
52
+ : `You have ${shown} unread messages from Bitmagic. Read them at ${cache.inboxUrl}`;
53
+ }
54
+ //# sourceMappingURL=notice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notice.js","sourceRoot":"","sources":["../../src/messages/notice.ts"],"names":[],"mappings":"AAkCA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9D,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAAC,KAAiC,EAAE,GAAW;IACjF,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,yFAAyF;IACzF,oEAAoE;IACpE,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,0BAA0B,CAAC;AAC7D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAiC,EAAE,GAAW;IACjF,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACpF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrE,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,0BAA0B;QAAE,OAAO,IAAI,CAAC;IAErE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnC,6FAA6F;IAC7F,4CAA4C;IAC5C,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC;QACZ,CAAC,CAAC,uDAAuD,KAAK,CAAC,QAAQ,EAAE;QACzE,CAAC,CAAC,YAAY,KAAK,gDAAgD,KAAK,CAAC,QAAQ,EAAE,CAAC;AACxF,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Refresh the cached unread count after a command has done its work.
3
+ *
4
+ * Deliberately here and NOT in bin.ts, where the printing lives. bin.ts runs before citty has
5
+ * parsed argv, so it has no resolved environment and no token; by the time a command finishes,
6
+ * CommandContext has both — the same reasoning that puts the telemetry beacon here.
7
+ *
8
+ * Three properties this placement buys, all of them required:
9
+ * - never fires for a logged-out creator: getAccessToken throws before any network happens,
10
+ * and nothing is written, because no check took place to back off from.
11
+ * - never slows a command down: the count is for the NEXT run, the fetch is bounded at two
12
+ * seconds, and the print side is a pure file read.
13
+ * - never speaks for the wrong environment: the count is cached against the one that was
14
+ * actually resolved for this command, flags included.
15
+ *
16
+ * This is NOT telemetry — it is the creator's own inbox — so it is deliberately not gated on
17
+ * DO_NOT_TRACK. It reports nothing about the user; it asks a question on their behalf.
18
+ */
19
+ export declare function refreshUnreadMessages(): Promise<void>;
@@ -0,0 +1,42 @@
1
+ import { resolveAuth0ClientId } from '../config/environments.js';
2
+ import { getAccessToken } from '../auth/session.js';
3
+ import { currentCommand } from '../telemetry/command-context.js';
4
+ import { refreshUnreadMessagesInBackground } from './check.js';
5
+ /**
6
+ * Refresh the cached unread count after a command has done its work.
7
+ *
8
+ * Deliberately here and NOT in bin.ts, where the printing lives. bin.ts runs before citty has
9
+ * parsed argv, so it has no resolved environment and no token; by the time a command finishes,
10
+ * CommandContext has both — the same reasoning that puts the telemetry beacon here.
11
+ *
12
+ * Three properties this placement buys, all of them required:
13
+ * - never fires for a logged-out creator: getAccessToken throws before any network happens,
14
+ * and nothing is written, because no check took place to back off from.
15
+ * - never slows a command down: the count is for the NEXT run, the fetch is bounded at two
16
+ * seconds, and the print side is a pure file read.
17
+ * - never speaks for the wrong environment: the count is cached against the one that was
18
+ * actually resolved for this command, flags included.
19
+ *
20
+ * This is NOT telemetry — it is the creator's own inbox — so it is deliberately not gated on
21
+ * DO_NOT_TRACK. It reports nothing about the user; it asks a question on their behalf.
22
+ */
23
+ export async function refreshUnreadMessages() {
24
+ try {
25
+ const command = currentCommand();
26
+ if (command === null)
27
+ return;
28
+ const environment = command.environment;
29
+ if (environment === null)
30
+ return;
31
+ const clientId = resolveAuth0ClientId(environment, process.env);
32
+ const token = await getAccessToken(environment, clientId, {
33
+ fetch: globalThis.fetch,
34
+ sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
35
+ });
36
+ await refreshUnreadMessagesInBackground(environment.name, environment.apiUrl, token);
37
+ }
38
+ catch {
39
+ // Logged out, offline, or anything else: the nudge simply stays as it was.
40
+ }
41
+ }
42
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/messages/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAC;AAE/D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACxC,IAAI,WAAW,KAAK,IAAI;YAAE,OAAO;QAEjC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,QAAQ,EAAE;YACxD,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SACvE,CAAC,CAAC;QAEH,MAAM,iCAAiC,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvF,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;IAC7E,CAAC;AACH,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import type { ForgeProgressSnapshot } from '../forge/progress.js';
2
2
  import type { ForgeLayoutMap } from '@bitmagic/world-forger/pipeline/index.js';
3
3
  /** Which command is running. Shown as-is in the dev view, so these are creator-facing words. */
4
- export type JobKind = 'skybox' | 'sound' | 'image' | 'character' | 'animation' | 'prop' | 'vehicle' | 'forge' | 'cover' | 'hq' | 'judge' | 'upload' | 'model';
4
+ export type JobKind = 'skybox' | 'background' | 'block-type' | 'sound' | 'image' | 'character' | 'animation' | 'prop' | 'vehicle' | 'forge' | 'cover' | 'hq' | 'judge' | 'upload' | 'model';
5
5
  export interface JobRecord {
6
6
  jobId: string;
7
7
  kind: JobKind;