@bitmagic/cli 0.1.83-dev.3 → 0.1.83-dev.5

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 (95) hide show
  1. package/README.md +34 -3
  2. package/assets/metahuman/src/work/metahuman/MetaHumanMaterials.ts +4 -0
  3. package/assets/metahuman/src/work/metahuman/StudioEnvironment.ts +4 -0
  4. package/assets/optimizing-assets/SKILL.md +3 -2
  5. package/assets/optimizing-assets/references/tools.md +1 -1
  6. package/dist/cli.d.ts +9 -0
  7. package/dist/commands/upgrade.d.ts +18 -0
  8. package/dist/commands/upgrade.js +94 -1
  9. package/dist/commands/upgrade.js.map +1 -1
  10. package/dist/config/environments.d.ts +1 -1
  11. package/dist/editor/animation-preview-page.js +20 -0
  12. package/dist/editor/animation-preview-page.js.map +1 -1
  13. package/dist/editor/asset-viewer.js +4 -0
  14. package/dist/editor/asset-viewer.js.map +1 -1
  15. package/dist/editor/design.d.ts +2 -2
  16. package/dist/editor/design.js +2 -2
  17. package/dist/editor/design.js.map +1 -1
  18. package/dist/editor/hud-replay-page.js +5 -0
  19. package/dist/editor/hud-replay-page.js.map +1 -1
  20. package/dist/editor/recording-sink.js +1 -1
  21. package/dist/editor/reload-bus.js +1 -1
  22. package/dist/editor/runtime-token.d.ts +61 -0
  23. package/dist/editor/runtime-token.js +74 -0
  24. package/dist/editor/runtime-token.js.map +1 -0
  25. package/dist/editor/save.d.ts +2 -2
  26. package/dist/editor/server.js +39 -12
  27. package/dist/editor/server.js.map +1 -1
  28. package/dist/editor/shell-page.d.ts +13 -9
  29. package/dist/editor/shell-page.js +70 -11
  30. package/dist/editor/shell-page.js.map +1 -1
  31. package/dist/forge/browser-host.d.ts +1 -1
  32. package/dist/forge/browser-host.js +13 -10
  33. package/dist/forge/browser-host.js.map +1 -1
  34. package/dist/generate/model.js +4 -1
  35. package/dist/generate/model.js.map +1 -1
  36. package/dist/generate/prop.js +4 -1
  37. package/dist/generate/prop.js.map +1 -1
  38. package/dist/http/signed-upload.d.ts +6 -4
  39. package/dist/http/signed-upload.js +37 -14
  40. package/dist/http/signed-upload.js.map +1 -1
  41. package/dist/mobile/rewrite-shim.js +1 -1
  42. package/dist/poki/publish.d.ts +5 -1
  43. package/dist/poki/publish.js +24 -7
  44. package/dist/poki/publish.js.map +1 -1
  45. package/dist/publish/game-exchange.d.ts +5 -0
  46. package/dist/publish/game-exchange.js +16 -3
  47. package/dist/publish/game-exchange.js.map +1 -1
  48. package/dist/scaffold/aliases.d.ts +16 -1
  49. package/dist/scaffold/aliases.js +10 -2
  50. package/dist/scaffold/aliases.js.map +1 -1
  51. package/dist/scaffold/blender-level-skill-files.js +2 -2
  52. package/dist/scaffold/engine-capabilities.d.ts +34 -0
  53. package/dist/scaffold/engine-capabilities.js +39 -0
  54. package/dist/scaffold/engine-capabilities.js.map +1 -0
  55. package/dist/scaffold/game-migration.d.ts +88 -0
  56. package/dist/scaffold/game-migration.js +491 -0
  57. package/dist/scaffold/game-migration.js.map +1 -0
  58. package/dist/scaffold/import-codemod.d.ts +51 -0
  59. package/dist/scaffold/import-codemod.js +118 -0
  60. package/dist/scaffold/import-codemod.js.map +1 -0
  61. package/dist/scaffold/legacy-game-baselines.d.ts +14 -0
  62. package/dist/scaffold/legacy-game-baselines.js +218 -0
  63. package/dist/scaffold/legacy-game-baselines.js.map +1 -0
  64. package/dist/scaffold/project-files.d.ts +20 -2
  65. package/dist/scaffold/project-files.js +64 -58
  66. package/dist/scaffold/project-files.js.map +1 -1
  67. package/dist/scaffold/project.d.ts +10 -3
  68. package/dist/scaffold/project.js +22 -23
  69. package/dist/scaffold/project.js.map +1 -1
  70. package/dist/scaffold/upgrade-project.js +4 -1
  71. package/dist/scaffold/upgrade-project.js.map +1 -1
  72. package/dist/smoke/run.js +8 -1
  73. package/dist/smoke/run.js.map +1 -1
  74. package/dist/trailer/record-session.d.ts +5 -3
  75. package/dist/trailer/record-session.js +12 -12
  76. package/dist/trailer/record-session.js.map +1 -1
  77. package/dist/trailer/vendored-recorder.d.ts +8 -0
  78. package/dist/trailer/vendored-recorder.js +26 -0
  79. package/dist/trailer/vendored-recorder.js.map +1 -0
  80. package/dist/vendor/hud-theme/engine/hud/resolveWorldTheme.js +7 -0
  81. package/dist/verify/browser.d.ts +6 -0
  82. package/dist/verify/browser.js +32 -0
  83. package/dist/verify/browser.js.map +1 -1
  84. package/dist/verify/categories.d.ts +1 -1
  85. package/dist/verify/categories.js +1 -0
  86. package/dist/verify/categories.js.map +1 -1
  87. package/dist/verify/classify.d.ts +17 -0
  88. package/dist/verify/classify.js +11 -0
  89. package/dist/verify/classify.js.map +1 -1
  90. package/dist/verify/mobile-parity.d.ts +1 -1
  91. package/dist/verify/mobile-parity.js +1 -1
  92. package/dist/verify/model-downloads.d.ts +47 -0
  93. package/dist/verify/model-downloads.js +127 -0
  94. package/dist/verify/model-downloads.js.map +1 -0
  95. package/package.json +8 -5
