@bitmagic/cli 0.1.83-dev.2 → 0.1.83-dev.4

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 (160) 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/assets/vxl-summary.js +1 -1
  7. package/dist/assets/vxl-summary.js.map +1 -1
  8. package/dist/cli.d.ts +9 -0
  9. package/dist/commands/steam-upload.js +6 -4
  10. package/dist/commands/steam-upload.js.map +1 -1
  11. package/dist/commands/steam.js +4 -2
  12. package/dist/commands/steam.js.map +1 -1
  13. package/dist/commands/upgrade.d.ts +18 -0
  14. package/dist/commands/upgrade.js +94 -1
  15. package/dist/commands/upgrade.js.map +1 -1
  16. package/dist/config/environments.d.ts +1 -1
  17. package/dist/editor/animation-preview-page.js +20 -0
  18. package/dist/editor/animation-preview-page.js.map +1 -1
  19. package/dist/editor/asset-viewer.js +4 -0
  20. package/dist/editor/asset-viewer.js.map +1 -1
  21. package/dist/editor/design.d.ts +2 -2
  22. package/dist/editor/design.js +2 -2
  23. package/dist/editor/design.js.map +1 -1
  24. package/dist/editor/hud-replay-page.js +5 -0
  25. package/dist/editor/hud-replay-page.js.map +1 -1
  26. package/dist/editor/recording-sink.js +1 -1
  27. package/dist/editor/runtime-token.d.ts +61 -0
  28. package/dist/editor/runtime-token.js +74 -0
  29. package/dist/editor/runtime-token.js.map +1 -0
  30. package/dist/editor/save.d.ts +2 -2
  31. package/dist/editor/server.js +39 -12
  32. package/dist/editor/server.js.map +1 -1
  33. package/dist/editor/shell-page.d.ts +12 -8
  34. package/dist/editor/shell-page.js +69 -10
  35. package/dist/editor/shell-page.js.map +1 -1
  36. package/dist/forge/browser-host.d.ts +1 -1
  37. package/dist/forge/browser-host.js +14 -11
  38. package/dist/forge/browser-host.js.map +1 -1
  39. package/dist/generate/model.js +4 -1
  40. package/dist/generate/model.js.map +1 -1
  41. package/dist/generate/prop.js +4 -1
  42. package/dist/generate/prop.js.map +1 -1
  43. package/dist/http/signed-upload.d.ts +6 -4
  44. package/dist/http/signed-upload.js +37 -14
  45. package/dist/http/signed-upload.js.map +1 -1
  46. package/dist/mobile/rewrite-shim.js +1 -1
  47. package/dist/project/published-three.js +4 -6
  48. package/dist/project/published-three.js.map +1 -1
  49. package/dist/publish/game-exchange.js +9 -3
  50. package/dist/publish/game-exchange.js.map +1 -1
  51. package/dist/scaffold/blender-level-skill-files.js +2 -2
  52. package/dist/scaffold/game-migration.d.ts +88 -0
  53. package/dist/scaffold/game-migration.js +492 -0
  54. package/dist/scaffold/game-migration.js.map +1 -0
  55. package/dist/scaffold/import-codemod.d.ts +51 -0
  56. package/dist/scaffold/import-codemod.js +117 -0
  57. package/dist/scaffold/import-codemod.js.map +1 -0
  58. package/dist/scaffold/legacy-game-baselines.d.ts +14 -0
  59. package/dist/scaffold/legacy-game-baselines.js +218 -0
  60. package/dist/scaffold/legacy-game-baselines.js.map +1 -0
  61. package/dist/scaffold/project-files.d.ts +1 -1
  62. package/dist/scaffold/project-files.js +13 -47
  63. package/dist/scaffold/project-files.js.map +1 -1
  64. package/dist/scaffold/project.js +8 -17
  65. package/dist/scaffold/project.js.map +1 -1
  66. package/dist/smoke/run.js +8 -1
  67. package/dist/smoke/run.js.map +1 -1
  68. package/dist/steam/art-generate.js +2 -1
  69. package/dist/steam/art-generate.js.map +1 -1
  70. package/dist/steam/art-render.js.map +1 -1
  71. package/dist/steam/art.js +1 -1
  72. package/dist/steam/art.js.map +1 -1
  73. package/dist/steam/check.js.map +1 -1
  74. package/dist/steam/electron-cache.d.ts +1 -1
  75. package/dist/steam/electron-cache.js +2 -2
  76. package/dist/steam/electron-cache.js.map +1 -1
  77. package/dist/steam/fuses.js +1 -1
  78. package/dist/steam/fuses.js.map +1 -1
  79. package/dist/steam/media.js +6 -2
  80. package/dist/steam/media.js.map +1 -1
  81. package/dist/steam/package-windows.d.ts +1 -2
  82. package/dist/steam/package-windows.js +1 -2
  83. package/dist/steam/package-windows.js.map +1 -1
  84. package/dist/steam/paths.d.ts +0 -2
  85. package/dist/steam/paths.js +0 -1
  86. package/dist/steam/paths.js.map +1 -1
  87. package/dist/steam/portal.js +1 -1
  88. package/dist/steam/portal.js.map +1 -1
  89. package/dist/steam/raster.d.ts +0 -1
  90. package/dist/steam/raster.js +1 -1
  91. package/dist/steam/raster.js.map +1 -1
  92. package/dist/steam/store-copy.d.ts +0 -1
  93. package/dist/steam/store-copy.js +3 -10
  94. package/dist/steam/store-copy.js.map +1 -1
  95. package/dist/steam/tags.js +6 -3
  96. package/dist/steam/tags.js.map +1 -1
  97. package/dist/theme/kernel.d.ts +14 -0
  98. package/dist/theme/kernel.js +15 -0
  99. package/dist/theme/kernel.js.map +1 -0
  100. package/dist/theme/theme-io.js +11 -16
  101. package/dist/theme/theme-io.js.map +1 -1
  102. package/dist/trailer/record-session.d.ts +1 -1
  103. package/dist/trailer/record-session.js +5 -8
  104. package/dist/trailer/record-session.js.map +1 -1
  105. package/dist/trailer/vendored-recorder.d.ts +8 -0
  106. package/dist/trailer/vendored-recorder.js +26 -0
  107. package/dist/trailer/vendored-recorder.js.map +1 -0
  108. package/dist/vendor/hud-theme/catalog.js +71 -0
  109. package/dist/vendor/hud-theme/engine/hud/ThemeTokens.js +115 -0
  110. package/dist/{theme/theme-color-math.js → vendor/hud-theme/engine/hud/colorMath.js} +13 -14
  111. package/dist/vendor/hud-theme/engine/hud/decorations.js +179 -0
  112. package/dist/vendor/hud-theme/engine/hud/fonts.js +147 -0
  113. package/dist/vendor/hud-theme/engine/hud/presets.js +80 -0
  114. package/dist/vendor/hud-theme/engine/hud/resolveWorldTheme.js +66 -0
  115. package/dist/vendor/hud-theme/engine/hud/themes/bitmagic.js +29 -0
  116. package/dist/vendor/hud-theme/engine/hud/themes/nexus.js +69 -0
  117. package/dist/vendor/hud-theme/engine/hud/themes/racing.js +57 -0
  118. package/dist/vendor/hud-theme/engine/hud/themes/rift-raider.js +63 -0
  119. package/dist/vendor/hud-theme/engine/hud/themes/simulator.js +55 -0
  120. package/dist/vendor/hud-theme/engine/hud/themes/village-keep.js +108 -0
  121. package/dist/vendor/hud-theme/engine/hud/validateTheme.js +535 -0
  122. package/dist/vendor/hud-theme/index.js +26 -0
  123. package/dist/{theme/theme-merge.js → vendor/hud-theme/merge.js} +0 -1
  124. package/dist/{theme/theme-report.js → vendor/hud-theme/report.js} +8 -9
  125. package/dist/{theme/theme-stored.js → vendor/hud-theme/stored.js} +6 -9
  126. package/dist/{theme/theme-validate.js → vendor/hud-theme/validate-strict.js} +102 -164
  127. package/dist/verify/browser.d.ts +6 -0
  128. package/dist/verify/browser.js +30 -3
  129. package/dist/verify/browser.js.map +1 -1
  130. package/dist/verify/categories.d.ts +1 -1
  131. package/dist/verify/categories.js +1 -0
  132. package/dist/verify/categories.js.map +1 -1
  133. package/dist/verify/classify.d.ts +7 -0
  134. package/dist/verify/classify.js +7 -0
  135. package/dist/verify/classify.js.map +1 -1
  136. package/dist/verify/hud-theme.d.ts +19 -14
  137. package/dist/verify/hud-theme.js +23 -17
  138. package/dist/verify/hud-theme.js.map +1 -1
  139. package/dist/verify/mobile-parity.d.ts +1 -1
  140. package/dist/verify/mobile-parity.js +1 -1
  141. package/dist/verify/model-downloads.d.ts +47 -0
  142. package/dist/verify/model-downloads.js +127 -0
  143. package/dist/verify/model-downloads.js.map +1 -0
  144. package/dist/verify/start.d.ts +3 -2
  145. package/dist/verify/start.js +1 -1
  146. package/dist/verify/start.js.map +1 -1
  147. package/package.json +11 -7
  148. package/dist/theme/hud-theme-catalog.d.ts +0 -235
  149. package/dist/theme/hud-theme-catalog.js +0 -389
  150. package/dist/theme/hud-theme-catalog.js.map +0 -1
  151. package/dist/theme/theme-color-math.d.ts +0 -21
  152. package/dist/theme/theme-color-math.js.map +0 -1
  153. package/dist/theme/theme-merge.d.ts +0 -36
  154. package/dist/theme/theme-merge.js.map +0 -1
  155. package/dist/theme/theme-report.d.ts +0 -28
  156. package/dist/theme/theme-report.js.map +0 -1
  157. package/dist/theme/theme-stored.d.ts +0 -21
  158. package/dist/theme/theme-stored.js.map +0 -1
  159. package/dist/theme/theme-validate.d.ts +0 -41
  160. package/dist/theme/theme-validate.js.map +0 -1
@@ -8,7 +8,7 @@ export interface Environment {
8
8
  * deployment and needs no token.
9
9
  *
10
10
  * The engine can pick this host itself, but only from the page's own hostname
11
- * (`game/src/engine/environment.ts`), and localhost tells it nothing — it reads as
11
+ * (`game/src/engine/runtime/environment.ts`), and localhost tells it nothing — it reads as
12
12
  * neither prod nor dev and so always resolves to the dev cluster. Here the project's
13
13
  * pinned environment is known, so `bitmagic dev` hands the answer to the engine
14
14
  * rather than letting it guess (see the LOAD_GAME `gameServerUrl` in editor/server.ts).
@@ -16,6 +16,11 @@
16
16
  * An engine too old to carry `debug/AnimationPreview.js` fails the module import; the catch
17
17
  * posts `ASSET_PREVIEW_FAILED`, and the shell shows the reason — same contract as the asset
18
18
  * viewer, one handler on the shell side for both.
19
+ *
20
+ * The page runs against the PROJECT's vendored engine, whatever its version, so its engine
21
+ * imports keep the old paths (a pre-move engine resolves them natively, a newer one through its
22
+ * compat shim) and the move codemod leaves this file alone:
23
+ * engine-move: ignore-file
19
24
  */
20
25
  import { CDN_IMPORTS } from '../scaffold/project-files.js';
21
26
  import { importMapEntries } from '../scaffold/aliases.js';
@@ -254,6 +259,16 @@ async function ensureKtx2Support() {
254
259
  }
255
260
  }