@@ -0,0 +1,127 @@
1
+ /** Below this a raw download is not worth a line: headers and latency dominate. */
2
+ export const UNCOMPRESSED_WARN_MIN_BYTES = 256 * 1024;
3
+ /**
4
+ * Below this an unoptimized GLB is not worth the skill's A/B: a character at ~0.7 MiB gains a
5
+ * few hundred KB, and the creator's time is better spent on the files above it.
6
+ */
7
+ export const UNOPTIMIZED_WARN_MIN_BYTES = 2 * 1024 * 1024;
8
+ /** How many files a warning names before it summarises the rest as a count. */
9
+ const MAX_NAMED_FILES = 3;
10
+ /** Extensions that mean the geometry or textures were already compressed for download. */
11
+ const COMPRESSION_EXTENSIONS = new Set([
12
+ 'EXT_meshopt_compression',
13
+ 'KHR_meshopt_compression',
14
+ 'KHR_draco_mesh_compression',
15
+ 'KHR_mesh_quantization',
16
+ 'KHR_texture_basisu',
17
+ ]);
18
+ const GLB_MAGIC = 0x46546c67; // 'glTF'
19
+ const JSON_CHUNK_TYPE = 0x4e4f534a; // 'JSON'
20
+ /** `extensionsUsed` from a binary glTF, or null when `bytes` is not one. */
21
+ export function parseGlbExtensions(bytes) {
22
+ if (bytes.byteLength < 20)
23
+ return null;
24
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
25
+ if (view.getUint32(0, true) !== GLB_MAGIC)
26
+ return null;
27
+ const jsonLength = view.getUint32(12, true);
28
+ if (view.getUint32(16, true) !== JSON_CHUNK_TYPE || 20 + jsonLength > bytes.byteLength)
29
+ return null;
30
+ try {
31
+ const json = JSON.parse(new TextDecoder().decode(bytes.subarray(20, 20 + jsonLength)));
32
+ if (typeof json !== 'object' || json === null)
33
+ return null;
34
+ const used = json.extensionsUsed;
35
+ return Array.isArray(used) ? used.filter((e) => typeof e === 'string') : [];
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ function isGlbResponse(response) {
42
+ if (response.status() !== 200)
43
+ return false;
44
+ try {
45
+ return new URL(response.url()).pathname.toLowerCase().endsWith('.glb');
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ /**
52
+ * Start recording every GLB `page` (and its frames) receives. Call `collect()` once the run has
53
+ * settled: it waits for the bodies still being read and returns one entry per distinct URL.
54
+ */
55
+ export function recordModelDownloads(page) {
56
+ const pending = [];
57
+ page.on('response', (response) => {
58
+ if (!isGlbResponse(response))
59
+ return;
60
+ pending.push((async () => {
61
+ try {
62
+ const body = await response.body();
63
+ const encoding = (await response.headerValue('content-encoding'))?.trim().toLowerCase() ?? '';
64
+ return {
65
+ url: response.url(),
66
+ contentEncoding: encoding === '' || encoding === 'identity' ? null : encoding,
67
+ decodedBytes: body.byteLength,
68
+ extensionsUsed: parseGlbExtensions(new Uint8Array(body.buffer, body.byteOffset, body.byteLength)),
69
+ };
70
+ }
71
+ catch {
72
+ // The page navigated or closed before the body arrived — nothing to advise about.
73
+ return null;
74
+ }
75
+ })());
76
+ });
77
+ return {
78
+ collect: async () => {
79
+ const byUrl = new Map();
80
+ for (const download of await Promise.all(pending)) {
81
+ if (download !== null)
82
+ byUrl.set(download.url, download);
83
+ }
84
+ return [...byUrl.values()];
85
+ },
86
+ };
87
+ }
88
+ function mib(bytes) {
89
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MiB`;
90
+ }
91
+ function fileName(url) {
92
+ try {
93
+ return new URL(url).pathname.split('/').pop() ?? url;
94
+ }
95
+ catch {
96
+ return url;
97
+ }
98
+ }
99
+ function describeFiles(downloads) {
100
+ const sorted = [...downloads].sort((a, b) => b.decodedBytes - a.decodedBytes);
101
+ const named = sorted.slice(0, MAX_NAMED_FILES).map((d) => `${fileName(d.url)} (${mib(d.decodedBytes)})`);
102
+ const rest = sorted.length - named.length;
103
+ return rest > 0 ? `${named.join(', ')} and ${rest} more` : named.join(', ');
104
+ }
105
+ /** The smoke check's advice about the GLBs it saw. Empty when there is nothing worth saying. */
106
+ export function modelDownloadWarnings(downloads, skillPath) {
107
+ const warnings = [];
108
+ const raw = downloads.filter((d) => d.contentEncoding === null && d.decodedBytes >= UNCOMPRESSED_WARN_MIN_BYTES);
109
+ if (raw.length > 0) {
110
+ const total = raw.reduce((n, d) => n + d.decodedBytes, 0);
111
+ warnings.push(`${raw.length} GLB${raw.length === 1 ? ' was' : 's were'} served without HTTP compression, `
112
+ + `${mib(total)} that players download in full: ${describeFiles(raw)}. Uploads store GLBs `
113
+ + 'brotli-compressed now (typically 70-90% smaller, byte-identical once decoded), so these are '
114
+ + 'older uploads or hosted elsewhere: upload each again with `bitmagic assets add <file> '
115
+ + '--keep-glb` and point the game at the new URL.');
116
+ }
117
+ const unoptimized = downloads.filter((d) => d.extensionsUsed !== null
118
+ && d.decodedBytes >= UNOPTIMIZED_WARN_MIN_BYTES
119
+ && !d.extensionsUsed.some((e) => COMPRESSION_EXTENSIONS.has(e)));
120
+ if (unoptimized.length > 0) {
121
+ warnings.push(`${unoptimized.length} large GLB${unoptimized.length === 1 ? ' has' : 's have'} no meshopt, Draco or `
122
+ + `KTX2 compression: ${describeFiles(unoptimized)}. Shrinking them is usually a large further `
123
+ + `saving on top of HTTP compression; see ${skillPath} for the per-asset-class recipe and its A/B check.`);
124
+ }
125
+ return warnings;
126
+ }
127
+ //# sourceMappingURL=model-downloads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-downloads.js","sourceRoot":"","sources":["../../src/verify/model-downloads.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitmagic/cli",
3
- "version": "0.1.83-dev.3",
3
+ "version": "0.1.83-dev.5",
4
4
  "description": "Build Bitmagic games from your own agent tool",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Bitmagic Oy",
@@ -26,9 +26,9 @@
26
26
  "resedit": "3.0.2",
27
27
  "tar": "^7.4.3",
28
28
  "ws": "^8.21.3",
29
- "@bitmagic/animation-forger": "0.1.38-dev.3",
30
- "@bitmagic/asset-core": "0.2.38-dev.3",
31
- "@bitmagic/world-forger": "0.1.43-dev.3"
29
+ "@bitmagic/asset-core": "0.2.38-dev.5",
30
+ "@bitmagic/animation-forger": "0.1.38-dev.5",
31
+ "@bitmagic/world-forger": "0.1.43-dev.5"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@eslint/js": "^9.38.0",
@@ -45,6 +45,7 @@
45
45
  "jest": "^29.7.0",
46
46
  "ts-jest": "^29.4.12",
47
47
  "typescript": "^6.0.3",
48
+ "@bitmagic/engine-protocol": "0.1.0",
48
49
  "@bitmagic/hud-theme": "0.1.0"
49
50
  },
50
51
  "jest": {
@@ -83,6 +84,8 @@
83
84
  "check:lab": "tsc -p tsconfig.lab.json --noEmit",
84
85
  "lint": "eslint src lab",
85
86
  "lab": "tsx lab/cli.ts",
86
- "test": "NODE_OPTIONS=--experimental-vm-modules jest"
87
+ "test": "NODE_OPTIONS=--experimental-vm-modules jest",
88
+ "verify:upgrade-fixtures": "tsx scripts/verify-upgrade-fixtures.mjs",
89
+ "gen:legacy-game-baselines": "tsx scripts/gen-legacy-game-baselines.mjs"
87
90
  }
88
91
  }