256
261
 
262
+ /** The vendored baseline's block character factory, or undefined on an engine without one. */
263
+ async function baselineCharacterFactory() {
264
+ try {
265
+ return (await import('baseline/BitmagicPlayerCharacter.js')).bitmagicCharacterFactory;
266
+ } catch (error) {
267
+ console.warn('This engine has no baseline/BitmagicPlayerCharacter.js; its preview picks the character.', error);
268
+ return undefined;
269
+ }
270
+ }
271
+
257
272
  try {
258
273
  await ensureKtx2Support();
259
274
  // A clip NAME resolves through the engine's table; an explicit url is an asset of the
@@ -265,6 +280,11 @@ try {
265
280
  // below with the browser's own "failed to fetch" instead of a blank page.
266
281
  var mod = await import('debug/AnimationPreview.js');
267
282
  var handle = await mod.startAnimationPreview({
283
+ // The block mascot the clip plays on, handed in so the engine's preview need not reach up
284
+ // into the baseline itself (its deprecated fallback). An engine whose baseline still lives
285
+ // under genres/ has no such module: the import fails, and that engine's preview picks its
286
+ // own mascot, as it always did.
287
+ characterFactory: await baselineCharacterFactory(),
268
288
  animationUrl: animationUrl,
269
289
  container: document.getElementById('stage'),
270
290
  characterHeight: mod.DEFAULT_ANIMATION_PREVIEW_OPTIONS.characterHeight,
@@ -1 +1 @@
1
- {"version":3,"file":"animation-preview-page.js","sourceRoot":"","sources":["../../src/editor/animation-preview-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQtE,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,MAAM,GAAG,oBAAoB,QAAQ,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAC/B,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CACzF,CAAC;IACF,sFAAsF;IACtF,qFAAqF;IACrF,OAAO,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAoC;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACrF,OAAO;;;;;EAKP,kBAAkB;;EAElB,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2EnB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6LR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"animation-preview-page.js","sourceRoot":"","sources":["../../src/editor/animation-preview-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQtE,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,MAAM,GAAG,oBAAoB,QAAQ,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAC/B,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CACzF,CAAC;IACF,sFAAsF;IACtF,qFAAqF;IACrF,OAAO,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAoC;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACrF,OAAO;;;;;EAKP,kBAAkB;;EAElB,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2EnB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4MR,CAAC;AACF,CAAC"}
@@ -110,6 +110,10 @@ function countTriangles(root) {
110
110
  /**
111
111
  * Specifiers held in variables on purpose: a literal would make tsc try to resolve a module that
112
112
  * only exists on the other origin at runtime. The import map on the page resolves them.
113
+ * `engine/VoxelObject.js` is the pre-move path on purpose: it is a shim in engines after the move
114
+ * (to `engine/voxel/object/`) and the module itself in every engine before it, so the viewer works
115
+ * against whichever engine the project vendors. The move codemod leaves this file alone:
116
+ * engine-move: ignore-file
113
117
  */
114
118
  const VOXEL_OBJECT_MODULE = 'engine/VoxelObject.js';
115
119
  const GLTF_LOADER_SUPPORT_MODULE = 'engine/loaders/GltfLoaderSupport.js';
@@ -1 +1 @@
1
- {"version":3,"file":"asset-viewer.js","sourceRoot":"","sources":["../../src/editor/asset-viewer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"asset-viewer.js","sourceRoot":"","sources":["../../src/editor/asset-viewer.ts"],"names":[],"mappings":"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"}
@@ -5,14 +5,14 @@
5
5
  * look at — so it follows `creator/DESIGN.md` the way the Creator and the in-engine editor do.
6
6
  * It cannot import the Creator's `BitmagicDesign.css`: this package ships on npm on its own, and
7
7
  * both pages are strings assembled in TypeScript rather than bundled documents. So it re-declares
8
- * the same tokens, exactly as `game/src/editor/editor-styles.ts` does for the engine's editor
8
+ * the same tokens, exactly as `game/src/engine/ui/theme/designTokens.ts` does for the engine's editor
9
9
  * dialogs — three copies of the palette, one source of truth in DESIGN.md.
10
10
  *
11
11
  * **No backticks in anything exported here.** These constants are interpolated into the pages'
12
12
  * template literals, and a backtick would end the literal somewhere else entirely (there is a test
13
13
  * for it: `__tests__/shell-page.test.ts`).
14
14
  */
15
- /** Hex tokens for TS-side use — the same set `game/src/editor/editor-styles.ts` exposes. */
15
+ /** Hex tokens for TS-side use — the same set `game/src/engine/ui/theme/designTokens.ts` exposes. */
16
16
  export declare const BM: {
17
17
  readonly bg: "#0b0b0b";
18
18
  readonly surface: "#181818";
@@ -5,14 +5,14 @@
5
5
  * look at — so it follows `creator/DESIGN.md` the way the Creator and the in-engine editor do.
6
6
  * It cannot import the Creator's `BitmagicDesign.css`: this package ships on npm on its own, and
7
7
  * both pages are strings assembled in TypeScript rather than bundled documents. So it re-declares
8
- * the same tokens, exactly as `game/src/editor/editor-styles.ts` does for the engine's editor
8
+ * the same tokens, exactly as `game/src/engine/ui/theme/designTokens.ts` does for the engine's editor
9
9
  * dialogs — three copies of the palette, one source of truth in DESIGN.md.
10
10
  *
11
11
  * **No backticks in anything exported here.** These constants are interpolated into the pages'
12
12
  * template literals, and a backtick would end the literal somewhere else entirely (there is a test
13
13
  * for it: `__tests__/shell-page.test.ts`).
14
14
  */
15
- /** Hex tokens for TS-side use — the same set `game/src/editor/editor-styles.ts` exposes. */
15
+ /** Hex tokens for TS-side use — the same set `game/src/engine/ui/theme/designTokens.ts` exposes. */
16
16
  export const BM = {
17
17
  bg: '#0b0b0b',
18
18
  surface: '#181818',
@@ -1 +1 @@
1
- {"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/editor/design.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,4FAA4F;AAC5F,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,EAAE,EAAE,SAAS;IACb,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,SAAS;IAEtB,WAAW,EAAE,SAAS;IACtB,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,SAAS;IAEvB,MAAM,EAAE,SAAS;IACjB,WAAW,EAAE,SAAS;IAEtB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IAEjB,YAAY,EAAE,+BAA+B;IAC7C,UAAU,EAAE,8BAA8B;IAC1C,QAAQ,EAAE,oCAAoC;IAC9C;sGACkG;IAClG,SAAS,EAAE,qCAAqC;IAChD,QAAQ,EAAE,kCAAkC;IAC5C,cAAc,EAAE,yBAAyB;IACzC,gBAAgB,EAAE,8DAA8D;IAEhF,IAAI,EAAE,8EAA8E;IACpF,QAAQ,EAAE,gDAAgD;CAClD,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;0HAEwF,CAAC;AAE3H,uFAAuF;AACvF,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;eAGpB,EAAE,CAAC,EAAE;oBACA,EAAE,CAAC,OAAO;wBACN,EAAE,CAAC,UAAU;yBACZ,EAAE,CAAC,WAAW;iBACtB,EAAE,CAAC,WAAW;uBACR,EAAE,CAAC,SAAS;qBACd,EAAE,CAAC,OAAO;mBACZ,EAAE,CAAC,MAAM;yBACH,EAAE,CAAC,WAAW;iBACtB,EAAE,CAAC,IAAI;uBACD,EAAE,CAAC,SAAS;iBAClB,EAAE,CAAC,IAAI;uBACD,EAAE,CAAC,SAAS;oBACf,EAAE,CAAC,OAAO;mBACX,EAAE,CAAC,MAAM;;;;;;;0BAOF,EAAE,CAAC,YAAY;wBACjB,EAAE,CAAC,UAAU;sBACf,EAAE,CAAC,QAAQ;uBACV,EAAE,CAAC,SAAS;sBACb,EAAE,CAAC,QAAQ;iBAChB,EAAE,CAAC,IAAI;sBACF,EAAE,CAAC,QAAQ;;CAEhC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAqInB,EAAE,CAAC,cAAc;;;;;;;kCAOD,EAAE,CAAC,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDpD,CAAC"}
1
+ {"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/editor/design.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,oGAAoG;AACpG,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,EAAE,EAAE,SAAS;IACb,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,SAAS;IAEtB,WAAW,EAAE,SAAS;IACtB,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,SAAS;IAEvB,MAAM,EAAE,SAAS;IACjB,WAAW,EAAE,SAAS;IAEtB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IAEjB,YAAY,EAAE,+BAA+B;IAC7C,UAAU,EAAE,8BAA8B;IAC1C,QAAQ,EAAE,oCAAoC;IAC9C;sGACkG;IAClG,SAAS,EAAE,qCAAqC;IAChD,QAAQ,EAAE,kCAAkC;IAC5C,cAAc,EAAE,yBAAyB;IACzC,gBAAgB,EAAE,8DAA8D;IAEhF,IAAI,EAAE,8EAA8E;IACpF,QAAQ,EAAE,gDAAgD;CAClD,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;0HAEwF,CAAC;AAE3H,uFAAuF;AACvF,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;eAGpB,EAAE,CAAC,EAAE;oBACA,EAAE,CAAC,OAAO;wBACN,EAAE,CAAC,UAAU;yBACZ,EAAE,CAAC,WAAW;iBACtB,EAAE,CAAC,WAAW;uBACR,EAAE,CAAC,SAAS;qBACd,EAAE,CAAC,OAAO;mBACZ,EAAE,CAAC,MAAM;yBACH,EAAE,CAAC,WAAW;iBACtB,EAAE,CAAC,IAAI;uBACD,EAAE,CAAC,SAAS;iBAClB,EAAE,CAAC,IAAI;uBACD,EAAE,CAAC,SAAS;oBACf,EAAE,CAAC,OAAO;mBACX,EAAE,CAAC,MAAM;;;;;;;0BAOF,EAAE,CAAC,YAAY;wBACjB,EAAE,CAAC,UAAU;sBACf,EAAE,CAAC,QAAQ;uBACV,EAAE,CAAC,SAAS;sBACb,EAAE,CAAC,QAAQ;iBAChB,EAAE,CAAC,IAAI;sBACF,EAAE,CAAC,QAAQ;;CAEhC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAqInB,EAAE,CAAC,cAAc;;;;;;;kCAOD,EAAE,CAAC,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDpD,CAAC"}
@@ -30,6 +30,11 @@
30
30
  * and runs against whichever engine the project has vendored, so a named import of something that
31
31
  * engine predates would fail the whole module load (and with it every overlay) rather than one
32
32
  * optional nicety.
33
+ *
34
+ * For the same reason the engine paths here stay the OLD ones (`engine/GameHUD.js`): every engine
35
+ * resolves them, a pre-move one natively and a newer one through its compat shim, while a moved
36
+ * path fails on every project that vendored an engine from before the move.
37
+ * engine-move: ignore-file
33
38
  */
34
39
  import { CDN_IMPORTS } from '../scaffold/project-files.js';
35
40
  import { importMapEntries } from '../scaffold/aliases.js';
@@ -1 +1 @@
1
- {"version":3,"file":"hud-replay-page.js","sourceRoot":"","sources":["../../src/editor/hud-replay-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO1D,oGAAoG;AACpG,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,MAAM,GAAG,oBAAoB,QAAQ,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAC9B,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CACvF,CAAC;IACF,OAAO,EAAE,GAAG,WAAW,EAAE,GAAG,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrD,OAAO;;;;;;+BAMsB,OAAO,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;EAmB7C,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2brC,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"hud-replay-page.js","sourceRoot":"","sources":["../../src/editor/hud-replay-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO1D,oGAAoG;AACpG,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,MAAM,GAAG,oBAAoB,QAAQ,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAC9B,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CACvF,CAAC;IACF,OAAO,EAAE,GAAG,WAAW,EAAE,GAAG,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrD,OAAO;;;;;;+BAMsB,OAAO,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;EAmB7C,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2brC,CAAC;AACF,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * The F9 recording sink: where the engine's ScreenRecorder streams gameplay frames when the dev
3
3
  * view is the host.
4
4
  *
5
- * The recorder (`game/src/debug/ScreenRecorder.ts`, vendored into every project) POSTs one PNG per
5
+ * The recorder (`game/src/engine/recording/ScreenRecorder.ts`, vendored into every project) POSTs one PNG per
6
6
  * frame to `/api/dev/save-frame` and, at stop, one JSON manifest to
7
7
  * `/api/dev/save-recording-timeline`. Until the shell announced this sidecar as the sink, those
8
8
  * POSTs went to `getAgentUrl()` — the upload proxy (which 404s them) or a dead `localhost:4111` —
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Runtime tokens for the game the dev view is running (docs/runtime-ai-auth.md).
3
+ *
4
+ * game-server refuses runtime AI (NPC chat, decisions, images, meshes, speech) and screenshot
5
+ * uploads without a short-lived runtime token for the game. A game a creator is still building is
6
+ * not published, so the engine cannot mint one on its own at the hosted game-server. In creator
7
+ * mode it asks its parent frame instead (`BM_RUNTIME_TOKEN_REQUEST`), and in the dev view that
8
+ * parent is the shell page — the role the web Creator's `RuntimeTokenBridge` plays there.
9
+ *
10
+ * The shell page cannot mint: the creator's credential lives with the CLI, not in a browser. So it
11
+ * forwards the request here, and the sidecar mints at game-server's `POST /api/runtime-token` with
12
+ * the CLI's own Auth0 access token (`bitmagic login`). That is game-server's `creator` lane, the
13
+ * same one the web Creator uses: the token is the same tenant and audience game-server verifies,
14
+ * the caller is the account, and the caps are per account, per game and global. Only the runtime
15
+ * token goes back to the page. The Auth0 token never leaves this process.
16
+ *
17
+ * Guards, each mirroring the Creator's bridge:
18
+ * - The Auth0 token is sent only to the game-server this project's environment names, never to a
19
+ * URL the page supplies. A request for any other server (a game-server on 1666, which mints
20
+ * without a credential) is answered with no token, and the engine asks that server itself.
21
+ * - Only for this project's game. The `creator` lane would mint for any id; this sidecar does not
22
+ * need to.
23
+ * - Only for the shell page itself (`isShellRequest`). Every other sidecar route answers CORS `*`,
24
+ * and a page on some other site the creator has open must not be able to collect tokens charged
25
+ * to their account.
26
+ *
27
+ * Logged out, offline, or refused: the answer is "no token", quickly, so the engine moves on to
28
+ * minting directly — which still works for a published game — instead of waiting out its 5-second
29
+ * editor timeout.
30
+ */
31
+ import type { IncomingHttpHeaders } from 'http';
32
+ export interface RuntimeTokenRequest {
33
+ gameId: string;
34
+ gameServerUrl: string;
35
+ }
36
+ export interface RuntimeTokenAnswer {
37
+ token: string | null;
38
+ expiresAt: number | null;
39
+ /** Why there is no token, for the sidecar's log and the tests. Never shown to the game. */
40
+ reason?: 'other_server' | 'other_game' | 'logged_out' | 'refused' | 'unreachable' | 'no_server';
41
+ }
42
+ export interface MintRuntimeTokenDeps {
43
+ /** The game-server this project's environment names, or null when it cannot be resolved. */
44
+ gameServerUrl: string | null;
45
+ /** The game this project owns (`bitmagic.json`). */
46
+ projectGameId: string;
47
+ /** The CLI's Auth0 access token, or null when nobody is logged in. Never starts a login. */
48
+ getAccessToken: () => Promise<string | null>;
49
+ fetch: typeof globalThis.fetch;
50
+ }
51
+ /** The body the shell forwards, or null when it is not one. */
52
+ export declare function parseRuntimeTokenRequest(body: unknown): RuntimeTokenRequest | null;
53
+ /**
54
+ * True when the request comes from the shell page on this sidecar's own origin.
55
+ *
56
+ * A browser sets `Origin` on every POST, same-origin included, and a page cannot forge it, so this
57
+ * is what separates the shell from any other tab. A local process could forge it, but a local
58
+ * process can read the CLI's credentials file directly, so there is nothing to protect from it.
59
+ */
60
+ export declare function isShellRequest(headers: IncomingHttpHeaders, port: number): boolean;
61
+ export declare function mintRuntimeToken(request: RuntimeTokenRequest, deps: MintRuntimeTokenDeps): Promise<RuntimeTokenAnswer>;
@@ -0,0 +1,74 @@
1
+ const GAME_ID_RE = /^[A-Za-z0-9]{12}(?:-v\d+)?$/;
2
+ const MINT_TIMEOUT_MS = 8_000;
3
+ /** `ABCDEF123456-v3` and `ABCDEF123456` are one game, as game-server counts them. */
4
+ function baseGameId(gameId) {
5
+ return gameId.replace(/-v\d+$/, '');
6
+ }
7
+ function originOf(url) {
8
+ try {
9
+ return new URL(url).origin;
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
15
+ /** The body the shell forwards, or null when it is not one. */
16
+ export function parseRuntimeTokenRequest(body) {
17
+ if (typeof body !== 'object' || body === null)
18
+ return null;
19
+ const { gameId, gameServerUrl } = body;
20
+ if (typeof gameId !== 'string' || !GAME_ID_RE.test(gameId))
21
+ return null;
22
+ if (typeof gameServerUrl !== 'string' || gameServerUrl.length > 2048)
23
+ return null;
24
+ return { gameId, gameServerUrl };
25
+ }
26
+ /**
27
+ * True when the request comes from the shell page on this sidecar's own origin.
28
+ *
29
+ * A browser sets `Origin` on every POST, same-origin included, and a page cannot forge it, so this
30
+ * is what separates the shell from any other tab. A local process could forge it, but a local
31
+ * process can read the CLI's credentials file directly, so there is nothing to protect from it.
32
+ */
33
+ export function isShellRequest(headers, port) {
34
+ const origin = headers.origin;
35
+ return origin === `http://localhost:${port}` || origin === `http://127.0.0.1:${port}`;
36
+ }
37
+ export async function mintRuntimeToken(request, deps) {
38
+ const none = (reason) => ({ token: null, expiresAt: null, reason });
39
+ if (!deps.gameServerUrl)
40
+ return none('no_server');
41
+ const trusted = originOf(deps.gameServerUrl);
42
+ if (!trusted || originOf(request.gameServerUrl) !== trusted)
43
+ return none('other_server');
44
+ if (baseGameId(request.gameId) !== baseGameId(deps.projectGameId))
45
+ return none('other_game');
46
+ const accessToken = await deps.getAccessToken();
47
+ if (!accessToken)
48
+ return none('logged_out');
49
+ let response;
50
+ try {
51
+ response = await deps.fetch(`${trusted}/api/runtime-token`, {
52
+ method: 'POST',
53
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` },
54
+ body: JSON.stringify({ gameId: request.gameId }),
55
+ signal: AbortSignal.timeout(MINT_TIMEOUT_MS),
56
+ });
57
+ }
58
+ catch {
59
+ return none('unreachable');
60
+ }
61
+ if (!response.ok)
62
+ return none('refused');
63
+ let data;
64
+ try {
65
+ data = (await response.json());
66
+ }
67
+ catch {
68
+ return none('refused');
69
+ }
70
+ if (typeof data.token !== 'string' || !data.token)
71
+ return none('refused');
72
+ return { token: data.token, expiresAt: typeof data.expiresAt === 'number' ? data.expiresAt : null };
73
+ }
74
+ //# sourceMappingURL=runtime-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-token.js","sourceRoot":"","sources":["../../src/editor/runtime-token.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@
13
13
  * stays a dumb relay of `SCENE_HAS_CHANGES` and `SCENE_EDITING_STATUS`.
14
14
  */
15
15
  import type { WorldJsonModification, WorldJsonShape } from '@bitmagic/world-forger/pipeline/index.js';
16
- /** The engine's `SCENE_HAS_CHANGES` reply (`CreatorMessageHandler.ts`, `CHECK_SCENE_CHANGES`). */
16
+ /** The engine's `SCENE_HAS_CHANGES` reply (`CHECK_SCENE_CHANGES` in the creator bridge's `domains/scene.ts`). */
17
17
  export interface SceneChangeReport {
18
18
  hasChanges?: boolean;
19
19
  modifiedObjectIds?: string[];
@@ -26,7 +26,7 @@ export interface SceneChangeReport {
26
26
  } | null;
27
27
  pendingSpawnPoints?: Array<Record<string, unknown>> | null;
28
28
  }
29
- /** The engine's `SCENE_EDITING_STATUS` reply (`CreatorMessageHandler.ts`, line ~1463). */
29
+ /** The engine's `SCENE_EDITING_STATUS` reply (`GET_SCENE_EDITING_STATUS` in the creator bridge's `domains/scene.ts`). */
30
30
  export interface SceneEditingStatus {
31
31
  unlocked?: boolean;
32
32
  environmentObjects?: Array<Record<string, unknown>>;
@@ -25,6 +25,7 @@ import { applyModificationsToWorld } from '../forge/apply-modifications.js';
25
25
  import { readProjectGameData } from '../forge/browser-host.js';
26
26
  import { projectWorldJsonPath } from '../forge/run-pipeline.js';
27
27
  import { renderEditorShell } from './shell-page.js';
28
+ import { readVendoredRecorderSource } from '../trailer/vendored-recorder.js';
28
29
  import { readGameInfo, readGameInfoImage } from './game-info.js';
29
30
  import { createCliUpdateReader } from './cli-update.js';
30
31
  import { renderAssetPreviewPage } from './asset-preview-page.js';
@@ -52,6 +53,7 @@ import { writeDevViewRecord } from './tab-reuse.js';
52
53
  import { RECORDING_BODY_LIMIT_BYTES, parseSaveFrameRequest, parseTimelineRequest, writeRecordingFrame, writeRecordingTimeline, } from './recording-sink.js';
53
54
  import { renderHudReplayHtml } from './hud-replay-page.js';
54
55
  import { attachRecordingStream } from './recording-stream.js';
56
+ import { isShellRequest, mintRuntimeToken, parseRuntimeTokenRequest } from './runtime-token.js';
55
57
  /** A shell poll this recent counts as a tab being there, when its stream has not reconnected yet. */
56
58
  const SHELL_POLL_RECENT_MS = 2_000;
57
59
  /** Bodies are a scene snapshot, not an upload — a megabyte is already generous. */
@@ -95,20 +97,15 @@ function readBodyBuffer(req, maxBytes) {
95
97
  });
96
98
  }
97
99
  /**
98
- * Whether `<root>/engine/debug/ScreenRecorder.ts` — the engine source scaffolding vendors into
99
- * every project — understands the host-announced recording sink (`settings.sinkUrl`). An engine
100
- * vendored before the field silently keeps its legacy save paths, and the settings message is
101
- * fire-and-forget with F9 engine-internal, so this static probe is the only detection there is;
102
- * the recording panel uses it to say "run bitmagic upgrade" instead of letting F9 look broken.
100
+ * Whether the recorder the project vendors (`engine/engine/recording/ScreenRecorder.ts`, or
101
+ * `engine/debug/ScreenRecorder.ts` in a project vendored before it moved) understands the
102
+ * host-announced recording sink (`settings.sinkUrl`). An engine vendored before the field silently
103
+ * keeps its legacy save paths, and the settings message is fire-and-forget with F9
104
+ * engine-internal, so this static probe is the only detection there is; the recording panel uses
105
+ * it to say "run bitmagic upgrade" instead of letting F9 look broken.
103
106
  */
104
107
  function vendoredRecorderSupportsSink(root) {
105
- try {
106
- return fs.readFileSync(path.join(root, 'engine', 'debug', 'ScreenRecorder.ts'), 'utf-8')
107
- .includes('sinkUrl');
108
- }
109
- catch {
110
- return false;
111
- }
108
+ return readVendoredRecorderSource(root)?.includes('sinkUrl') ?? false;
112
109
  }
113
110
  /** What a caught error says to a creator. Every handler below reports failures the same way. */
114
111
  function messageOf(error) {
@@ -1030,6 +1027,36 @@ export async function startEditorServer(options) {
1030
1027
  }
1031
1028
  return;
1032
1029
  }
1030
+ /**
1031
+ * The engine's runtime-token request, forwarded by the shell page (runtime-token.ts). The
1032
+ * shell answers the game frame's BM_RUNTIME_TOKEN_REQUEST with what this returns, so the
1033
+ * engine gets a `creator` token minted with the CLI login — and never the login itself.
1034
+ */
1035
+ if (req.method === 'POST' && url === '/api/runtime-token') {
1036
+ if (!isShellRequest(req.headers, options.port)) {
1037
+ sendJson(res, 403, { ok: false, error: 'Only the dev view may ask for a runtime token' });
1038
+ return;
1039
+ }
1040
+ const payload = await readJsonBody(req, res);
1041
+ if (payload === undefined)
1042
+ return;
1043
+ const request = parseRuntimeTokenRequest(payload);
1044
+ if (!request) {
1045
+ sendJson(res, 400, { ok: false, error: 'Expected { gameId, gameServerUrl }' });
1046
+ return;
1047
+ }
1048
+ const answer = await mintRuntimeToken(request, {
1049
+ gameServerUrl: resolveGameServerUrl(),
1050
+ projectGameId: options.gameId,
1051
+ getAccessToken: async () => (await resolveAuth())?.token ?? null,
1052
+ fetch: globalThis.fetch,
1053
+ });
1054
+ if (answer.reason === 'refused' || answer.reason === 'unreachable') {
1055
+ log(`Runtime AI token: game-server ${answer.reason === 'refused' ? 'refused it' : 'unreachable'}; runtime AI works only if the game is published.`);
1056
+ }
1057
+ sendJson(res, 200, { ok: true, token: answer.token, expiresAt: answer.expiresAt });
1058
+ return;
1059
+ }
1033
1060
  if (req.method === 'GET' && url === '/api/game-data') {
1034
1061
  try {
1035
1062
  // Resolved per boot rather than once at startup, so signing in and reloading the page is