@volter/game-editor 0.5.155 → 0.5.157

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 (294) hide show
  1. package/BUNDLED_NOTICES +22 -22
  2. package/catalog/entries/blender.json +2 -2
  3. package/catalog/entries/music.json +2 -2
  4. package/dist/.vite/manifest.json +2156 -2156
  5. package/dist/assets/{AssetBudgetPanel-B2Wb7-b1.js → AssetBudgetPanel-X38cPCO3.js} +3 -3
  6. package/dist/assets/{AudioViewer-gge--M-h.js → AudioViewer-xMM7RZH9.js} +1 -1
  7. package/dist/assets/{CanvasBoardDocument-CyGiXrEJ.js → CanvasBoardDocument-DCyh4eaO.js} +1 -1
  8. package/dist/assets/{CanvasSceneViewport-ChG9oRS8.js → CanvasSceneViewport-BA8eRjJY.js} +1 -1
  9. package/dist/assets/{ColorInput-Dzpqy-J3.js → ColorInput-y8NzQ5q8.js} +1 -1
  10. package/dist/assets/{ColorPicker-CqJPBHlh.js → ColorPicker-C3HI90eU.js} +1 -1
  11. package/dist/assets/{EntityModelDocument-D7XDf6uB.js → EntityModelDocument-DrWN0e0N.js} +1 -1
  12. package/dist/assets/{EnvironmentAssetDocument-BgO7Hl3g.js → EnvironmentAssetDocument-Bv8M7C1O.js} +1 -1
  13. package/dist/assets/{GameplaySessionTimeline-BBmwHCKA.js → GameplaySessionTimeline-mMVtRemn.js} +1 -1
  14. package/dist/assets/{ImageViewer-BjxoscVa.js → ImageViewer-D1mswm2G.js} +1 -1
  15. package/dist/assets/InspectorObjectPreview-DMNRuc0X.js +1 -0
  16. package/dist/assets/{JsonAssetDocument-D81JuRAm.js → JsonAssetDocument-DxLYMceV.js} +1 -1
  17. package/dist/assets/{LiveModuleDocument-bgStMiU1.js → LiveModuleDocument-BOO4_ypf.js} +1 -1
  18. package/dist/assets/{LutAssetDocument-cl9Jq0Zw.js → LutAssetDocument-jf9ogNqN.js} +1 -1
  19. package/dist/assets/{ModelAssetDocument-CYCLKpxJ.js → ModelAssetDocument-DbtKJsGQ.js} +1 -1
  20. package/dist/assets/{NonThreeAuthoringBootstrap-DhHjvD5d.js → NonThreeAuthoringBootstrap-ChEoVJQP.js} +1 -1
  21. package/dist/assets/{Object3DDocumentToolbar-CQbARBIW.js → Object3DDocumentToolbar-Y-jpI3WD.js} +1 -1
  22. package/dist/assets/Object3DDocumentViewport-BOi94JfA.js +2 -0
  23. package/dist/assets/{Object3DPreview-BOZYzjz_.js → Object3DPreview-7LnLFpmg.js} +1 -1
  24. package/dist/assets/{OnlineAssetDetail-DdKHHjxg.js → OnlineAssetDetail-DVdZv1D1.js} +1 -1
  25. package/dist/assets/{PlayBar-CAarfEOh.js → PlayBar-B-GGRbBB.js} +1 -1
  26. package/dist/assets/{QuarksAssetDocument-GTbawoy7.js → QuarksAssetDocument-2MqOJHlY.js} +1 -1
  27. package/dist/assets/{ReactCanvasControls-DIFkxeKv.js → ReactCanvasControls-COp1PvO1.js} +1 -1
  28. package/dist/assets/{RootSelectionOverlay-Dv_w1D9s.js → RootSelectionOverlay-6M-HHI3M.js} +1 -1
  29. package/dist/assets/{ShaderAssetDocument-OA-nshNN.js → ShaderAssetDocument-PrwCSYxk.js} +1 -1
  30. package/dist/assets/{ShadowEditor-Cp1QVCo9.js → ShadowEditor-EXaJ1Kud.js} +1 -1
  31. package/dist/assets/{SourceAssetViewer-CGGHBzgL.js → SourceAssetViewer-Bk_LGk7S.js} +1 -1
  32. package/dist/assets/{StageHost-BMgCrIPG.js → StageHost-CK78ezTC.js} +2 -2
  33. package/dist/assets/{StoryPreviewMount-CyF7FwI7.js → StoryPreviewMount-IbbNNzF4.js} +1 -1
  34. package/dist/assets/{ThreeBoardDocument-DCJkLWU8.js → ThreeBoardDocument-DUakOh0j.js} +2 -2
  35. package/dist/assets/{ThreeIsolationSceneContent-CxsM-QHW.js → ThreeIsolationSceneContent-BjAyHzL2.js} +1 -1
  36. package/dist/assets/{ToolObject3DPreview-lsAoRxtr.js → ToolObject3DPreview-CRb_pBHc.js} +1 -1
  37. package/dist/assets/{Toolbar-yvFlRv8R.js → Toolbar-Bb7KArdo.js} +1 -1
  38. package/dist/assets/{TransientHint-Bslncm_l.js → TransientHint-BlB2atrU.js} +1 -1
  39. package/dist/assets/{VideoViewer-Ba-e91kP.js → VideoViewer-D5fNjrcg.js} +1 -1
  40. package/dist/assets/{ViewportShadingMenu-CgbuQ0e-.js → ViewportShadingMenu-D_-wHbzW.js} +1 -1
  41. package/dist/assets/{active-ingest-CJ2U5L1O.js → active-ingest-DJ8FmH5M.js} +2 -2
  42. package/dist/assets/{animation-clock-CVpGQSVj.js → animation-clock-CINkiVZd.js} +1 -1
  43. package/dist/assets/{animation-mixers.service-CI0K1tfi.js → animation-mixers.service-BST_khGa.js} +1 -1
  44. package/dist/assets/{animation-timeline.utility-Wg6WxkxK.js → animation-timeline.utility-X54fMzvE.js} +1 -1
  45. package/dist/assets/{asset-budget-asset.menu-BbCBxjLY.js → asset-budget-asset.menu-CfJth8-V.js} +1 -1
  46. package/dist/assets/{asset-budget.action-CK8h0v1A.js → asset-budget.action-ByyoIoUI.js} +1 -1
  47. package/dist/assets/{asset-budget.document-CYVcDLvH.js → asset-budget.document-CO1NrMEa.js} +1 -1
  48. package/dist/assets/{asset-budget.menu-BcTijQ2R.js → asset-budget.menu-Cb99KwLd.js} +1 -1
  49. package/dist/assets/{asset-editor-persistence-DWp0E8cc.js → asset-editor-persistence-BF2Eqt0F.js} +1 -1
  50. package/dist/assets/{asset-loaders-Bo91oPiL.js → asset-loaders-2LtXp4_y.js} +1 -1
  51. package/dist/assets/{asset-preview-BUpxsHNd.js → asset-preview-t-7PYPjJ.js} +1 -1
  52. package/dist/assets/{audio-unlock.service-CyiXe5qk.js → audio-unlock.service-DwkIGA6J.js} +1 -1
  53. package/dist/assets/{audio.utility-BN4mANCx.js → audio.utility-Mn4GcZIb.js} +1 -1
  54. package/dist/assets/autoplay.service-D7c8d5PV.js +1 -0
  55. package/dist/assets/{babylon-authoring-adapter-C-EAsfMr.js → babylon-authoring-adapter-BB5HErRG.js} +1 -1
  56. package/dist/assets/{binding-resolver-DoOAFM2m.js → binding-resolver-CXF3o1ZX.js} +2 -2
  57. package/dist/assets/{blender-node-editor.document-BzkGPs0i.js → blender-node-editor.document-djNJTSeo.js} +1 -1
  58. package/dist/assets/{blender-properties-tab-B1ggqOYB.js → blender-properties-tab-06D6TYA0.js} +1 -1
  59. package/dist/assets/{blender-runtime-host-MJZEPwHA.js → blender-runtime-host-Cqitl1ZO.js} +1 -1
  60. package/dist/assets/{blender-runtime-skin-hw-op7Nt.js → blender-runtime-skin-RX6nlrgy.js} +72 -58
  61. package/dist/assets/{blender-runtime.document-CvTyAou8.js → blender-runtime.document-pgD63Zep.js} +10 -10
  62. package/dist/assets/{blender-screenshot.menu-C4VXpXVa.js → blender-screenshot.menu-DZ44fIU0.js} +1 -1
  63. package/dist/assets/{blender-timeline.document-BRFDd7JZ.js → blender-timeline.document-D53mR9D6.js} +1 -1
  64. package/dist/assets/{blender-uv-editor.document-CM09ITWu.js → blender-uv-editor.document-Dux9ZXaj.js} +1 -1
  65. package/dist/assets/{blender-version.status-CPyc_-kA.js → blender-version.status-hK0_7tRC.js} +1 -1
  66. package/dist/assets/{blender.command-ktKz-2Zi.js → blender.command-BF9RHCP_.js} +1 -1
  67. package/dist/assets/{board-guides-CCiyx8cT.js → board-guides-BYnclES1.js} +1 -1
  68. package/dist/assets/{bridge.command-tP5j6w72.js → bridge.command-CS12Cp-B.js} +3 -3
  69. package/dist/assets/{browserAll-BSQVVrNG.js → browserAll-CGQ_uBbB.js} +1 -1
  70. package/dist/assets/{build-player.document-BwbBXtF5.js → build-player.document-RpeG8U_t.js} +1 -1
  71. package/dist/assets/{build-profiles.document-UiF_BsjE.js → build-profiles.document-DydU-eTF.js} +1 -1
  72. package/dist/assets/{build-progress.status-Bf5KpnxC.js → build-progress.status-arvTBGok.js} +1 -1
  73. package/dist/assets/{build-session-C4jVDt-u.js → build-session-D8B-93_A.js} +1 -1
  74. package/dist/assets/{build.action-DP2d1Uhj.js → build.action-CYKD0CrB.js} +1 -1
  75. package/dist/assets/{build.command-D5pyNcoj.js → build.command-BH-4yWaL.js} +1 -1
  76. package/dist/assets/{build.header-DupBIAOw.js → build.header-B5-bZp5Z.js} +1 -1
  77. package/dist/assets/{build.menu-DWrKtdoV.js → build.menu-CyOe8xXz.js} +1 -1
  78. package/dist/assets/{build.service-qnz73gSX.js → build.service-BuhAa1EB.js} +1 -1
  79. package/dist/assets/{camera-C74U5X7o.js → camera-KM5i-TaU.js} +1 -1
  80. package/dist/assets/{camera-runtime.inspector-B2l34Xhl.js → camera-runtime.inspector-DA-GqhBI.js} +1 -1
  81. package/dist/assets/{canvas-design-mount-D4M3E1AX.js → canvas-design-mount-PWQPVLiY.js} +3 -3
  82. package/dist/assets/{canvas-entry-runtime-CLOuJcgT.js → canvas-entry-runtime-nWfnVKYb.js} +2 -2
  83. package/dist/assets/{canvas-preview-frames-CSCcu2sG.js → canvas-preview-frames-BwWVTr-u.js} +1 -1
  84. package/dist/assets/{canvas-story-capture.service-onD_xSpQ.js → canvas-story-capture.service-B1o-VBky.js} +2 -2
  85. package/dist/assets/{capability-coverage-EnZ99FoT.js → capability-coverage-aT7nf05J.js} +1 -1
  86. package/dist/assets/{collaboration-presence-1_UMOAkw.js → collaboration-presence-h1Fxju0A.js} +1 -1
  87. package/dist/assets/{collider-C6R1tHfa.js → collider-BDLEjrr-.js} +1 -1
  88. package/dist/assets/{component-board.service-Ckl-5tA4.js → component-board.service-CetsHh4L.js} +2 -2
  89. package/dist/assets/{component-board.service-Cuf_SXeA.js → component-board.service-DAeFLAlB.js} +2 -2
  90. package/dist/assets/{component-board.service-BX_2bwX3.js → component-board.service-qH45JxuD.js} +2 -2
  91. package/dist/assets/{component-contracts.service-rI-rbvDG.js → component-contracts.service-nYhZ_ceu.js} +1 -1
  92. package/dist/assets/{component-instance-root-wO1p-rLr.js → component-instance-root-QYCCyhxU.js} +1 -1
  93. package/dist/assets/{component-verbs.command-O2bwqmK3.js → component-verbs.command-y1H2CFq-.js} +1 -1
  94. package/dist/assets/{component-verbs.service-BiiQMtJt.js → component-verbs.service-QvBBdzY3.js} +1 -1
  95. package/dist/assets/{config-dVnV1cxW.js → config-YwJJtCF0.js} +2 -2
  96. package/dist/assets/{configurations-8qaUqMH7.js → configurations-B52h5RGp.js} +1 -1
  97. package/dist/assets/{connection.status-vH9WCDDg.js → connection.status-DnEU1lk4.js} +1 -1
  98. package/dist/assets/{constraints.inspector-C7UjUxPR.js → constraints.inspector-DgbM_8l2.js} +1 -1
  99. package/dist/assets/{content-bounds-Dl5Y3LLv.js → content-bounds-BRS42hfD.js} +1 -1
  100. package/dist/assets/{contract-system-adapters-BDUpDoKd.js → contract-system-adapters-DIpeIRm_.js} +1 -1
  101. package/dist/assets/{coverage.service-IS7Oklo8.js → coverage.service-Cjy9MO9F.js} +1 -1
  102. package/dist/assets/{create-runtime-Bucz0XVU.js → create-runtime-ByZWXstA.js} +1 -1
  103. package/dist/assets/{curve-D0Q6TczG.js → curve-DaFJmPin.js} +1 -1
  104. package/dist/assets/{data-asset-B0a1y8M-.js → data-asset-DRCqFyxF.js} +1 -1
  105. package/dist/assets/{data-ref-dRt2Wi5L.js → data-ref-CkvCIusA.js} +1 -1
  106. package/dist/assets/{debug-bridge-EhDkhrLX.js → debug-bridge-C7NLsHKu.js} +1 -1
  107. package/dist/assets/{debug-registry-B2THKz1v.js → debug-registry-BzagDrhV.js} +1 -1
  108. package/dist/assets/{deferred-ingest-play-To3ZratW.js → deferred-ingest-play-DMp_yRhc.js} +2 -2
  109. package/dist/assets/{design-time-canvas-mount-BnSaRAbS.js → design-time-canvas-mount-kB1ZRIvt.js} +2 -2
  110. package/dist/assets/{design-time-layers-OMAIxOrv.js → design-time-layers-Dzu3jW_N.js} +1 -1
  111. package/dist/assets/{design-time-mount.service-RFkiqPIn.js → design-time-mount.service-CLEJHBLW.js} +2 -2
  112. package/dist/assets/{design-time-mount.service-Bgr_nCDs.js → design-time-mount.service-Dgswmfff.js} +2 -2
  113. package/dist/assets/{design-time-react-mount-BsSBoX7J.js → design-time-react-mount-B71UACVS.js} +1 -1
  114. package/dist/assets/{document-preview-three-Qni0oVBw.js → document-preview-three-DxAxdZRF.js} +1 -1
  115. package/dist/assets/{dom-authoring-adapter-DsUgOtQy.js → dom-authoring-adapter-CQiwffQ4.js} +1 -1
  116. package/dist/assets/{draco3d-DyZllcka.js → draco3d-CWfPSgkb.js} +1 -1
  117. package/dist/assets/{edit-mode-audio.service-CjXNAZEs.js → edit-mode-audio.service-CikRAHOi.js} +1 -1
  118. package/dist/assets/{edit-mode-authoring-BDgZD47j.js → edit-mode-authoring-DthrLbz-.js} +1 -1
  119. package/dist/assets/{edit-mode-networking.service-3dUr2g_0.js → edit-mode-networking.service-DBmK8YGU.js} +1 -1
  120. package/dist/assets/{editor-api-DTrNJMXL.js → editor-api-CqqOlRSi.js} +1 -1
  121. package/dist/assets/{editor-layers-DwaX5UFy.js → editor-layers-k0AjpomL.js} +1 -1
  122. package/dist/assets/{editor-shell-store-aKHbAoCV.js → editor-shell-store-B3c29A3l.js} +1 -1
  123. package/dist/assets/{entity-object-BLJ-I8XT.js → entity-object-BOLh6DVA.js} +1 -1
  124. package/dist/assets/{extend-6LrR7eSL.js → extend-CJ7vLkP1.js} +1 -1
  125. package/dist/assets/{fork-menu-V-FM6YuY.js → fork-menu-Bzl-5_GA.js} +1 -1
  126. package/dist/assets/{frame-debugger-store-DwDC0wAm.js → frame-debugger-store-NGsJt0AK.js} +1 -1
  127. package/dist/assets/{game-contract-seams-C22a4B79.js → game-contract-seams-CuBiefwV.js} +1 -1
  128. package/dist/assets/{game-css-scope-transform-Wv0ZdTsR.js → game-css-scope-transform-5yv5zl6t.js} +1 -1
  129. package/dist/assets/{game-document.service-BzvFIWCc.js → game-document.service-DtML_s2L.js} +1 -1
  130. package/dist/assets/{game-eval.command-DpQn_nY8.js → game-eval.command-Cghc-6r3.js} +1 -1
  131. package/dist/assets/{game-module-access-BI6oBa8Y.js → game-module-access-DPnqfsy_.js} +1 -1
  132. package/dist/assets/{game-network-Deo8lcPw.js → game-network-TjOj3K-Z.js} +3 -3
  133. package/dist/assets/{gameplay-export-BOLhxmII.js → gameplay-export-ebDdiP9T.js} +1 -1
  134. package/dist/assets/{gameplay-replay-Dkvmv6hf.js → gameplay-replay-B4BPQnTZ.js} +1 -1
  135. package/dist/assets/{gameplay.command-DCKqLv7C.js → gameplay.command-C__OjBjz.js} +1 -1
  136. package/dist/assets/{generation-jobs-6D562vMB.js → generation-jobs-C57_oOgx.js} +1 -1
  137. package/dist/assets/{generation.service-BFRoLb7y.js → generation.service-BJel-Oiy.js} +1 -1
  138. package/dist/assets/{generations-HwV1btKK.js → generations-DNfmqqzL.js} +1 -1
  139. package/dist/assets/{generations.status-BLiDcKsg.js → generations.status-nXpY7bFU.js} +1 -1
  140. package/dist/assets/{hierarchy-marks-DeG4E4Ke.js → hierarchy-marks-C2temlO0.js} +1 -1
  141. package/dist/assets/{hosted-asset-materialization-Bod7CEMF.js → hosted-asset-materialization-BtbO5pyX.js} +1 -1
  142. package/dist/assets/{index-CLUA6PYq.js → index-7J5pTwW2.js} +1 -1
  143. package/dist/assets/{index-KIR4Has5.js → index-B5GZkByz.js} +1 -1
  144. package/dist/assets/{index-CdLhNxor.js → index-B69_nH5F.js} +1 -1
  145. package/dist/assets/{index-ClgrFOcX.js → index-BfqJPhFO.js} +7 -7
  146. package/dist/assets/{index-DkYeh000.js → index-BiH6f3Mk.js} +1 -1
  147. package/dist/assets/{index-CHOT9sYh.js → index-CFS_B4hc.js} +2 -2
  148. package/dist/assets/{index-CyLPQ8pY.js → index-DYoPv2Wb.js} +1 -1
  149. package/dist/assets/{index-4hL3-0yz.js → index-my7iu018.js} +1 -1
  150. package/dist/assets/{index-jS3rfNkZ.js → index-zXacXllH.js} +1 -1
  151. package/dist/assets/{inference-diagnostics-BmZ5ggEK.js → inference-diagnostics-NvA3SRR7.js} +1 -1
  152. package/dist/assets/{ingest-boot-viewport-CipkFljr.js → ingest-boot-viewport-DHhBi66w.js} +1 -1
  153. package/dist/assets/{ingest-siblings-CEwYp-xg.js → ingest-siblings-CMWO3uRZ.js} +1 -1
  154. package/dist/assets/{ingest-source-persistence-CVU1rTj0.js → ingest-source-persistence-CrXFBT__.js} +1 -1
  155. package/dist/assets/{ingest.service-bNqvcqoK.js → ingest.service-BYEo4j1s.js} +1 -1
  156. package/dist/assets/{inspect-BunjdqX7.js → inspect-UxYR9Ls5.js} +1 -1
  157. package/dist/assets/instances.command-DDOJ3aWq.js +1 -0
  158. package/dist/assets/{json-history-resource-CDEoQe1R.js → json-history-resource-De8KJl61.js} +1 -1
  159. package/dist/assets/{layered-pick-guh6WlA7.js → layered-pick-Dito5b_J.js} +1 -1
  160. package/dist/assets/{light-BPZivpCK.js → light-BnSS9Nzc.js} +1 -1
  161. package/dist/assets/{live-project-verbs-Bqmxbr2o.js → live-project-verbs-CDRzC_D1.js} +1 -1
  162. package/dist/assets/{machine.document-CAFPFq5K.js → machine.document-CVG78EGi.js} +1 -1
  163. package/dist/assets/{machines.finder-CbUWReMp.js → machines.finder-vrUR_Pb_.js} +1 -1
  164. package/dist/assets/{material-huG6lNEK.js → material-7mmxSi8g.js} +1 -1
  165. package/dist/assets/{material-factory-BkyOzJ7B.js → material-factory-CXvJ2goL.js} +1 -1
  166. package/dist/assets/{mesh-CjCfRcFK.js → mesh-DpK09Vho.js} +1 -1
  167. package/dist/assets/{model-asset-sections.service-Dt4V2K2v.js → model-asset-sections.service-ByE7kOXW.js} +1 -1
  168. package/dist/assets/{model-inspection-BDA5jikL.js → model-inspection-PgxfYOnI.js} +1 -1
  169. package/dist/assets/{model-thumbnail-CF3qGQWb.js → model-thumbnail-Dnv7DCt7.js} +1 -1
  170. package/dist/assets/{models.finder-yh4YeGrA.js → models.finder-BaD41xeQ.js} +1 -1
  171. package/dist/assets/{module-mode-D8en13PD.js → module-mode-Bb9fFtEw.js} +2 -2
  172. package/dist/assets/{mount-canvas-ingest-root-JOkm2Ypj.js → mount-canvas-ingest-root-B0_ckx79.js} +2 -2
  173. package/dist/assets/{mount-dom-ingest-root-CVXFnJZb.js → mount-dom-ingest-root-BnZQSayp.js} +2 -2
  174. package/dist/assets/{mount-ingest-root-C3o0o28C.js → mount-ingest-root-DHVNQKHi.js} +2 -2
  175. package/dist/assets/{mount-manifest-d7WQ9MYp.js → mount-manifest-cYykTsXQ.js} +1 -1
  176. package/dist/assets/{mount-three-ingest-root-Dqd4XWP1.js → mount-three-ingest-root-CI-gjlh8.js} +1 -1
  177. package/dist/assets/{mounted-authoring-B697dYuN.js → mounted-authoring-B2dc__pv.js} +1 -1
  178. package/dist/assets/{mounted-story-viewport-source-BvNZ3QQn.js → mounted-story-viewport-source-Ceh05FK8.js} +1 -1
  179. package/dist/assets/{native-debug-module-iX2-V5kg.js → native-debug-module-L_Ofssyj.js} +1 -1
  180. package/dist/assets/{navigation-CIl9OY1F.js → navigation-CADCnkrx.js} +1 -1
  181. package/dist/assets/{navmesh.menu-DrMoj7Ag.js → navmesh.menu-3D6ZEGhB.js} +1 -1
  182. package/dist/assets/{navmesh.service-CTr1NVfz.js → navmesh.service-D_TdU1xw.js} +1 -1
  183. package/dist/assets/network-observer.service-D9nUCc15.js +1 -0
  184. package/dist/assets/{network.utility-Btexm5ao.js → network.utility-B3riF8KT.js} +1 -1
  185. package/dist/assets/{object3d-document-session-registry-CADiW-LP.js → object3d-document-session-registry-CLizyhis.js} +2 -2
  186. package/dist/assets/{oid-transform-Ca1oU_Ei.js → oid-transform-CinlfHYa.js} +1 -1
  187. package/dist/assets/{particles-D1oPwNJh.js → particles--V50tPi5.js} +1 -1
  188. package/dist/assets/{pixi-authoring-adapter-B1BBfTju.js → pixi-authoring-adapter-qbP0YW7g.js} +1 -1
  189. package/dist/assets/{pixi-live-write-target-BcUhtqmJ.js → pixi-live-write-target-coTAFFGW.js} +1 -1
  190. package/dist/assets/{play.command-ScnwcvJr.js → play.command-kc7rzTlg.js} +2 -2
  191. package/dist/assets/{presentation-DPfnCjNA.js → presentation-jBjhcEq1.js} +1 -1
  192. package/dist/assets/{product-D_9saRiZ.js → product-DgYRVeaY.js} +1 -1
  193. package/dist/assets/{profiler.action-PXTw93E5.js → profiler.action-Dj94ZJLY.js} +1 -1
  194. package/dist/assets/{profiler.menu-DPFV6QQD.js → profiler.menu-BHplCv7a.js} +1 -1
  195. package/dist/assets/{profiler.utility-eDooJGnI.js → profiler.utility-D32oIOGk.js} +1 -1
  196. package/dist/assets/{project-authoring-session-BmeutotA.js → project-authoring-session-Cd8SeWEJ.js} +2 -2
  197. package/dist/assets/{properties-bone-constraints.inspector-BW0V1WXQ.js → properties-bone-constraints.inspector-VPTHP6BI.js} +1 -1
  198. package/dist/assets/{properties-bone.inspector-DIvTZhY8.js → properties-bone.inspector-4GD1gzCp.js} +1 -1
  199. package/dist/assets/{properties-collection.inspector-Dbt5XMhs.js → properties-collection.inspector-CehoAair.js} +1 -1
  200. package/dist/assets/{properties-constraints.inspector-5SvB0GDC.js → properties-constraints.inspector-LgPoqURT.js} +1 -1
  201. package/dist/assets/{properties-data.inspector-C-SngIsI.js → properties-data.inspector-D3uEJD3t.js} +1 -1
  202. package/dist/assets/{properties-material.inspector-CYAWsvsX.js → properties-material.inspector-2n9K5IFo.js} +1 -1
  203. package/dist/assets/{properties-modifiers.inspector-XN6BL-Ll.js → properties-modifiers.inspector-B_RsuDyF.js} +1 -1
  204. package/dist/assets/{properties-object.inspector-CfryU0kN.js → properties-object.inspector-CBZA72yZ.js} +1 -1
  205. package/dist/assets/{properties-output.inspector-COfgmFUW.js → properties-output.inspector-DxDAmKI-.js} +1 -1
  206. package/dist/assets/{properties-particles.inspector-BCh0vFr6.js → properties-particles.inspector-pPS920CT.js} +1 -1
  207. package/dist/assets/{properties-physics.inspector-B6to1u6U.js → properties-physics.inspector-XUnPp5Q3.js} +1 -1
  208. package/dist/assets/{properties-render.inspector-C4hVfo7j.js → properties-render.inspector-DnC4sgP3.js} +1 -1
  209. package/dist/assets/{properties-scene.inspector-dKta4xn5.js → properties-scene.inspector-MZ-gCrYM.js} +1 -1
  210. package/dist/assets/{properties-texture.inspector-ZlNhW25m.js → properties-texture.inspector-B7QGBzm5.js} +1 -1
  211. package/dist/assets/{properties-view-layer.inspector-CIxHmkDR.js → properties-view-layer.inspector-rt2qT9SA.js} +1 -1
  212. package/dist/assets/{properties-world.inspector-Ce0q2dmK.js → properties-world.inspector-Vg7GD9HK.js} +1 -1
  213. package/dist/assets/{r3f-design-session-1riISktt.js → r3f-design-session-DfRwB6oN.js} +2 -2
  214. package/dist/assets/{r3f-physics-binding-DuG97FR9.js → r3f-physics-binding-EfYECbQc.js} +1 -1
  215. package/dist/assets/{r3f-source-authoring-adapter-B8qqrdwk.js → r3f-source-authoring-adapter-CVupdJt5.js} +1 -1
  216. package/dist/assets/{react-canvas-navigation-CxBm8iw8.js → react-canvas-navigation-DwiPTVdH.js} +1 -1
  217. package/dist/assets/{react-inspector.service-BcdePwno.js → react-inspector.service-DffkStxd.js} +1 -1
  218. package/dist/assets/{react-story-board-CMvkLAkF.js → react-story-board-CynnmKqO.js} +1 -1
  219. package/dist/assets/{react-three-rapier.esm-D5svf-ME.js → react-three-rapier.esm-DnUfnQnM.js} +1 -1
  220. package/dist/assets/{react-world-authoring-adapter-Dq8NqvWu.js → react-world-authoring-adapter-Cf1jv2dl.js} +1 -1
  221. package/dist/assets/{realm-services-CqjVBanw.js → realm-services-CxfLBQQ9.js} +1 -1
  222. package/dist/assets/{reflection-probe-capture.inspector-uEvyppEj.js → reflection-probe-capture.inspector-DfzDNtJF.js} +1 -1
  223. package/dist/assets/{registry-D7lFIA8c.js → registry-69pUwZEm.js} +1 -1
  224. package/dist/assets/{relative-import-specifier-CA9mSNXO.js → relative-import-specifier-J1WeZQaJ.js} +1 -1
  225. package/dist/assets/{render-env-BHasp-z3.js → render-env-CmR-momj.js} +1 -1
  226. package/dist/assets/{render-features-sSb1-c5x.js → render-features-D7pQr-dE.js} +1 -1
  227. package/dist/assets/{render-settings-CUbo4Sw5.js → render-settings-BUT8gPkc.js} +1 -1
  228. package/dist/assets/{resolve-three-TQ367RQD.js → resolve-three-Dhw2LtAp.js} +3 -3
  229. package/dist/assets/{root-seam-contract-CneTgNww.js → root-seam-contract-BFs0rvG9.js} +1 -1
  230. package/dist/assets/{run-selection-CNsOQTEG.js → run-selection-CEuu_sxz.js} +1 -1
  231. package/dist/assets/{scene-capture-KbdRgsD3.js → scene-capture-DgUSqWTB.js} +1 -1
  232. package/dist/assets/{scene-document.service-CmPSUocW.js → scene-document.service-BDDoO22G.js} +2 -2
  233. package/dist/assets/{scene-framing-B5JC4NeG.js → scene-framing-Dm-rCn3G.js} +1 -1
  234. package/dist/assets/{seeded-random-B6zqGkWP.js → seeded-random-C9256-Ag.js} +1 -1
  235. package/dist/assets/{setup-renderer-efjIBSGF.js → setup-renderer-CWvtkVDR.js} +1 -1
  236. package/dist/assets/{source-object3d-authoring-adapter-DeeboYub.js → source-object3d-authoring-adapter-ehtz9UK_.js} +1 -1
  237. package/dist/assets/{source-persistence-backend-Cwy93SmQ.js → source-persistence-backend-CbCbDOjd.js} +1 -1
  238. package/dist/assets/{stage-keyboard-GNCaTXLA.js → stage-keyboard-DiRyZTZd.js} +1 -1
  239. package/dist/assets/{stage-overlay-set-DV3SCzJb.js → stage-overlay-set-6pmCmKpX.js} +1 -1
  240. package/dist/assets/{stage-presence-markers-CBEU1Kzo.js → stage-presence-markers-mZPecAeK.js} +1 -1
  241. package/dist/assets/{stage-transform-tools-C9nNDW6n.js → stage-transform-tools-Qc0QjPrc.js} +1 -1
  242. package/dist/assets/{standard-viewport-dressing-BJkGwiNT.js → standard-viewport-dressing-BhTPIZTQ.js} +1 -1
  243. package/dist/assets/{state-watch.action-Doz_jrzS.js → state-watch.action-DJfW26od.js} +1 -1
  244. package/dist/assets/{state-watch.menu-Dj4DUUxN.js → state-watch.menu-B1GRE_HT.js} +1 -1
  245. package/dist/assets/{state-watch.utility-COPa8xpV.js → state-watch.utility-BQaTOFU-.js} +1 -1
  246. package/dist/assets/{story-capture-stRSY4PQ.js → story-capture-DZNUtuCH.js} +1 -1
  247. package/dist/assets/{story-documents-CYzWYY1o.js → story-documents-DArOiGNt.js} +1 -1
  248. package/dist/assets/{story-documents.service-DJBu4rve.js → story-documents.service-Bi89tZQ5.js} +1 -1
  249. package/dist/assets/{story-documents.service-C5r8KFEG.js → story-documents.service-DaPhxnzw.js} +1 -1
  250. package/dist/assets/{story-media-presence-D4AIsAtK.js → story-media-presence-CMJ7U-7_.js} +1 -1
  251. package/dist/assets/{story-pixi-preview-mPo3OFOd.js → story-pixi-preview-jmF1ab99.js} +1 -1
  252. package/dist/assets/{story-presentation-Dw4Vw65P.js → story-presentation-DNXF37vS.js} +1 -1
  253. package/dist/assets/{story-three-preview-CWM0Rj7x.js → story-three-preview-CH6Kk934.js} +2 -2
  254. package/dist/assets/{studio-environment-Bw9zMFE8.js → studio-environment-BNM-AjAn.js} +1 -1
  255. package/dist/assets/{surface-state-b_H4iOCJ.js → surface-state-BLuxJ4lb.js} +1 -1
  256. package/dist/assets/{syntactic-prop-specs-BCdwWi-T.js → syntactic-prop-specs-Coas9J4z.js} +1 -1
  257. package/dist/assets/{team-playtest.service-CnxdTghn.js → team-playtest.service-C3cEeDBv.js} +1 -1
  258. package/dist/assets/{three-DWy0sZom.js → three-BvhtsSAr.js} +1 -1
  259. package/dist/assets/{three-authoring-adapter-9LcUBPaU.js → three-authoring-adapter-K8a5THvW.js} +1 -1
  260. package/dist/assets/three-authoring.service-D-uSiCHc.js +2 -0
  261. package/dist/assets/{three-ingest-runtime-x9nLmUl-.js → three-ingest-runtime-QhrURliQ.js} +1 -1
  262. package/dist/assets/{three-integration-DB-xQHD5.js → three-integration-CaC8ivB7.js} +2 -2
  263. package/dist/assets/three-integration.service-BvTtbtlD.js +1 -0
  264. package/dist/assets/{three-projection-core-IUovHgg_.js → three-projection-core-C2Zj6hTy.js} +1 -1
  265. package/dist/assets/{three-state-_ImCbP87.js → three-state-cYB28OIz.js} +1 -1
  266. package/dist/assets/{three-story-capture.service-wKwfSnqA.js → three-story-capture.service-H2Z2O7Nz.js} +2 -2
  267. package/dist/assets/{three-story-model-BxWKcl9d.js → three-story-model-DVfgIOzi.js} +1 -1
  268. package/dist/assets/{three-viewport-presentation-Bg86EsDJ.js → three-viewport-presentation-DoViPvQB.js} +1 -1
  269. package/dist/assets/{transform-mode-request-BnV8FSnx.js → transform-mode-request-CflM_ccL.js} +1 -1
  270. package/dist/assets/{transport-strip-BZQnaxFN.js → transport-strip-DPoEy7PU.js} +1 -1
  271. package/dist/assets/transport.header-DdI58npA.js +1 -0
  272. package/dist/assets/{tuples-DR33sMq6.js → tuples-CA3u4T9B.js} +1 -1
  273. package/dist/assets/{ui-board-document-VJMvm6Ks.js → ui-board-document-CoKY7MDM.js} +2 -2
  274. package/dist/assets/{user-data-DL6HsBPf.js → user-data-CTT8ZvVB.js} +1 -1
  275. package/dist/assets/{utility-view-state-ghWXsYXq.js → utility-view-state-BaO3Fx_-.js} +1 -1
  276. package/dist/assets/{viewport-door-BV_lf5uK.js → viewport-door-BBtilr3V.js} +1 -1
  277. package/dist/assets/{viewport-root-presentation-CKqhX3mt.js → viewport-root-presentation-DmDBAZ8E.js} +1 -1
  278. package/dist/assets/{viewport-surface-status-D7M2L2lI.js → viewport-surface-status-BiDiAZ6z.js} +1 -1
  279. package/dist/assets/{webworkerAll-DDbFvxgB.js → webworkerAll-BCvjBZqG.js} +1 -1
  280. package/dist/assets/{workspace-arrangement-86_8Kk5K.js → workspace-arrangement-BXM0R-Uu.js} +1 -1
  281. package/dist/assets/{world-documents-DeNJUefV.js → world-documents-DGk_J8cp.js} +1 -1
  282. package/dist/assets/{world-root-stage-binding-VOrldLB4.js → world-root-stage-binding-KaIVpo80.js} +1 -1
  283. package/dist/assets/{xstate-animation-binding-747CfEeB.js → xstate-animation-binding-D_kxRsxS.js} +1 -1
  284. package/dist/assets/{xstate-animation-meta-DNMlMnr-.js → xstate-animation-meta-CX5oWqQv.js} +1 -1
  285. package/dist-node/cli.js +16 -16
  286. package/package.json +16 -16
  287. package/dist/assets/InspectorObjectPreview-C87CasN_.js +0 -1
  288. package/dist/assets/Object3DDocumentViewport-BpiyRQ5p.js +0 -2
  289. package/dist/assets/autoplay.service-CKBqjozr.js +0 -1
  290. package/dist/assets/instances.command-DzcXdKuG.js +0 -1
  291. package/dist/assets/network-observer.service-DyzpGKA7.js +0 -1
  292. package/dist/assets/three-authoring.service-DdTMF4A2.js +0 -2
  293. package/dist/assets/three-integration.service-DwToRGIc.js +0 -1
  294. package/dist/assets/transport.header-1SF4ZbEd.js +0 -1
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-DkYeh000.js","assets/extends-CF3RwP-h.js","assets/index-nmcBqr7Y.js","assets/_commonjsHelpers-D6-XlEtG.js","assets/index-D_NuPfjr.js","assets/client-DNXj_opT.js","assets/index-CinJrH5C.js","assets/three.module-BLhyNg0e.js","assets/three.core-3arARmh6.js","assets/events-156d8d12.esm-DmeaOP4r.js","assets/jsx-runtime-DPjLkJKQ.js","assets/index-DzuOGwVB.js","assets/Gltf-CRUmmFxv.js","assets/BufferGeometryUtils-FJZNEiJN.js","assets/OrthographicCamera-Bv8_A2mi.js","assets/Fbo-Biv6Lrhl.js","assets/PerspectiveCamera-D3r6Hnc8.js","assets/OrbitControls-C6LQ4Pxi.js","assets/index-ClgrFOcX.js","assets/index-CtzuWnCS.js","assets/index-FUuS4qwW.js","assets/index-CPiRKiDC.css","assets/RoundedBox-DrJK5JOI.js","assets/babylon-authoring-adapter-C-EAsfMr.js","assets/json-history-resource-CDEoQe1R.js","assets/source-persistence-backend-Cwy93SmQ.js","assets/ingest-source-persistence-CVU1rTj0.js","assets/pixi-authoring-adapter-B1BBfTju.js","assets/index-CHOT9sYh.js","assets/component-instance-root-wO1p-rLr.js","assets/user-data-DL6HsBPf.js","assets/workspace-arrangement-86_8Kk5K.js","assets/pixi-transform-channels-P4rvmusc.js","assets/pixi-live-write-target-BcUhtqmJ.js","assets/canvas-entry-runtime-CLOuJcgT.js","assets/debug-registry-B2THKz1v.js","assets/mount-ingest-root-C3o0o28C.js","assets/active-ingest-CJ2U5L1O.js","assets/game-contract-seams-C22a4B79.js","assets/capability-coverage-EnZ99FoT.js","assets/contract-system-adapters-BDUpDoKd.js","assets/three-state-_ImCbP87.js","assets/editor-shell-store-aKHbAoCV.js","assets/output-pass-HurwNl0G.js","assets/Pass-D1MRT672.js","assets/editor-layers-DwaX5UFy.js","assets/entity-object-BLJ-I8XT.js","assets/three-contract-Dkt6PmWY.js","assets/module-mode-D8en13PD.js","assets/binding-resolver-DoOAFM2m.js","assets/native-debug-module-iX2-V5kg.js","assets/native-entry-surface-BE8LJNdu.js","assets/adapter-surface-Y37Nzcyw.js","assets/structural-signature-Dc7skRiy.js","assets/webgl-frame-capture-DdJkM2mi.js","assets/realm-services-CqjVBanw.js","assets/three-ingest-runtime-x9nLmUl-.js","assets/EffectComposer-BEAt0PtQ.js","assets/CopyShader-BzTUYzf6.js","assets/ShaderPass-DTnDQXm0.js","assets/CSS3DRenderer-BsAqfavI.js","assets/relative-path-guard-GiM7Lsz8.js","assets/react-root-BHA-cdrW.js","assets/mount-manifest-d7WQ9MYp.js","assets/create-runtime-Bucz0XVU.js","assets/binding-Bmxqznjk.js","assets/root-stacking-BEd9ZvxC.js","assets/assets-BcrMQHRv.js","assets/loader-BTUKnX5Q.js","assets/KTX2Loader-CaqVE6nY.js","assets/GLTFLoader-KeoruJgS.js","assets/BufferGeometryUtils-B22h7jo4.js","assets/setup-renderer-efjIBSGF.js","assets/index-DHhMOs_s.js","assets/defaults-DKiBJCPN.js","assets/render-settings-CUbo4Sw5.js","assets/render-features-sSb1-c5x.js","assets/seeded-random-B6zqGkWP.js","assets/loop-gate-report-N52EWFGD.js","assets/system-slot-E2mEdiih.js","assets/user-data-CODoGZqA.js","assets/object-marks-BnvSuCTt.js","assets/performance-profiler-CMbwGBuk.js","assets/debug-bridge-EhDkhrLX.js","assets/index-OZVqp6xS.js","assets/index-Da9JhEvW.js","assets/game-audio-BeCyd0Ha.js","assets/rapier-physics-adapter-CaZqWLu0.js","assets/live-project-verbs-Bqmxbr2o.js","assets/edit-mode-authoring-BDgZD47j.js","assets/editor-presentation-activity-CqJH4G9t.js","assets/pixi-story-model-DNkfnWUV.js","assets/surface-content-Dg9Kkazf.js","assets/viewport-root-presentation-CKqhX3mt.js","assets/mounted-authoring-B697dYuN.js","assets/three-DWy0sZom.js","assets/viewport-editor-controls-BYaAZ_Ku.js","assets/three-authoring-adapter-9LcUBPaU.js","assets/three-projection-core-IUovHgg_.js","assets/body-marks-C1LxJtQb.js","assets/structural-ids-BOo2BRoY.js","assets/object3d-authoring-subject-XccsO0xG.js","assets/r3f-physics-binding-DuG97FR9.js","assets/deferred-ingest-play-To3ZratW.js","assets/rrweb-Cd2ifIRP.js","assets/react-world-authoring-adapter-Dq8NqvWu.js","assets/board-guides-CCiyx8cT.js","assets/relative-import-specifier-CA9mSNXO.js","assets/story-arg-descriptors-Ek86ExX7.js","assets/inspect-BunjdqX7.js","assets/inference-diagnostics-BmZ5ggEK.js","assets/writer-tw6EcuVO.js","assets/viewport-door-BV_lf5uK.js","assets/game-surface-defaults-D8S4cRxi.js"])))=>i.map(i=>d[i]);
2
- import{u as An,p as Ir,S as xr}from"./index-OZVqp6xS.js";import{decode as Q,encode as Rr}from"./index-Da9JhEvW.js";import{$ as At,a4 as In,a3 as Cr,_ as B,e2 as xn,c6 as Or,p as Rn,X as kr,h6 as Dr,md as Nr,me as Fr,mb as jr,mf as $r,mg as Br,cd as Gr,ce as zr,a2 as Cn,mh as On,c7 as Ur,c8 as Wr,ca as kn,mi as Vr,a1 as qr,mj as Hr,c9 as Kr,Z as M,r as P,jj as Dn,mk as Yr,ml as Jr,mm as Xr,mn as X,ap as Qr,lg as Nn,an as Zr,c0 as Me,jF as es,mo as ts,az as Fn,mp as ns,aC as Xe,I as jn,ag as Ae,kw as Kt,mq as $n,mr as Bn,ms as Gn,kO as zn,hf as Un,q as rs,kC as ss,mt as os,mu as is,mv as as,mw as ls,mx as cs,gY as us,gr as ds,aG as fs,b$ as Wn,my as ps,mz as Vn,lR as gs,ga as hs,bU as ms,bV as ys,e7 as ws,gT as vs,mA as bs,gA as Ls,fw as Es}from"./index-ClgrFOcX.js";import{i as Ss,b as _s}from"./native-debug-module-iX2-V5kg.js";import{T as Ie,c as Ms,g as Ts}from"./seeded-random-B6zqGkWP.js";import{g as Qe,D as K}from"./debug-registry-B2THKz1v.js";import{o as Ps}from"./game-audio-BeCyd0Ha.js";import{createRapierBodyEditing as As}from"./rapier-physics-adapter-CaZqWLu0.js";import{_ as Is}from"./events-156d8d12.esm-DmeaOP4r.js";import{fo as We,dp as gt}from"./three.core-3arARmh6.js";import{b as qn,p as Hn}from"./live-project-verbs-Bqmxbr2o.js";import{B as Yt}from"./edit-mode-authoring-BDgZD47j.js";import{p as Kn,c as xs}from"./json-history-resource-CDEoQe1R.js";import{b as Yn}from"./binding-resolver-DoOAFM2m.js";import{i as Rs,s as Cs}from"./editor-presentation-activity-CqJH4G9t.js";import{E as Jn,$ as Os,a0 as ks,G as Xn,B as ht,l as Ve,a1 as Ds,g as Ns}from"./active-ingest-CJ2U5L1O.js";import{m as Fs}from"./pixi-story-model-DNkfnWUV.js";import{t as js,d as $s}from"./surface-content-Dg9Kkazf.js";import{p as Bs,l as Gs}from"./viewport-root-presentation-CKqhX3mt.js";import{assertNever as zs}from"./adapter-surface-Y37Nzcyw.js";import{r as Us,o as Ws,s as Vs}from"./three-authoring-adapter-9LcUBPaU.js";import{t as It}from"./three-contract-Dkt6PmWY.js";import{mountDeferredIngestForPlay as qs,exitDeferredIngestPlay as Hs}from"./deferred-ingest-play-To3ZratW.js";import{r as se}from"./rrweb-Cd2ifIRP.js";import{R as Ks,w as Ys}from"./react-world-authoring-adapter-Dq8NqvWu.js";import{o as Js}from"./three-state-_ImCbP87.js";import{p as Xs}from"./viewport-door-BV_lf5uK.js";import{m as Qn}from"./game-surface-defaults-D8S4cRxi.js";async function Qs(t){try{const e=await fetch(`${At}/log-session`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"start",...t?{name:t}:{}})});return(await Cr(e,"Could not start a play log session")).file}catch{return null}}async function Zs(){try{const t=await fetch(`${At}/log-session`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"end"})});In(t,"Could not end the play log session")}catch{}}async function Zn(t){if(t.length===0)return!0;try{const e=await fetch(`${At}/log-entries`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({entries:t})});return In(e,"Could not flush play log entries"),!0}catch{return!1}}async function eo(t){if(t.length===0)return;const{useGLTF:e,useTexture:n}=await B(async()=>{const{useGLTF:r,useTexture:s}=await import("./index-DkYeh000.js");return{useGLTF:r,useTexture:s}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]));for(const r of t)e.clear(r),n.clear(r)}const to=60;function no(t){if(t.length===0)return{ms:null,fps:null,worstMs:null,samples:[]};let e=0,n=0;for(const s of t)e+=s,s>n&&(n=s);const r=e/t.length;return{ms:xe(r,2),fps:r>0?xe(1e3/r,1):null,worstMs:xe(n,2),samples:t.map(s=>xe(s,2))}}function xe(t,e){const n=10**e;return Math.round(t*n)/n}const ro="No physics adapter on this game implements setDebugDrawEnabled, so nothing can draw its colliders. A first-party three root with Rapier physics registers one; a game with no physics has no colliders to draw.",Re=xn([]);function so(t){const e=[];let n=Jt();const r=t.onRenderStep(()=>{const a=Jt();e.push(a-n),n=a,e.length>to&&e.shift()});let s=!1;const o=()=>{const a=Rn(t.systemAdapters.physics);return a?.setDebugDrawEnabled?a:null};return{instruments:[{id:"timescale",label:"Time scale",hint:"Sim speed multiplier. 1 is real time, 0 freezes the simulation while the game keeps drawing.",unit:"x",control:{kind:"scale",action:"set",min:Ie.min,max:Ie.max,step:.05},actions:[{id:"set",label:"Set",hint:`Set the sim speed multiplier (${Ie.min}–${Ie.max}).`,args:xn([Or()]),run:a=>(t.loop.timeScale=Ms(a[0]),t.loop.timeScale)}],read:()=>t.loop.timeScale},{id:"paused",label:"Paused",hint:"Freeze the simulation. The game keeps drawing, so you can look at a frozen frame.",control:{kind:"toggle",action:"toggle"},actions:[{id:"toggle",label:"Toggle",hint:"Pause or resume the simulation.",args:Re,run:()=>(t.play.paused?t.play.resume():t.play.pause(),t.play.paused)},{id:"step",label:"Step",hint:"Advance exactly one fixed substep. Pauses first if the game is running.",args:Re,run:()=>(t.play.paused||t.play.pause(),t.play.step(),t.play.paused)}],read:()=>t.play.paused},{id:"colliders",label:"Colliders drawn",hint:"Draw the physics colliders over the world, through the game's own physics adapter.",control:{kind:"toggle",action:"toggle"},actions:[{id:"toggle",label:"Toggle",hint:"Turn collider wireframes on or off.",args:Re,run:()=>{const a=o();if(!a)throw new Error(ro);return s=!s,a.setDebugDrawEnabled?.(s),s}}],read:()=>o()===null?null:s},{id:"frame-time",label:"Frame time",hint:"Wall-clock milliseconds per display frame, newest last. The window is where a hitch shows; the mean hides it.",unit:"ms",control:{kind:"plot"},actions:[{id:"clear",label:"Clear",hint:"Forget the sampled window and start measuring again.",args:Re,run:()=>(e.length=0,null)}],read:()=>no(e)}],dispose(){r(),e.length=0}}}function Jt(){return typeof performance>"u"?Date.now():performance.now()}const oo="instruments",io="__instruments__";function ao(t){const e={name:`instrument.${t.id}`,id:t.id,label:t.label,hint:t.hint,...t.unit===void 0?{}:{unit:t.unit},control:t.control,actions:t.actions.map(n=>({name:`instrument.${t.id}.${n.id}`,id:n.id,label:n.label,hint:n.hint}))};try{return{...e,value:t.read()}}catch(n){return{...e,value:null,error:n instanceof Error?n.message:String(n)}}}function lo(t){const e=Qe(t);if(!e)throw new Error("Cannot publish dev instruments: mounted Game has no debug registry.");const n=so(t),r=e.forRoot(io);for(const s of n.instruments){r.registerStateProvider(`instrument.${s.id}`,()=>s.read(),{tier:"assisted"});for(const o of s.actions)r.registerCommand(`instrument.${s.id}.${o.id}`,{description:`${s.label}: ${o.label} — ${o.hint}`,locus:"client",args:o.args},(...i)=>o.run(i))}return r.registerStateProvider(oo,()=>n.instruments.map(ao),{tier:"assisted"}),()=>n.dispose()}function co(t){if(!t||typeof t!="object")return!1;const e=t;return e.rigidBodyStates instanceof Map&&e.colliderStates instanceof Map&&e.world!==void 0&&e.rapier!==void 0}let Ce=null,uo=null;function fo(){return Ce||(uo??=(async()=>{if(!await kr()){Ce=Is;return}const t=await import(Dr);if(!(t.r3fRoots instanceof Map))throw new Error("The packaged runtime's synthetic R3F module did not export `r3fRoots` — see R3F_DOORWAY in vite-plugin-module-doorways.ts.");Ce=t.r3fRoots})(),null)}function ie(t){const e=fo();if(!e)return null;for(const n of e.values()){if(n.store.getState().scene!==t)continue;const r=n.fiber.current,s=r?[r]:[];for(;s.length>0;){const o=s.pop(),i=o.memoizedProps?.value;if(co(i))return i;o.sibling&&s.push(o.sibling),o.child&&s.push(o.child)}}return null}function $a(t,e=6e4){const n=performance.now();return new Promise(r=>{const s=()=>{if(ie(t))return r(!0);if(performance.now()-n>e)return r(!1);setTimeout(s,250)};s()})}function Xt(t,e){let n;for(const r of t)if(r.object.traverse(s=>{!n&&s.userData.entityId===e&&(n=s)}),n)return n}function Qt(t,e){const n=new Map;for(const r of e)n.set(r.object,r.rigidBody);for(let r=t;r;r=r.parent){const s=n.get(r);if(s)return s}}const U=t=>[t.x,t.y,t.z],me=t=>[t.x,t.y,t.z,t.w];function Zt(t,e){const{ShapeType:n}=t.rapier;switch(e.shapeType()){case n.Cuboid:return{type:"cuboid",halfExtents:U(e.halfExtents())};case n.Ball:return{type:"ball",radius:e.radius()};case n.Capsule:return{type:"capsule",halfHeight:e.halfHeight(),radius:e.radius()};default:return{type:"unsupported",kind:n[e.shapeType()]??`shapeType ${e.shapeType()}`}}}function po(t,e){const{JointType:n}=t.rapier;switch(e){case n.Revolute:return"revolute";case n.Fixed:return"fixed";case n.Prismatic:return"prismatic";case n.Rope:return"rope";case n.Spring:return"spring";case n.Spherical:return"spherical";default:return"generic"}}function en(t,e){return U(new We(e.x,e.y,e.z).applyQuaternion(new gt(...me(t.rotation()))).add(new We(...U(t.translation()))))}function go(t,e){const n=e.body1(),r=e.body2(),s=e.anchor1(),o=e.anchor2(),i=po(t,e.type()),a=i==="revolute"||i==="prismatic",l=a?e.frameX1():null,p=l?new We(1,0,0).applyQuaternion(new gt(l.x,l.y,l.z,l.w)):null,u=e;return{id:String(e.handle),type:i,body1:String(n.handle),body2:String(r.handle),anchor1:U(s),anchor2:U(o),worldAnchor1:en(n,s),worldAnchor2:en(r,o),body1Position:U(n.translation()),body2Position:U(r.translation()),body1Rotation:me(n.rotation()),body2Rotation:me(r.rotation()),...p?{axis:U(p),worldAxis:U(p.clone().applyQuaternion(new gt(...me(n.rotation()))))}:{},...a&&u.limitsEnabled()?{limits:{min:u.limitsMin(),max:u.limitsMax()}}:{},contactsEnabled:e.contactsEnabled()}}function ho(t){const e=r=>{const s=ie(t);if(!s)return{kind:"unresolved"};const o=[...s.rigidBodyStates.values()],i=Xt(o,r);if(!i)return{kind:"unresolved"};const a=Qt(i,o);return a?{kind:"body",body:a}:{kind:"no-body"}},n=r=>{const s=ie(t);if(!s)return null;const o=[...s.rigidBodyStates.values()],i=Xt(o,r),a=i?Qt(i,o):void 0;return a?{context:s,body:a}:null};return{...As(e),colliders(r){const s=n(r);if(!s)return[];const o=[];for(const i of s.context.colliderStates.values()){if(i.collider.parent()?.handle!==s.body.handle)continue;i.object.updateWorldMatrix(!0,!1);const a=i.object.getWorldScale(new We);o.push({id:String(i.collider.handle),shape:Zt(s.context,i.collider),position:U(i.collider.translation()),rotation:me(i.collider.rotation()),scale:[Math.abs(a.x),Math.abs(a.y),Math.abs(a.z)],sensor:i.collider.isSensor()})}return o.sort((i,a)=>Number(i.id)-Number(a.id))},previewCollider(r,s){const o=ie(t),i=o?[...o.colliderStates.values()].find(a=>String(a.collider.handle)===r)?.collider:void 0;if(!(!o||!i||Zt(o,i).type!==s.type))switch(s.type){case"cuboid":i.setHalfExtents({x:s.halfExtents[0],y:s.halfExtents[1],z:s.halfExtents[2]});break;case"ball":i.setRadius(s.radius);break;case"capsule":i.setHalfHeight(s.halfHeight),i.setRadius(s.radius);break}},joints(r){const s=n(r);if(!s)return[];const o=[],i=s.context.world.impulseJoints;return i.forEachJointHandleAttachedToRigidBody(s.body.handle,a=>{const l=i.get(a);l&&o.push(go(s.context,l))}),o.sort((a,l)=>Number(a.id)-Number(l.id))},previewJointAnchor(r,s,o){const i=ie(t)?.world.impulseJoints.get(Number(r));if(!i)return;const a={x:o[0],y:o[1],z:o[2]};s===0?i.setAnchor1(a):i.setAnchor2(a)}}}const mo="__adapter__",tn=new WeakSet;function nn(t,e){const n=[];for(const r of t.roots){const s=r.binding?.observation[e];s&&n.push(s)}return n}function yo(t,e){return e.some(n=>n.slots.audio||n.absent.some(r=>r.slot==="audio"))?e:t.roots.map(n=>{const r=e.find(s=>s.rootId===n.id);return{rootId:n.id,slots:{...r?.slots,audio:Ps},absent:r?.absent??[]}})}const wo=["@colyseus/sdk","colyseus.js"];function vo(t,e){const n=e.some(u=>u.slots.networking||u.absent.some(f=>f.slot==="networking"));qn();const r=Hn(),s=r===null||r.some(u=>wo.includes(u)),o=t.roots[0];if(n||!s||!o)return e;const i=e.findIndex(u=>u.rootId===o.id),a=i>=0?e[i]:void 0,l={rootId:o.id,slots:{...a?.slots,networking:ua},absent:a?.absent??[]},p=[...e];return i>=0?p[i]=l:p.push(l),p}const bo=["@react-three/rapier","@dimforge/rapier3d-compat"];function Lo(t,e){qn();const n=Hn(),r=n===null||n.some(o=>bo.includes(o)),s=[...e];for(const o of t.roots){if(o.mounted.kind!=="three"||o.mounted.systems?.physics)continue;const i=s.findIndex(f=>f.rootId===o.id),a=i>=0?s[i]:void 0;if(a&&(a.slots.physics||a.absent.some(f=>f.slot==="physics")))continue;const l=o.mounted.scene;if(!r&&!ie(l))continue;const p=ho(l),u={rootId:o.id,slots:{...a?.slots,physics:p},absent:a?.absent??[]};i>=0?s[i]=u:s.push(u)}return s}function Eo(t,e,n){const r=e.forRoot(mo);for(const s of n){if(s.kind==="state"){r.registerStateProvider(s.id,()=>{if(!s.answer)throw new K("OBSERVATION_UNANSWERED",`Observation "${s.id}" (state) is declared by this game's adapter with no answer.`);return s.answer(t)},{tier:"assisted"});continue}r.registerCommand(s.id,{...s.description?{description:s.description}:{},locus:s.locus??"client"},(...o)=>{if(!s.answer)throw new K("OBSERVATION_UNANSWERED",`Observation "${s.id}" (command) is declared by this game's adapter with no answer.`);return s.answer(t,...o)})}}function ot(t,e){const n=t.actions(e);if(!Array.isArray(n))throw new Error("volter.adapter.ts input.actions must return an array.");const r=new Map;for(const s of n){if(typeof s?.name!="string"||s.name.length===0||!Fr.includes(s.valueType))throw new Error("volter.adapter.ts input.actions returned an invalid action; each action needs a non-empty `name` and a supported `valueType`.");if(r.has(s.name))throw new Error(`volter.adapter.ts input.actions returned duplicate action "${s.name}".`);r.set(s.name,s.valueType)}return r}function So(t,e){return t==="digital"?typeof e=="boolean":t==="scalar"?typeof e=="number"&&Number.isFinite(e):typeof e=="object"&&e!==null&&typeof e.x=="number"&&Number.isFinite(e.x)&&typeof e.y=="number"&&Number.isFinite(e.y)}function _o(t,e,n){if(!t.world(n.root))throw new Error(`volter.adapter.ts input.root names "${n.root}", which is not a mounted manifest root.`);const r=[],s=[];let o=!1;const i=(f,d)=>{const c=ot(n,t).get(f);if(!c)throw new K("INPUT_ACTION_NOT_FOUND",`Adapter input has no action named "${f}".`,{registered:[...ot(n,t).keys()]});if(!So(c,d))throw new K("INPUT_ACTION_VALUE_TYPE",`Adapter input action "${f}" expects ${c}, not ${typeof d}.`,{action:f,expected:c});return c},a=(f,d,c)=>{i(f,d),n.set(t,f,d),o&&s.push({tick:c,action:f,value:d})},l=()=>{const f=e.getGameTick(),d=r.filter(c=>c.tick===f);if(d.length!==0){for(let c=r.length-1;c>=0;c--)r[c].tick===f&&r.splice(c,1);for(const c of d)a(c.action,c.value,f)}};t.systems.add("input",l,{name:"adapter.input"});const p=f=>{throw new K("ADAPTER_INPUT_SOURCE_UNSUPPORTED",`${f} addresses an engine test source, but this game declares an app-owned action store. Drive it by action name instead.`)},u={setVirtualAction(f,d){return a(f,d,e.getGameTick()),{delivered:!0}},tapVirtualAction(f){const d=e.getGameTick();return a(f,!0,d),r.push({tick:d+1,action:f,value:!1}),{delivered:!0}},clearVirtualActions(){r.length=0,n.clear(t)},scheduleActionAtTick(f,d,c){const h=e.getGameTick();if(!Number.isInteger(f)||f<h)throw new K("TICK_ALREADY_PASSED",`Cannot schedule adapter input for tick ${f}; current tick is ${h}.`,{tick:f,currentTick:h});i(d,c),r.push({tick:f,action:d,value:c})},startInputRecording(){s.length=0,o=!0},stopInputRecording(){o=!1},isInputRecording(){return o},injectAxis(){p("injectAxis")},injectVector2(){p("injectVector2")},injectPointerDelta(){p("injectPointerDelta")},injectPointerPosition(){p("injectPointerPosition")}};e.setInputActionsSource(n.root,()=>[...ot(n,t)].map(([f,d])=>({name:f,valueType:d}))),e.setInputTraceSource(n.root,()=>({version:1,seed:null,fixedDt:t.loop.fixedDt,ticks:[...s]})),e.setVirtualInputTarget(n.root,u)}function er(t){if(tn.has(t))return;Ss(t,nn(t,"entryDebug")),_s(t,vo(t,Lo(t,yo(t,nn(t,"entrySystems"))))),lo(t);const e=Qe(t);if(!e)throw new Error("Cannot install adapter runtime bindings: mounted Game has no debug registry.");t.roots.some(s=>s.mounted.systems?.debug!==void 0&&s.mounted.systems.debug!==e.adapter)||Eo(t,e,jr());const r=Nr();r&&_o(t,e,r),tn.add(t)}let m=(function(t){return t.info="info",t.warn="warn",t.error="error",t.debug="debug",t.trace="trace",t.fatal="fatal",t})({});const ue={trace:10,debug:20,info:30,warn:40,error:50,fatal:60},tr=Symbol.for("loglayer.lazy"),xt="[LazyEvalError]";function le(t){return t!=null&&typeof t=="object"&&tr in t}function rn(t){let e=0;for(const n of Object.keys(t))le(t[n])&&e++;return e}function it(t){let e=!1;for(const s of Object.keys(t))if(le(t[s])){e=!0;break}if(!e)return{resolved:t,errors:null};const n={};let r=null;for(const s of Object.keys(t)){const o=t[s];if(le(o))try{n[s]=o[tr]()}catch(i){n[s]=xt,r||(r=[]),r.push({key:s,error:i})}else n[s]=o}return{resolved:n,errors:r}}function Mo(t){for(const e of Object.keys(t))if(t[e]instanceof Promise)return!0;return!1}function sn(t){let e=null;const n={};for(const r of Object.keys(t))t[r]instanceof Promise?(n[r]=xt,e||(e=[]),e.push(r)):n[r]=t[r];return e?{resolved:n,asyncKeys:e}:{resolved:t,asyncKeys:null}}async function To(t){const e=Object.keys(t),n=await Promise.allSettled(e.map(o=>Promise.resolve(t[o]))),r={};let s=null;for(let o=0;o<e.length;o++){const i=n[o];i.status==="fulfilled"?r[e[o]]=i.value:(r[e[o]]=xt,s||(s=[]),s.push({key:e[o],error:i.reason}))}return{resolved:r,errors:s}}function $(t){const e=t[0];if(Array.isArray(e)&&typeof e.raw<"u"){const n=e,r=t.slice(1);let s="";for(let o=0;o<n.length;o++)s+=n[o],o<r.length&&(s+=String(r[o]));return[s]}return t}let C=(function(t){return t.transformLogLevel="transformLogLevel",t.onBeforeDataOut="onBeforeDataOut",t.shouldSendToLogger="shouldSendToLogger",t.onMetadataCalled="onMetadataCalled",t.onBeforeMessageOut="onBeforeMessageOut",t.onContextCalled="onContextCalled",t})({});var Po=class nr{context={};hasContext=!1;setContext(e){if(!e){this.context={},this.hasContext=!1;return}this.context=e,this.hasContext=!0}appendContext(e){this.context={...this.context,...e},this.hasContext=!0}getContext(){return this.context}hasContextData(){return this.hasContext}clearContext(e){if(e===void 0){this.context={},this.hasContext=!1;return}const n=Array.isArray(e)?e:[e];for(const r of n)delete this.context[r];this.hasContext=Object.keys(this.context).length>0}onChildLoggerCreated({parentContextManager:e,childContextManager:n}){if(e.hasContextData()){const r=e.getContext();n.setContext({...r})}}clone(){const e=new nr;return e.setContext({...this.context}),e.hasContext=this.hasContext,e}},Ao=class mt{logLevelEnabledStatus={info:!0,warn:!0,error:!0,debug:!0,trace:!0,fatal:!0};setLevel(e){const n=ue[e];for(const r of Object.values(m)){const s=r,o=ue[r];this.logLevelEnabledStatus[s]=o>=n}}enableIndividualLevel(e){const n=e;n in this.logLevelEnabledStatus&&(this.logLevelEnabledStatus[n]=!0)}disableIndividualLevel(e){const n=e;n in this.logLevelEnabledStatus&&(this.logLevelEnabledStatus[n]=!1)}isLevelEnabled(e){const n=e;return this.logLevelEnabledStatus[n]}enableLogging(){for(const e of Object.keys(this.logLevelEnabledStatus))this.logLevelEnabledStatus[e]=!0}disableLogging(){for(const e of Object.keys(this.logLevelEnabledStatus))this.logLevelEnabledStatus[e]=!1}onChildLoggerCreated({parentLogLevelManager:e,childLogLevelManager:n}){const r=e.logLevelEnabledStatus;n instanceof mt&&(n.logLevelEnabledStatus={...r})}clone(){const e=new mt;return e.logLevelEnabledStatus={...this.logLevelEnabledStatus},e}},Io=class{id;enabled;level;consoleDebug;constructor(t){this.id=t.id??Date.now().toString()+Math.random().toString(),this.enabled=t.enabled??!0,this.consoleDebug=t.consoleDebug??!1,this.level=t.level??"trace"}_sendToLogger(t){if(!this.enabled||ue[t.logLevel]<ue[this.level])return;const e=this.shipToLogger(t);if(this.consoleDebug)switch(t.logLevel){case m.info:console.info(...e);break;case m.warn:console.warn(...e);break;case m.error:console.error(...e);break;case m.trace:console.debug(...e);break;case m.debug:console.debug(...e);break;case m.fatal:console.debug(...e);break;default:console.log(...e)}}getLoggerInstance(){throw new Error("This transport does not have a logger instance")}},xo={};const Ro=[C.onBeforeDataOut,C.onMetadataCalled,C.onBeforeMessageOut,C.transformLogLevel,C.shouldSendToLogger,C.onContextCalled];var on=class{idToPlugin;transformLogLevel=[];onBeforeDataOut=[];shouldSendToLogger=[];onMetadataCalled=[];onBeforeMessageOut=[];onContextCalled=[];constructor(t){this.idToPlugin={},this.mapPlugins(t),this.indexPlugins()}mapPlugins(t){for(const e of t){if(e.id||(e.id=Date.now().toString()+Math.random().toString()),this.idToPlugin[e.id])throw new Error(`[LogLayer] Plugin with id ${e.id} already exists.`);e.registeredAt=Date.now(),this.idToPlugin[e.id]=e}}indexPlugins(){this.transformLogLevel=[],this.onBeforeDataOut=[],this.shouldSendToLogger=[],this.onMetadataCalled=[],this.onBeforeMessageOut=[],this.onContextCalled=[];const t=Object.values(this.idToPlugin).sort((e,n)=>e.registeredAt-n.registeredAt);for(const e of t){if(e.disabled)return;for(const n of Ro)e[n]&&e.id&&this[n].push(e.id)}}hasPlugins(t){return this[t].length>0}countPlugins(t){return t?this[t].length:Object.keys(this.idToPlugin).length}addPlugins(t){this.mapPlugins(t),this.indexPlugins()}enablePlugin(t){const e=this.idToPlugin[t];e&&(e.disabled=!1),this.indexPlugins()}disablePlugin(t){const e=this.idToPlugin[t];e&&(e.disabled=!0),this.indexPlugins()}removePlugin(t){delete this.idToPlugin[t],this.indexPlugins()}runTransformLogLevel(t,e){let n=null;for(const r of this.transformLogLevel){const s=this.idToPlugin[r];if(s.transformLogLevel){const o=s.transformLogLevel({data:t.data,logLevel:t.logLevel,messages:t.messages,error:t.error,metadata:t.metadata,context:t.context,groups:t.groups,schema:t.schema,prefix:t.prefix},e);o!=null&&o!==!1&&(n=o)}}return n!=null&&n!==!1?n:t.logLevel}runOnBeforeDataOut(t,e){const n={...t},r=n.data;for(const s of this.onBeforeDataOut){const o=this.idToPlugin[s];if(o.onBeforeDataOut){const i=o.onBeforeDataOut({data:n.data,logLevel:n.logLevel,error:n.error,metadata:n.metadata,context:n.context,groups:n.groups,schema:n.schema,prefix:n.prefix},e);i&&(n.data||(n.data={}),i!==r&&Object.assign(n.data,i))}}return n.data}runShouldSendToLogger(t,e){return!this.shouldSendToLogger.some(n=>!this.idToPlugin[n].shouldSendToLogger?.(t,e))}runOnMetadataCalled(t,e){let n={...t};for(const r of this.onMetadataCalled){const s=this.idToPlugin[r].onMetadataCalled?.(n,e);if(s)n=s;else return null}return n}runOnBeforeMessageOut(t,e){let n=[...t.messages];for(const r of this.onBeforeMessageOut){const s=this.idToPlugin[r].onBeforeMessageOut?.({messages:n,logLevel:t.logLevel,groups:t.groups,schema:t.schema,prefix:t.prefix},e);s&&(n=s)}return n}runOnContextCalled(t,e){let n={...t};for(const r of this.onContextCalled){const s=this.idToPlugin[r].onContextCalled?.(n,e);if(s)n=s;else return null}return n}},Co=class rr{pluginManager;idToTransport;hasMultipleTransports;singleTransport;contextManager;logLevelManager;_isLoggingLazyError=!1;_lazyContextCount=0;_assignedGroups=null;_groupsConfig=null;_activeGroups=null;_ungroupedBehavior="all";_config;constructor(e){this._config={...e,enabled:e.enabled??!0},this.contextManager=new Po,this.logLevelManager=new Ao,this._config.enabled||this.disableLogging();const n=[...e.plugins||[],...ye.pluginsToInit];this.pluginManager=new on(n),this._config.errorFieldName||(this._config.errorFieldName="err"),this._config.copyMsgOnOnlyError||(this._config.copyMsgOnOnlyError=!1),this._initializeTransports(this._config.transport),this._groupsConfig=e.groups?{...e.groups}:null,this._ungroupedBehavior=e.ungroupedBehavior??"all",this._activeGroups=e.activeGroups?new Set(e.activeGroups):null,this._parseEnvGroups(),ye.logLayerHandlers.length>0&&ye.logLayerHandlers.forEach(r=>{r.onConstruct&&r.onConstruct(this,e)})}withContextManager(e){return this.contextManager&&typeof this.contextManager[Symbol.dispose]=="function"&&this.contextManager[Symbol.dispose](),this.contextManager=e,this._lazyContextCount=e.hasContextData()?rn(e.getContext()):0,this}getContextManager(){return this.contextManager}withLogLevelManager(e){return this.logLevelManager&&typeof this.logLevelManager[Symbol.dispose]=="function"&&this.logLevelManager[Symbol.dispose](),this.logLevelManager=e,this}getLogLevelManager(){return this.logLevelManager}getConfig(){return this._config}_initializeTransports(e){if(this.idToTransport)for(const n in this.idToTransport)this.idToTransport[n]&&typeof this.idToTransport[n][Symbol.dispose]=="function"&&this.idToTransport[n][Symbol.dispose]();this.hasMultipleTransports=Array.isArray(e)&&e.length>1,this.singleTransport=this.hasMultipleTransports?null:Array.isArray(e)?e[0]:e,Array.isArray(e)?this.idToTransport=e.reduce((n,r)=>(n[r.id]=r,n),{}):this.idToTransport={[e.id]:e}}withPrefix(e){const n=this.child();return n._config.prefix=e,n}withGroup(e){const n=this.child(),r=Array.isArray(e)?e:[e];if(n._assignedGroups){const s=new Set([...n._assignedGroups,...r]);n._assignedGroups=Array.from(s)}else n._assignedGroups=[...r];return n}addGroup(e,n){return this._groupsConfig||(this._groupsConfig={}),this._groupsConfig[e]={...n},this}removeGroup(e){return this._groupsConfig&&(delete this._groupsConfig[e],Object.keys(this._groupsConfig).length===0&&(this._groupsConfig=null)),this}enableGroup(e){return this._groupsConfig?.[e]&&(this._groupsConfig[e]={...this._groupsConfig[e],enabled:!0}),this}disableGroup(e){return this._groupsConfig?.[e]&&(this._groupsConfig[e]={...this._groupsConfig[e],enabled:!1}),this}setGroupLevel(e,n){return this._groupsConfig?.[e]&&(this._groupsConfig[e]={...this._groupsConfig[e],level:n}),this}setActiveGroups(e){return this._activeGroups=e?new Set(e):null,this}getGroups(){return this._groupsConfig?{...this._groupsConfig}:{}}withContext(e){let n=e;if(!e)return this._config.consoleDebug&&console.debug("[LogLayer] withContext was called with no context; dropping."),this;if(this.pluginManager.hasPlugins(C.onContextCalled)&&(n=this.pluginManager.runOnContextCalled(e,this),!n))return this._config.consoleDebug&&console.debug("[LogLayer] Context was dropped due to plugin returning falsy value."),this;const r=this.contextManager.getContext();for(const s of Object.keys(n)){const o=s in r&&le(r[s]),i=le(n[s]);!o&&i?this._lazyContextCount++:o&&!i&&this._lazyContextCount--}return this.contextManager.appendContext(n),this}clearContext(e){if(e!==void 0&&this._lazyContextCount>0){const n=this.contextManager.getContext(),r=Array.isArray(e)?e:[e];for(const s of r)s in n&&le(n[s])&&this._lazyContextCount--}else e===void 0&&(this._lazyContextCount=0);return this.contextManager.clearContext(e),this}getContext(e){const n=this.contextManager.getContext();if(e?.raw||this._lazyContextCount===0)return n;const{resolved:r,errors:s}=it(n);s&&this._logLazyEvalErrors(s,"context");const{resolved:o,asyncKeys:i}=sn(r);return i&&this._logAsyncLazyContextErrors(i),o}addPlugins(e){this.pluginManager.addPlugins(e)}enablePlugin(e){this.pluginManager.enablePlugin(e)}disablePlugin(e){this.pluginManager.disablePlugin(e)}removePlugin(e){this.pluginManager.removePlugin(e)}withMetadata(e){return new an(this).withMetadata(e)}withError(e){return new an(this).withError(e)}child(){const e=new rr({...this._config,transport:Array.isArray(this._config.transport)?[...this._config.transport]:this._config.transport}).withPluginManager(this.pluginManager).withContextManager(this.contextManager.clone()).withLogLevelManager(this.logLevelManager.clone());return this.contextManager.onChildLoggerCreated({parentContextManager:this.contextManager,childContextManager:e.contextManager,parentLogger:this,childLogger:e}),this.logLevelManager.onChildLoggerCreated({parentLogLevelManager:this.logLevelManager,childLogLevelManager:e.logLevelManager,parentLogger:this,childLogger:e}),e._lazyContextCount=e.contextManager.hasContextData()?rn(e.contextManager.getContext()):0,e._groupsConfig=this._groupsConfig,e._activeGroups=this._activeGroups,e._ungroupedBehavior=this._ungroupedBehavior,e._assignedGroups=this._assignedGroups?[...this._assignedGroups]:null,e}withFreshTransports(e){return this._config.transport=e,this._initializeTransports(e),this}addTransport(e){const n=Array.isArray(e)?e:[e],r=Array.isArray(this._config.transport)?this._config.transport:[this._config.transport],s=new Set(n.map(i=>i.id));for(const i of n){const a=this.idToTransport[i.id];a&&typeof a[Symbol.dispose]=="function"&&a[Symbol.dispose]()}const o=[...r.filter(i=>!s.has(i.id)),...n];this._config.transport=o;for(const i of n)this.idToTransport[i.id]=i;return this.hasMultipleTransports=o.length>1,this.singleTransport=this.hasMultipleTransports?null:o[0],this}removeTransport(e){const n=this.idToTransport[e];if(!n)return!1;typeof n[Symbol.dispose]=="function"&&n[Symbol.dispose](),delete this.idToTransport[e];const r=(Array.isArray(this._config.transport)?this._config.transport:[this._config.transport]).filter(s=>s.id!==e);return this._config.transport=r.length===1?r[0]:r,this.hasMultipleTransports=r.length>1,this.singleTransport=this.hasMultipleTransports?null:r[0]||null,!0}withFreshPlugins(e){return this._config.plugins=e,this.pluginManager=new on(e),this}withPluginManager(e){return this.pluginManager=e,this}errorOnly(e,n){const r=n?.logLevel||m.error;if(!this.isLevelEnabled(r))return;const{copyMsgOnOnlyError:s}=this._config,o={logLevel:r,err:e};(s&&n?.copyMsg!==!1||n?.copyMsg===!0)&&e?.message&&(o.params=[e.message]),this._formatLog(o)}metadataOnly(e,n=m.info){if(!this.isLevelEnabled(n))return;const{muteMetadata:r,consoleDebug:s}=this._config;if(r)return;if(!e){s&&console.debug("[LogLayer] metadataOnly was called with no metadata; dropping.");return}let o=e;if(this.pluginManager.hasPlugins(C.onMetadataCalled)&&(o=this.pluginManager.runOnMetadataCalled(e,this),!o)){s&&console.debug("[LogLayer] Metadata was dropped due to plugin returning falsy value.");return}const i={logLevel:n,metadata:o};return this._formatLog(i)}info(...e){if(!this.isLevelEnabled(m.info))return;const n=$(e);this._formatMessage(n),this._formatLog({logLevel:m.info,params:n})}warn(...e){if(!this.isLevelEnabled(m.warn))return;const n=$(e);this._formatMessage(n),this._formatLog({logLevel:m.warn,params:n})}error(...e){if(!this.isLevelEnabled(m.error))return;const n=$(e);this._formatMessage(n),this._formatLog({logLevel:m.error,params:n})}debug(...e){if(!this.isLevelEnabled(m.debug))return;const n=$(e);this._formatMessage(n),this._formatLog({logLevel:m.debug,params:n})}trace(...e){if(!this.isLevelEnabled(m.trace))return;const n=$(e);this._formatMessage(n),this._formatLog({logLevel:m.trace,params:n})}fatal(...e){if(!this.isLevelEnabled(m.fatal))return;const n=$(e);this._formatMessage(n),this._formatLog({logLevel:m.fatal,params:n})}raw(e){if(!this.isLevelEnabled(e.logLevel))return;const n={logLevel:e.logLevel,params:e.messages,metadata:e.metadata,rootData:e.rootData,err:e.error,context:e.context};return this._formatMessage(e.messages),this._formatLog(n)}disableLogging(){return this.logLevelManager.disableLogging(),this}enableLogging(){return this.logLevelManager.enableLogging(),this}muteContext(){return this._config.muteContext=!0,this}unMuteContext(){return this._config.muteContext=!1,this}muteMetadata(){return this._config.muteMetadata=!0,this}unMuteMetadata(){return this._config.muteMetadata=!1,this}enableIndividualLevel(e){return this.logLevelManager.enableIndividualLevel(e),this}disableIndividualLevel(e){return this.logLevelManager.disableIndividualLevel(e),this}setLevel(e){return this.logLevelManager.setLevel(e),this}isLevelEnabled(e){return this.logLevelManager.isLevelEnabled(e)}formatContext(e){const{contextFieldName:n,muteContext:r}=this._config;return e&&Object.keys(e).length>0&&!r?n?{[n]:{...e}}:{...e}:{}}formatMetadata(e=null){const{metadataFieldName:n,muteMetadata:r}=this._config;return e&&!r?n?{[n]:{...e}}:{...e}:{}}getLoggerInstance(e){const n=this.idToTransport[e];if(n)return n.getLoggerInstance()}_parseEnvGroups(){const e=typeof process<"u"?xo?.LOGLAYER_GROUPS:void 0;if(!e)return;const n=e.split(",").map(s=>s.trim()).filter(Boolean),r=[];for(const s of n){const o=s.indexOf(":");if(o>0){const i=s.slice(0,o),a=s.slice(o+1);r.push(i),this._groupsConfig?.[i]&&(this._groupsConfig[i]={...this._groupsConfig[i],level:a})}else r.push(s)}this._activeGroups=new Set(r)}_mergeGroups(e){if(this._assignedGroups&&e){const n=new Set([...this._assignedGroups,...e]);return Array.from(n)}return e||this._assignedGroups}_applyUngroupedRules(e){return this._ungroupedBehavior==="all"?!0:this._ungroupedBehavior==="none"?!1:this._ungroupedBehavior.includes(e)}_shouldTransportReceiveLog(e,n,r){if(!this._groupsConfig)return!0;const s=this._mergeGroups(r);if(!s||s.length===0)return this._applyUngroupedRules(e);let o=!1;for(const i of s){const a=this._groupsConfig[i];if(a&&(o=!0,a.enabled!==!1&&!(this._activeGroups&&!this._activeGroups.has(i)))){if(a.level){const l=ue[a.level];if(ue[n]<l)continue}if(a.transports.includes(e))return!0}}return o?!1:this._applyUngroupedRules(e)}_formatMessage(e=[]){const{prefix:n}=this._config;n&&typeof e[0]=="string"&&(e[0]=`${n} ${e[0]}`)}_formatLog({logLevel:e,params:n=[],metadata:r=null,rootData:s=null,err:o,context:i=null,groups:a=null}){const l=i!==null?i:this.contextManager.getContext();let p;if(this._lazyContextCount>0||i!==null){const f=it(l);f.errors&&this._logLazyEvalErrors(f.errors,"context");const{resolved:d,asyncKeys:c}=sn(f.resolved);c&&this._logAsyncLazyContextErrors(c),p=d}else p=l;let u=null;if(r){const f=it(r);r=f.resolved,u=f.errors}if(u&&this._logLazyEvalErrors(u,"metadata"),r&&Mo(r))return this._resolveAsyncAndProcess(e,n,p,r,s,o,i,a);this._processLog(e,n,p,r,s,o,i,a)}async _resolveAsyncAndProcess(e,n,r,s,o,i,a,l){let p=null;if(s){const u=await To(s);p=u.resolved,u.errors&&this._logLazyEvalErrors(u.errors,"metadata")}this._processLog(e,n,r,p,o,i,a,l)}_logLazyEvalErrors(e,n){if(this._isLoggingLazyError){for(const r of e)console.error(`[LogLayer] Lazy evaluation error in ${n} key "${r.key}":`,r.error);return}this._isLoggingLazyError=!0;try{for(const r of e){const s=r.error instanceof Error?r.error.message:String(r.error);this._processLog(m.error,[`[LogLayer] Lazy evaluation failed for ${n} key "${r.key}": ${s}`],{},null,null,r.error instanceof Error?r.error:void 0,{})}}finally{this._isLoggingLazyError=!1}}_logAsyncLazyContextErrors(e){if(this._isLoggingLazyError){for(const n of e)console.error(`[LogLayer] Async lazy values are not supported in context (key "${n}"). Use async lazy only in metadata.`);return}this._isLoggingLazyError=!0;try{for(const n of e)this._processLog(m.error,[`[LogLayer] Async lazy values are not supported in context (key "${n}"). Use async lazy only in metadata.`],{},null,null,void 0,{})}finally{this._isLoggingLazyError=!1}}_processLog(e,n,r,s,o,i,a,l=null){const{errorSerializer:p,errorFieldInMetadata:u,muteContext:f,contextFieldName:d,metadataFieldName:c,errorFieldName:h,prefix:E}=this._config,v={contextFieldName:d??void 0,metadataFieldName:c??void 0,errorFieldName:h??"err"},S=this._mergeGroups(l)??void 0;let y=!!s||(f?!1:a!==null?Object.keys(a).length>0:this.contextManager.hasContextData()),w={};if(y)if(d&&d===c){const _=this.formatContext(r)[d],T=this.formatMetadata(s)[c];w={[d]:{..._,...T}}}else w={...this.formatContext(r),...this.formatMetadata(s)};if(i){const _=p?p(i):i;u&&s&&c?w?.[c]?w[c][h]=_:w={...w,[c]:{[h]:_}}:u&&!s&&c?w={...w,[c]:{[h]:_}}:w={...w,[h]:_},y=!0}o&&Object.keys(o).length>0&&(w={...w,...o},y=!0),this.pluginManager.hasPlugins(C.onBeforeDataOut)&&(w=this.pluginManager.runOnBeforeDataOut({data:y?w:void 0,logLevel:e,error:i,metadata:s,context:r,groups:S,schema:v,prefix:E},this),w&&!y&&(y=!0)),this.pluginManager.hasPlugins(C.onBeforeMessageOut)&&(n=this.pluginManager.runOnBeforeMessageOut({messages:[...n],logLevel:e,groups:S,schema:v,prefix:E},this)),this.pluginManager.hasPlugins(C.transformLogLevel)&&(e=this.pluginManager.runTransformLogLevel({data:y?w:void 0,logLevel:e,messages:[...n],error:i,metadata:s,context:r,groups:S,schema:v,prefix:E},this));const k={data:y?w:void 0,error:i,metadata:s,context:r,groups:S,schema:v,prefix:E};if(this.hasMultipleTransports){const _=this._config.transport.filter(T=>!(!T.enabled||!this._shouldTransportReceiveLog(T.id,e,S))).map(async T=>{const D=e;if(!(this.pluginManager.hasPlugins(C.shouldSendToLogger)&&!this.pluginManager.runShouldSendToLogger({messages:[...n],logLevel:D,transportId:T.id,...k},this)))return T._sendToLogger({logLevel:D,messages:[...n],hasData:y,...k})});Promise.all(_).catch(T=>{this._config.consoleDebug&&console.error("[LogLayer] Error executing transports:",T)})}else{if(!this.singleTransport?.enabled||!this._shouldTransportReceiveLog(this.singleTransport.id,e,S)||this.pluginManager.hasPlugins(C.shouldSendToLogger)&&!this.pluginManager.runShouldSendToLogger({messages:[...n],logLevel:e,transportId:this.singleTransport.id,...k},this))return;this.singleTransport._sendToLogger({logLevel:e,messages:[...n],hasData:y,...k})}}};const ye={logLayerHandlers:[],pluginsToInit:[],logBuilderHandlers:[]};var an=class{err;metadata;structuredLogger;hasMetadata;pluginManager;_groups=null;constructor(t){this.err=null,this.metadata={},this.structuredLogger=t,this.hasMetadata=!1,this.pluginManager=t.pluginManager,ye.logBuilderHandlers.length>0&&ye.logBuilderHandlers.forEach(e=>{e.onConstruct&&e.onConstruct(this,t)})}withMetadata(t){const{pluginManager:e,structuredLogger:{_config:{consoleDebug:n}}}=this;if(!t)return n&&console.debug("[LogLayer] withMetadata was called with no metadata; dropping."),this;let r=t;return e.hasPlugins(C.onMetadataCalled)&&(r=e.runOnMetadataCalled(t,this.structuredLogger),!r)?(n&&console.debug("[LogLayer] Metadata was dropped due to plugin returning falsy value."),this):(this.metadata={...this.metadata,...r},this.hasMetadata=!0,this)}withError(t){return this.err=t,this}withGroup(t){const e=Array.isArray(t)?t:[t];if(this._groups){const n=new Set([...this._groups,...e]);this._groups=Array.from(n)}else this._groups=[...e];return this}info(...t){if(!this.structuredLogger.isLevelEnabled(m.info))return;const e=$(t);return this.structuredLogger._formatMessage(e),this.formatLog(m.info,e)}warn(...t){if(!this.structuredLogger.isLevelEnabled(m.warn))return;const e=$(t);return this.structuredLogger._formatMessage(e),this.formatLog(m.warn,e)}error(...t){if(!this.structuredLogger.isLevelEnabled(m.error))return;const e=$(t);return this.structuredLogger._formatMessage(e),this.formatLog(m.error,e)}debug(...t){if(!this.structuredLogger.isLevelEnabled(m.debug))return;const e=$(t);return this.structuredLogger._formatMessage(e),this.formatLog(m.debug,e)}trace(...t){if(!this.structuredLogger.isLevelEnabled(m.trace))return;const e=$(t);return this.structuredLogger._formatMessage(e),this.formatLog(m.trace,e)}fatal(...t){if(!this.structuredLogger.isLevelEnabled(m.fatal))return;const e=$(t);return this.structuredLogger._formatMessage(e),this.formatLog(m.fatal,e)}disableLogging(){return this.structuredLogger.disableLogging(),this}enableLogging(){return this.structuredLogger.enableLogging(),this}formatLog(t,e){const{muteMetadata:n}=this.structuredLogger._config,r=n?!1:this.hasMetadata;return this.structuredLogger._formatLog({logLevel:t,params:e,metadata:r?this.metadata:null,err:this.err,groups:this._groups})}},Oo=class extends Io{shipToLoggerFn;constructor(t){super(t),this.shipToLoggerFn=t.shipToLogger}shipToLogger(t){return this.shipToLoggerFn(t)}};let yt=!1;const ko={trace:"log",debug:"log",info:"log",warn:"warn",error:"error",fatal:"error"},Rt=new Co({transport:new Oo({shipToLogger:({logLevel:t,messages:e,data:n,hasData:r})=>{const s=ko[t]??"log";let o,i;if(r&&n){const{_sub:a,...l}=n;o=a?String(a):void 0,Object.keys(l).length>0&&(i=l)}return yt=!0,i?console[s](...e,i):console[s](...e),yt=!1,typeof window<"u"&&window.postMessage({type:"engine-log",level:t,message:e.join(" "),subsystem:o,metadata:i,timestamp:Date.now()},"*"),e}}),prefix:"[engine]"});Rt.setLevel(m.info);typeof window<"u"&&(window.setEngineLogLevel=t=>{Rt.setLevel(t)});if(typeof window<"u"){const t=new URLSearchParams(window.location.search).get("engineLogLevel");t&&Rt.setLevel(t)}const Do=4,No=1e4;async function Fo(t,e,n,r){const s=t.getRunTicksTarget();if(s===null)throw new K("RUN_TICKS_UNAVAILABLE","runTicksWhenSettled: no run-ticks target is wired — no Game has mounted yet");const o=No,i=Do,a=n?.render??"last";for(let l=0;l<e;l++){if(!t.worldSettled()){const f=Date.now()+o;for(;!t.worldSettled();){if(Date.now()>f)throw new K("WORLD_UNSETTLED_TIMEOUT",`runTicksWhenSettled: a world-settled probe still answers false after ${o}ms — a scene remount (or a broken probe) is stuck, and driving ticks into it would race it`);await new Promise(d=>setTimeout(d,i))}}const p=l===e-1,u=a==="all"?"all":a==="none"?"none":p?"last":"none";s.runTicks(1,{render:u})}}const jo="fit",sr=[{id:jo,label:"Fit panel",kind:"fit",width:null,height:null,dpr:null,safeArea:null},{id:"iphone-portrait",label:"iPhone 14 — 390×844 @3x",kind:"phone",width:390,height:844,dpr:3,safeArea:{top:47,right:0,bottom:34,left:0}},{id:"iphone-landscape",label:"iPhone 14 landscape — 844×390 @3x",kind:"phone",width:844,height:390,dpr:3,safeArea:{top:0,right:47,bottom:21,left:47}},{id:"android-portrait",label:"Android — 412×915 @2.6x",kind:"phone",width:412,height:915,dpr:2.6,safeArea:{top:24,right:0,bottom:24,left:0}},{id:"ipad-portrait",label:"iPad — 820×1180 @2x",kind:"tablet",width:820,height:1180,dpr:2,safeArea:{top:24,right:0,bottom:20,left:0}},{id:"desktop-1080p",label:"Desktop — 1920×1080 @1x",kind:"desktop",width:1920,height:1080,dpr:1,safeArea:null}],Ct=sr[0];function or(t){return sr.find(e=>e.id===t)??Ct}let O=Ct,te=null,ir=0;const wt=new Set;function Ot(){ir++;for(const t of wt)t()}function Ba(t){return wt.add(t),()=>{wt.delete(t)}}const Ga=()=>ir;function za(){return O}function ar(){return te??(O.kind==="phone"||O.kind==="tablet")}function Ua(t){const e=or(t);e!==O&&(O=e,te=null,lr(),Ot())}function Wa(t){t!==te&&(te=t,lr(),Ot())}function $o(){return O.dpr}function Va(){return Math.min(typeof window<"u"&&window.devicePixelRatio||1,2)}function lr(){$r({devicePreview:{preset:O.id,touch:te}})}function qa(){const t=Br().devicePreview;return t?.preset?(O=or(t.preset),te=typeof t.touch=="boolean"?t.touch:null):(O=Ct,te=null),Ot(),O}const ln=["pointerdown","pointermove","pointerup","pointercancel"],cn=new WeakSet;let vt=null,at=null;function un(t){if(!ar()||cn.has(t)||!(t instanceof PointerEvent)||t.pointerType!=="mouse")return;const e=t.target;if(!e)return;t.stopImmediatePropagation();const n=new PointerEvent(t.type,{bubbles:!0,cancelable:t.cancelable,composed:!0,view:t.view,detail:t.detail,clientX:t.clientX,clientY:t.clientY,screenX:t.screenX,screenY:t.screenY,button:t.button,buttons:t.buttons,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,pointerId:t.pointerId,pointerType:"touch",isPrimary:!0,pressure:t.type==="pointerup"||t.type==="pointercancel"?0:Math.max(t.pressure,.5),width:20,height:20});cn.add(n),e.dispatchEvent(n),n.defaultPrevented&&t.preventDefault()}function Bo(t){if(t!==vt&&(at?.(),at=null,vt=t,!!t)){for(const e of ln)t.addEventListener(e,un,{capture:!0});at=()=>{for(const e of ln)t.removeEventListener(e,un,{capture:!0})}}}function Ha(t){vt===t&&Bo(null)}function Go(){return{presetId:O.id,presetLabel:O.label,dpr:O.dpr,safeArea:O.safeArea,touchActive:ar()}}typeof window<"u"&&(window.__volterDevicePreview=Go);const zo=15e3;function Uo(t,e,n){const r=n?` (open ${n})`:"";return`Play start stalled at "${t}" for ${Math.round(e/1e3)}s and the editor tab is HIDDEN — a backgrounded tab has its network requests deprioritized by the browser, so this step is queued rather than broken. Bring the editor tab to the foreground${r} and run play again; the engine loop itself is hidden-safe, only the boot's fetches are starved.`}function Wo(t,e,n){const r=n.stallMs??zo,s=n.setTimer??((i,a)=>setTimeout(i,a)),o=n.clearTimer??(i=>clearTimeout(i));return new Promise((i,a)=>{let l=!1;const p=s(()=>{l||n.isHidden()&&(l=!0,a(new Error(Uo(t,r,n.editorUrl))))},r);e.then(u=>{l||(l=!0,o(p),i(u))},u=>{l||(l=!0,o(p),a(u instanceof Error?u:new Error(String(u))))})})}function Vo(t,e,n=Date.now()){const r=t.filter(s=>s.seq>e).sort((s,o)=>s.seq-o.seq);return{entries:r.map(s=>({t:n,level:"info",source:"game-event",msg:s.event,tick:s.tick,simT:s.simT,meta:{seq:s.seq,...s.detail!==void 0?{detail:s.detail}:{}}})),lastSeq:r.at(-1)?.seq??e}}const Ne="data-volter-replay-block",pe="data-volter-replay-video",dn="https://replay-assets.invalid/",qo=1e3,Ho=256*1024,Ko=/data:image\/(?:png|jpeg|webp|gif|svg\+xml);base64,[a-zA-Z0-9+/=]+/g;function lt(t){const e=t.getBoundingClientRect();return{left:e.left,top:e.top,width:e.width,height:e.height}}function Yo(t){switch(t.toLowerCase()){case"image/png":return"png";case"image/jpeg":return"jpg";case"image/webp":return"webp";case"image/gif":return"gif";case"image/svg+xml":return"svg";default:return null}}function Jo(t){const e=/^data:([^;,]+);base64,([\s\S]+)$/i.exec(t);if(!e)throw new Error("image data URL is not base64 encoded");const n=atob(e[2]),r=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)r[s]=n.charCodeAt(s);return new Blob([r],{type:e[1].toLowerCase()})}function Xo(t){const e=[];for(let n=t;n&&n!==document.body;n=n.parentElement){const r=n.parentElement;if(!r)break;for(const s of Array.from(r.children))s!==n&&!["STYLE","LINK","SCRIPT"].includes(s.tagName)&&!s.hasAttribute(Ne)&&(s.setAttribute(Ne,""),e.push(s))}return()=>{for(const n of e)n.removeAttribute(Ne)}}function Qo(t,e,n){if(n.format!=="canvas-dom"||n.replayPath===null)throw new Error("gameplay DOM recording requires a canvas-dom sink");const r=Xo(t),s=e.getAttribute(pe);e.setAttribute(pe,"");const o=()=>{r(),s===null?e.removeAttribute(pe):e.setAttribute(pe,s)},i=[],a=new Map,l=[];let p=0,u=0,f=0,d=0,c=0,h=null,E=Date.now(),v=null,S=Promise.resolve(),y=!1;const w=(b,z)=>{S=S.then(async()=>{if(!v)try{await z()}catch(re){const H=re instanceof Error?re.message:String(re);v=new Error(`${b}: ${H}`)}})},k=b=>{const z=a.get(b);if(z)return`${dn}${z}`;const re=/^data:([^;,]+)/i.exec(b)?.[1]??"",H=Yo(re);if(!H)return b;const Pe=`${String(c).padStart(6,"0")}.${H}`;return c+=1,a.set(b,Pe),w(`replay asset ${Pe}`,async()=>{const Ht=Jo(b);f+=Ht.size,await Gr(n,Pe,Ht)}),`${dn}${Pe}`},_=b=>b.includes("data:image/")?b.replace(Ko,k):b,T=()=>{if(i.length===0)return;const b=new Blob([`[${i.join(",")}]`],{type:"application/json"});i.length=0,p=0;const z=d;d+=1,w(`DOM event batch ${z}`,()=>zr(n,z,b))};let D;try{D=se({emit(b){h??=b.timestamp;const z=JSON.stringify(b,(re,H)=>typeof H=="string"?_(H):H);i.push(z),p+=z.length,u+=1,p>=Ho&&T()},blockSelector:`[${Ne}], [${pe}]`,recordCanvas:!0,inlineStylesheet:!0,inlineImages:!1,collectFonts:!0,sampling:{mousemove:!1,mouseInteraction:!1,scroll:100,canvas:15},errorHandler(b){return l.push(b instanceof Error?b.message:String(b)),!0}})}catch(b){throw o(),b}if(!D)throw o(),new Error("rrweb could not start the DOM recording");const N=t.ownerDocument.defaultView??window,L={width:N.innerWidth,height:N.innerHeight,dpr:N.devicePixelRatio},I=lt(t),fe=lt(e),st=se.mirror.getId(t),Pr=se.mirror.getId(e),Vt=typeof ResizeObserver>"u"?null:new ResizeObserver(()=>{se.addCustomEvent("volter-canvas-layout",{rect:lt(e),drawingWidth:e.width,drawingHeight:e.height,dpr:N.devicePixelRatio})});Vt?.observe(e),se.addCustomEvent("volter-canvas-layout",{rect:fe,drawingWidth:e.width,drawingHeight:e.height,dpr:N.devicePixelRatio});const Ar=N.setInterval(T,qo),qt=()=>{N.clearInterval(Ar),Vt?.disconnect(),o()};return{markVideoStarted(b){E=b},async stop(b){if(y)throw new Error("gameplay DOM recording is already stopped");if(y=!0,se.addCustomEvent("volter-recording-stop",{}),D(),qt(),T(),await S,v)throw v;return{version:1,recorder:"rrweb@2.1.6",events:"events.json",assets:"assets/",video:b,videoStartEpochMs:E,firstEventEpochMs:h,viewport:L,surface:I,surfaceNodeId:st,canvas:{...fe,nodeId:Pr,drawingWidth:e.width,drawingHeight:e.height},eventCount:u,assetCount:a.size,assetBytes:f,rrwebErrors:l}},async abort(){y||(y=!0,D(),qt(),i.length=0,await S)}}}function Zo(){let t=null,e=!1,n=null;const r=`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-BiH6f3Mk.js","assets/extends-CF3RwP-h.js","assets/index-nmcBqr7Y.js","assets/_commonjsHelpers-D6-XlEtG.js","assets/index-D_NuPfjr.js","assets/client-DNXj_opT.js","assets/index-CinJrH5C.js","assets/three.module-BLhyNg0e.js","assets/three.core-3arARmh6.js","assets/events-156d8d12.esm-DmeaOP4r.js","assets/jsx-runtime-DPjLkJKQ.js","assets/index-DzuOGwVB.js","assets/Gltf-CRUmmFxv.js","assets/BufferGeometryUtils-FJZNEiJN.js","assets/OrthographicCamera-Bv8_A2mi.js","assets/Fbo-Biv6Lrhl.js","assets/PerspectiveCamera-D3r6Hnc8.js","assets/OrbitControls-C6LQ4Pxi.js","assets/index-BfqJPhFO.js","assets/index-CtzuWnCS.js","assets/index-FUuS4qwW.js","assets/index-CPiRKiDC.css","assets/RoundedBox-DrJK5JOI.js","assets/babylon-authoring-adapter-BB5HErRG.js","assets/json-history-resource-De8KJl61.js","assets/source-persistence-backend-CbCbDOjd.js","assets/ingest-source-persistence-CrXFBT__.js","assets/pixi-authoring-adapter-qbP0YW7g.js","assets/index-CFS_B4hc.js","assets/component-instance-root-QYCCyhxU.js","assets/user-data-CTT8ZvVB.js","assets/workspace-arrangement-BXM0R-Uu.js","assets/pixi-transform-channels-P4rvmusc.js","assets/pixi-live-write-target-coTAFFGW.js","assets/canvas-entry-runtime-nWfnVKYb.js","assets/debug-registry-BzagDrhV.js","assets/mount-ingest-root-DHVNQKHi.js","assets/active-ingest-DJ8FmH5M.js","assets/game-contract-seams-CuBiefwV.js","assets/capability-coverage-aT7nf05J.js","assets/contract-system-adapters-DIpeIRm_.js","assets/three-state-cYB28OIz.js","assets/editor-shell-store-B3c29A3l.js","assets/output-pass-HurwNl0G.js","assets/Pass-D1MRT672.js","assets/editor-layers-k0AjpomL.js","assets/entity-object-BOLh6DVA.js","assets/three-contract-Dkt6PmWY.js","assets/module-mode-Bb9fFtEw.js","assets/binding-resolver-CXF3o1ZX.js","assets/native-debug-module-L_Ofssyj.js","assets/native-entry-surface-BE8LJNdu.js","assets/adapter-surface-Y37Nzcyw.js","assets/structural-signature-Dc7skRiy.js","assets/webgl-frame-capture-DdJkM2mi.js","assets/realm-services-CxfLBQQ9.js","assets/three-ingest-runtime-QhrURliQ.js","assets/EffectComposer-BEAt0PtQ.js","assets/CopyShader-BzTUYzf6.js","assets/ShaderPass-DTnDQXm0.js","assets/CSS3DRenderer-BsAqfavI.js","assets/relative-path-guard-GiM7Lsz8.js","assets/react-root-BHA-cdrW.js","assets/mount-manifest-cYykTsXQ.js","assets/create-runtime-ByZWXstA.js","assets/binding-Bmxqznjk.js","assets/root-stacking-BEd9ZvxC.js","assets/assets-BcrMQHRv.js","assets/loader-BTUKnX5Q.js","assets/KTX2Loader-CaqVE6nY.js","assets/GLTFLoader-KeoruJgS.js","assets/BufferGeometryUtils-B22h7jo4.js","assets/setup-renderer-CWvtkVDR.js","assets/index-DHhMOs_s.js","assets/defaults-DKiBJCPN.js","assets/render-settings-BUT8gPkc.js","assets/render-features-D7pQr-dE.js","assets/seeded-random-C9256-Ag.js","assets/loop-gate-report-N52EWFGD.js","assets/system-slot-E2mEdiih.js","assets/user-data-CODoGZqA.js","assets/object-marks-BnvSuCTt.js","assets/performance-profiler-CMbwGBuk.js","assets/debug-bridge-C7NLsHKu.js","assets/index-OZVqp6xS.js","assets/index-Da9JhEvW.js","assets/game-audio-BeCyd0Ha.js","assets/rapier-physics-adapter-CaZqWLu0.js","assets/live-project-verbs-CDRzC_D1.js","assets/edit-mode-authoring-DthrLbz-.js","assets/editor-presentation-activity-CqJH4G9t.js","assets/pixi-story-model-DNkfnWUV.js","assets/surface-content-Dg9Kkazf.js","assets/viewport-root-presentation-DmDBAZ8E.js","assets/mounted-authoring-B2dc__pv.js","assets/three-BvhtsSAr.js","assets/viewport-editor-controls-BYaAZ_Ku.js","assets/three-authoring-adapter-K8a5THvW.js","assets/three-projection-core-C2Zj6hTy.js","assets/body-marks-C1LxJtQb.js","assets/structural-ids-BOo2BRoY.js","assets/object3d-authoring-subject-XccsO0xG.js","assets/r3f-physics-binding-EfYECbQc.js","assets/deferred-ingest-play-DMp_yRhc.js","assets/rrweb-Cd2ifIRP.js","assets/react-world-authoring-adapter-Cf1jv2dl.js","assets/board-guides-BYnclES1.js","assets/relative-import-specifier-J1WeZQaJ.js","assets/story-arg-descriptors-Ek86ExX7.js","assets/inspect-UxYR9Ls5.js","assets/inference-diagnostics-NvA3SRR7.js","assets/writer-tw6EcuVO.js","assets/viewport-door-BBtilr3V.js","assets/game-surface-defaults-D8S4cRxi.js"])))=>i.map(i=>d[i]);
2
+ import{u as An,p as Ir,S as xr}from"./index-OZVqp6xS.js";import{decode as Q,encode as Rr}from"./index-Da9JhEvW.js";import{$ as At,a4 as In,a3 as Cr,_ as B,e2 as xn,c6 as Or,p as Rn,X as kr,h6 as Dr,md as Nr,me as Fr,mb as jr,mf as $r,mg as Br,cd as Gr,ce as zr,a2 as Cn,mh as On,c7 as Ur,c8 as Wr,ca as kn,mi as Vr,a1 as qr,mj as Hr,c9 as Kr,Z as M,r as P,jj as Dn,mk as Yr,ml as Jr,mm as Xr,mn as X,ap as Qr,lg as Nn,an as Zr,c0 as Me,jF as es,mo as ts,az as Fn,mp as ns,aC as Xe,I as jn,ag as Ae,kw as Kt,mq as $n,mr as Bn,ms as Gn,kO as zn,hf as Un,q as rs,kC as ss,mt as os,mu as is,mv as as,mw as ls,mx as cs,gY as us,gr as ds,aG as fs,b$ as Wn,my as ps,mz as Vn,lR as gs,ga as hs,bU as ms,bV as ys,e7 as ws,gT as vs,mA as bs,gA as Ls,fw as Es}from"./index-BfqJPhFO.js";import{i as Ss,b as _s}from"./native-debug-module-L_Ofssyj.js";import{T as Ie,c as Ms,g as Ts}from"./seeded-random-C9256-Ag.js";import{g as Qe,D as K}from"./debug-registry-BzagDrhV.js";import{o as Ps}from"./game-audio-BeCyd0Ha.js";import{createRapierBodyEditing as As}from"./rapier-physics-adapter-CaZqWLu0.js";import{_ as Is}from"./events-156d8d12.esm-DmeaOP4r.js";import{fo as We,dp as gt}from"./three.core-3arARmh6.js";import{b as qn,p as Hn}from"./live-project-verbs-CDRzC_D1.js";import{B as Yt}from"./edit-mode-authoring-DthrLbz-.js";import{p as Kn,c as xs}from"./json-history-resource-De8KJl61.js";import{b as Yn}from"./binding-resolver-CXF3o1ZX.js";import{i as Rs,s as Cs}from"./editor-presentation-activity-CqJH4G9t.js";import{E as Jn,$ as Os,a0 as ks,G as Xn,B as ht,l as Ve,a1 as Ds,g as Ns}from"./active-ingest-DJ8FmH5M.js";import{m as Fs}from"./pixi-story-model-DNkfnWUV.js";import{t as js,d as $s}from"./surface-content-Dg9Kkazf.js";import{p as Bs,l as Gs}from"./viewport-root-presentation-DmDBAZ8E.js";import{assertNever as zs}from"./adapter-surface-Y37Nzcyw.js";import{r as Us,o as Ws,s as Vs}from"./three-authoring-adapter-K8a5THvW.js";import{t as It}from"./three-contract-Dkt6PmWY.js";import{mountDeferredIngestForPlay as qs,exitDeferredIngestPlay as Hs}from"./deferred-ingest-play-DMp_yRhc.js";import{r as se}from"./rrweb-Cd2ifIRP.js";import{R as Ks,w as Ys}from"./react-world-authoring-adapter-Cf1jv2dl.js";import{o as Js}from"./three-state-cYB28OIz.js";import{p as Xs}from"./viewport-door-BBtilr3V.js";import{m as Qn}from"./game-surface-defaults-D8S4cRxi.js";async function Qs(t){try{const e=await fetch(`${At}/log-session`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"start",...t?{name:t}:{}})});return(await Cr(e,"Could not start a play log session")).file}catch{return null}}async function Zs(){try{const t=await fetch(`${At}/log-session`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"end"})});In(t,"Could not end the play log session")}catch{}}async function Zn(t){if(t.length===0)return!0;try{const e=await fetch(`${At}/log-entries`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({entries:t})});return In(e,"Could not flush play log entries"),!0}catch{return!1}}async function eo(t){if(t.length===0)return;const{useGLTF:e,useTexture:n}=await B(async()=>{const{useGLTF:r,useTexture:s}=await import("./index-BiH6f3Mk.js");return{useGLTF:r,useTexture:s}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]));for(const r of t)e.clear(r),n.clear(r)}const to=60;function no(t){if(t.length===0)return{ms:null,fps:null,worstMs:null,samples:[]};let e=0,n=0;for(const s of t)e+=s,s>n&&(n=s);const r=e/t.length;return{ms:xe(r,2),fps:r>0?xe(1e3/r,1):null,worstMs:xe(n,2),samples:t.map(s=>xe(s,2))}}function xe(t,e){const n=10**e;return Math.round(t*n)/n}const ro="No physics adapter on this game implements setDebugDrawEnabled, so nothing can draw its colliders. A first-party three root with Rapier physics registers one; a game with no physics has no colliders to draw.",Re=xn([]);function so(t){const e=[];let n=Jt();const r=t.onRenderStep(()=>{const a=Jt();e.push(a-n),n=a,e.length>to&&e.shift()});let s=!1;const o=()=>{const a=Rn(t.systemAdapters.physics);return a?.setDebugDrawEnabled?a:null};return{instruments:[{id:"timescale",label:"Time scale",hint:"Sim speed multiplier. 1 is real time, 0 freezes the simulation while the game keeps drawing.",unit:"x",control:{kind:"scale",action:"set",min:Ie.min,max:Ie.max,step:.05},actions:[{id:"set",label:"Set",hint:`Set the sim speed multiplier (${Ie.min}–${Ie.max}).`,args:xn([Or()]),run:a=>(t.loop.timeScale=Ms(a[0]),t.loop.timeScale)}],read:()=>t.loop.timeScale},{id:"paused",label:"Paused",hint:"Freeze the simulation. The game keeps drawing, so you can look at a frozen frame.",control:{kind:"toggle",action:"toggle"},actions:[{id:"toggle",label:"Toggle",hint:"Pause or resume the simulation.",args:Re,run:()=>(t.play.paused?t.play.resume():t.play.pause(),t.play.paused)},{id:"step",label:"Step",hint:"Advance exactly one fixed substep. Pauses first if the game is running.",args:Re,run:()=>(t.play.paused||t.play.pause(),t.play.step(),t.play.paused)}],read:()=>t.play.paused},{id:"colliders",label:"Colliders drawn",hint:"Draw the physics colliders over the world, through the game's own physics adapter.",control:{kind:"toggle",action:"toggle"},actions:[{id:"toggle",label:"Toggle",hint:"Turn collider wireframes on or off.",args:Re,run:()=>{const a=o();if(!a)throw new Error(ro);return s=!s,a.setDebugDrawEnabled?.(s),s}}],read:()=>o()===null?null:s},{id:"frame-time",label:"Frame time",hint:"Wall-clock milliseconds per display frame, newest last. The window is where a hitch shows; the mean hides it.",unit:"ms",control:{kind:"plot"},actions:[{id:"clear",label:"Clear",hint:"Forget the sampled window and start measuring again.",args:Re,run:()=>(e.length=0,null)}],read:()=>no(e)}],dispose(){r(),e.length=0}}}function Jt(){return typeof performance>"u"?Date.now():performance.now()}const oo="instruments",io="__instruments__";function ao(t){const e={name:`instrument.${t.id}`,id:t.id,label:t.label,hint:t.hint,...t.unit===void 0?{}:{unit:t.unit},control:t.control,actions:t.actions.map(n=>({name:`instrument.${t.id}.${n.id}`,id:n.id,label:n.label,hint:n.hint}))};try{return{...e,value:t.read()}}catch(n){return{...e,value:null,error:n instanceof Error?n.message:String(n)}}}function lo(t){const e=Qe(t);if(!e)throw new Error("Cannot publish dev instruments: mounted Game has no debug registry.");const n=so(t),r=e.forRoot(io);for(const s of n.instruments){r.registerStateProvider(`instrument.${s.id}`,()=>s.read(),{tier:"assisted"});for(const o of s.actions)r.registerCommand(`instrument.${s.id}.${o.id}`,{description:`${s.label}: ${o.label} — ${o.hint}`,locus:"client",args:o.args},(...i)=>o.run(i))}return r.registerStateProvider(oo,()=>n.instruments.map(ao),{tier:"assisted"}),()=>n.dispose()}function co(t){if(!t||typeof t!="object")return!1;const e=t;return e.rigidBodyStates instanceof Map&&e.colliderStates instanceof Map&&e.world!==void 0&&e.rapier!==void 0}let Ce=null,uo=null;function fo(){return Ce||(uo??=(async()=>{if(!await kr()){Ce=Is;return}const t=await import(Dr);if(!(t.r3fRoots instanceof Map))throw new Error("The packaged runtime's synthetic R3F module did not export `r3fRoots` — see R3F_DOORWAY in vite-plugin-module-doorways.ts.");Ce=t.r3fRoots})(),null)}function ie(t){const e=fo();if(!e)return null;for(const n of e.values()){if(n.store.getState().scene!==t)continue;const r=n.fiber.current,s=r?[r]:[];for(;s.length>0;){const o=s.pop(),i=o.memoizedProps?.value;if(co(i))return i;o.sibling&&s.push(o.sibling),o.child&&s.push(o.child)}}return null}function $a(t,e=6e4){const n=performance.now();return new Promise(r=>{const s=()=>{if(ie(t))return r(!0);if(performance.now()-n>e)return r(!1);setTimeout(s,250)};s()})}function Xt(t,e){let n;for(const r of t)if(r.object.traverse(s=>{!n&&s.userData.entityId===e&&(n=s)}),n)return n}function Qt(t,e){const n=new Map;for(const r of e)n.set(r.object,r.rigidBody);for(let r=t;r;r=r.parent){const s=n.get(r);if(s)return s}}const U=t=>[t.x,t.y,t.z],me=t=>[t.x,t.y,t.z,t.w];function Zt(t,e){const{ShapeType:n}=t.rapier;switch(e.shapeType()){case n.Cuboid:return{type:"cuboid",halfExtents:U(e.halfExtents())};case n.Ball:return{type:"ball",radius:e.radius()};case n.Capsule:return{type:"capsule",halfHeight:e.halfHeight(),radius:e.radius()};default:return{type:"unsupported",kind:n[e.shapeType()]??`shapeType ${e.shapeType()}`}}}function po(t,e){const{JointType:n}=t.rapier;switch(e){case n.Revolute:return"revolute";case n.Fixed:return"fixed";case n.Prismatic:return"prismatic";case n.Rope:return"rope";case n.Spring:return"spring";case n.Spherical:return"spherical";default:return"generic"}}function en(t,e){return U(new We(e.x,e.y,e.z).applyQuaternion(new gt(...me(t.rotation()))).add(new We(...U(t.translation()))))}function go(t,e){const n=e.body1(),r=e.body2(),s=e.anchor1(),o=e.anchor2(),i=po(t,e.type()),a=i==="revolute"||i==="prismatic",l=a?e.frameX1():null,p=l?new We(1,0,0).applyQuaternion(new gt(l.x,l.y,l.z,l.w)):null,u=e;return{id:String(e.handle),type:i,body1:String(n.handle),body2:String(r.handle),anchor1:U(s),anchor2:U(o),worldAnchor1:en(n,s),worldAnchor2:en(r,o),body1Position:U(n.translation()),body2Position:U(r.translation()),body1Rotation:me(n.rotation()),body2Rotation:me(r.rotation()),...p?{axis:U(p),worldAxis:U(p.clone().applyQuaternion(new gt(...me(n.rotation()))))}:{},...a&&u.limitsEnabled()?{limits:{min:u.limitsMin(),max:u.limitsMax()}}:{},contactsEnabled:e.contactsEnabled()}}function ho(t){const e=r=>{const s=ie(t);if(!s)return{kind:"unresolved"};const o=[...s.rigidBodyStates.values()],i=Xt(o,r);if(!i)return{kind:"unresolved"};const a=Qt(i,o);return a?{kind:"body",body:a}:{kind:"no-body"}},n=r=>{const s=ie(t);if(!s)return null;const o=[...s.rigidBodyStates.values()],i=Xt(o,r),a=i?Qt(i,o):void 0;return a?{context:s,body:a}:null};return{...As(e),colliders(r){const s=n(r);if(!s)return[];const o=[];for(const i of s.context.colliderStates.values()){if(i.collider.parent()?.handle!==s.body.handle)continue;i.object.updateWorldMatrix(!0,!1);const a=i.object.getWorldScale(new We);o.push({id:String(i.collider.handle),shape:Zt(s.context,i.collider),position:U(i.collider.translation()),rotation:me(i.collider.rotation()),scale:[Math.abs(a.x),Math.abs(a.y),Math.abs(a.z)],sensor:i.collider.isSensor()})}return o.sort((i,a)=>Number(i.id)-Number(a.id))},previewCollider(r,s){const o=ie(t),i=o?[...o.colliderStates.values()].find(a=>String(a.collider.handle)===r)?.collider:void 0;if(!(!o||!i||Zt(o,i).type!==s.type))switch(s.type){case"cuboid":i.setHalfExtents({x:s.halfExtents[0],y:s.halfExtents[1],z:s.halfExtents[2]});break;case"ball":i.setRadius(s.radius);break;case"capsule":i.setHalfHeight(s.halfHeight),i.setRadius(s.radius);break}},joints(r){const s=n(r);if(!s)return[];const o=[],i=s.context.world.impulseJoints;return i.forEachJointHandleAttachedToRigidBody(s.body.handle,a=>{const l=i.get(a);l&&o.push(go(s.context,l))}),o.sort((a,l)=>Number(a.id)-Number(l.id))},previewJointAnchor(r,s,o){const i=ie(t)?.world.impulseJoints.get(Number(r));if(!i)return;const a={x:o[0],y:o[1],z:o[2]};s===0?i.setAnchor1(a):i.setAnchor2(a)}}}const mo="__adapter__",tn=new WeakSet;function nn(t,e){const n=[];for(const r of t.roots){const s=r.binding?.observation[e];s&&n.push(s)}return n}function yo(t,e){return e.some(n=>n.slots.audio||n.absent.some(r=>r.slot==="audio"))?e:t.roots.map(n=>{const r=e.find(s=>s.rootId===n.id);return{rootId:n.id,slots:{...r?.slots,audio:Ps},absent:r?.absent??[]}})}const wo=["@colyseus/sdk","colyseus.js"];function vo(t,e){const n=e.some(u=>u.slots.networking||u.absent.some(f=>f.slot==="networking"));qn();const r=Hn(),s=r===null||r.some(u=>wo.includes(u)),o=t.roots[0];if(n||!s||!o)return e;const i=e.findIndex(u=>u.rootId===o.id),a=i>=0?e[i]:void 0,l={rootId:o.id,slots:{...a?.slots,networking:ua},absent:a?.absent??[]},p=[...e];return i>=0?p[i]=l:p.push(l),p}const bo=["@react-three/rapier","@dimforge/rapier3d-compat"];function Lo(t,e){qn();const n=Hn(),r=n===null||n.some(o=>bo.includes(o)),s=[...e];for(const o of t.roots){if(o.mounted.kind!=="three"||o.mounted.systems?.physics)continue;const i=s.findIndex(f=>f.rootId===o.id),a=i>=0?s[i]:void 0;if(a&&(a.slots.physics||a.absent.some(f=>f.slot==="physics")))continue;const l=o.mounted.scene;if(!r&&!ie(l))continue;const p=ho(l),u={rootId:o.id,slots:{...a?.slots,physics:p},absent:a?.absent??[]};i>=0?s[i]=u:s.push(u)}return s}function Eo(t,e,n){const r=e.forRoot(mo);for(const s of n){if(s.kind==="state"){r.registerStateProvider(s.id,()=>{if(!s.answer)throw new K("OBSERVATION_UNANSWERED",`Observation "${s.id}" (state) is declared by this game's adapter with no answer.`);return s.answer(t)},{tier:"assisted"});continue}r.registerCommand(s.id,{...s.description?{description:s.description}:{},locus:s.locus??"client"},(...o)=>{if(!s.answer)throw new K("OBSERVATION_UNANSWERED",`Observation "${s.id}" (command) is declared by this game's adapter with no answer.`);return s.answer(t,...o)})}}function ot(t,e){const n=t.actions(e);if(!Array.isArray(n))throw new Error("volter.adapter.ts input.actions must return an array.");const r=new Map;for(const s of n){if(typeof s?.name!="string"||s.name.length===0||!Fr.includes(s.valueType))throw new Error("volter.adapter.ts input.actions returned an invalid action; each action needs a non-empty `name` and a supported `valueType`.");if(r.has(s.name))throw new Error(`volter.adapter.ts input.actions returned duplicate action "${s.name}".`);r.set(s.name,s.valueType)}return r}function So(t,e){return t==="digital"?typeof e=="boolean":t==="scalar"?typeof e=="number"&&Number.isFinite(e):typeof e=="object"&&e!==null&&typeof e.x=="number"&&Number.isFinite(e.x)&&typeof e.y=="number"&&Number.isFinite(e.y)}function _o(t,e,n){if(!t.world(n.root))throw new Error(`volter.adapter.ts input.root names "${n.root}", which is not a mounted manifest root.`);const r=[],s=[];let o=!1;const i=(f,d)=>{const c=ot(n,t).get(f);if(!c)throw new K("INPUT_ACTION_NOT_FOUND",`Adapter input has no action named "${f}".`,{registered:[...ot(n,t).keys()]});if(!So(c,d))throw new K("INPUT_ACTION_VALUE_TYPE",`Adapter input action "${f}" expects ${c}, not ${typeof d}.`,{action:f,expected:c});return c},a=(f,d,c)=>{i(f,d),n.set(t,f,d),o&&s.push({tick:c,action:f,value:d})},l=()=>{const f=e.getGameTick(),d=r.filter(c=>c.tick===f);if(d.length!==0){for(let c=r.length-1;c>=0;c--)r[c].tick===f&&r.splice(c,1);for(const c of d)a(c.action,c.value,f)}};t.systems.add("input",l,{name:"adapter.input"});const p=f=>{throw new K("ADAPTER_INPUT_SOURCE_UNSUPPORTED",`${f} addresses an engine test source, but this game declares an app-owned action store. Drive it by action name instead.`)},u={setVirtualAction(f,d){return a(f,d,e.getGameTick()),{delivered:!0}},tapVirtualAction(f){const d=e.getGameTick();return a(f,!0,d),r.push({tick:d+1,action:f,value:!1}),{delivered:!0}},clearVirtualActions(){r.length=0,n.clear(t)},scheduleActionAtTick(f,d,c){const h=e.getGameTick();if(!Number.isInteger(f)||f<h)throw new K("TICK_ALREADY_PASSED",`Cannot schedule adapter input for tick ${f}; current tick is ${h}.`,{tick:f,currentTick:h});i(d,c),r.push({tick:f,action:d,value:c})},startInputRecording(){s.length=0,o=!0},stopInputRecording(){o=!1},isInputRecording(){return o},injectAxis(){p("injectAxis")},injectVector2(){p("injectVector2")},injectPointerDelta(){p("injectPointerDelta")},injectPointerPosition(){p("injectPointerPosition")}};e.setInputActionsSource(n.root,()=>[...ot(n,t)].map(([f,d])=>({name:f,valueType:d}))),e.setInputTraceSource(n.root,()=>({version:1,seed:null,fixedDt:t.loop.fixedDt,ticks:[...s]})),e.setVirtualInputTarget(n.root,u)}function er(t){if(tn.has(t))return;Ss(t,nn(t,"entryDebug")),_s(t,vo(t,Lo(t,yo(t,nn(t,"entrySystems"))))),lo(t);const e=Qe(t);if(!e)throw new Error("Cannot install adapter runtime bindings: mounted Game has no debug registry.");t.roots.some(s=>s.mounted.systems?.debug!==void 0&&s.mounted.systems.debug!==e.adapter)||Eo(t,e,jr());const r=Nr();r&&_o(t,e,r),tn.add(t)}let m=(function(t){return t.info="info",t.warn="warn",t.error="error",t.debug="debug",t.trace="trace",t.fatal="fatal",t})({});const ue={trace:10,debug:20,info:30,warn:40,error:50,fatal:60},tr=Symbol.for("loglayer.lazy"),xt="[LazyEvalError]";function le(t){return t!=null&&typeof t=="object"&&tr in t}function rn(t){let e=0;for(const n of Object.keys(t))le(t[n])&&e++;return e}function it(t){let e=!1;for(const s of Object.keys(t))if(le(t[s])){e=!0;break}if(!e)return{resolved:t,errors:null};const n={};let r=null;for(const s of Object.keys(t)){const o=t[s];if(le(o))try{n[s]=o[tr]()}catch(i){n[s]=xt,r||(r=[]),r.push({key:s,error:i})}else n[s]=o}return{resolved:n,errors:r}}function Mo(t){for(const e of Object.keys(t))if(t[e]instanceof Promise)return!0;return!1}function sn(t){let e=null;const n={};for(const r of Object.keys(t))t[r]instanceof Promise?(n[r]=xt,e||(e=[]),e.push(r)):n[r]=t[r];return e?{resolved:n,asyncKeys:e}:{resolved:t,asyncKeys:null}}async function To(t){const e=Object.keys(t),n=await Promise.allSettled(e.map(o=>Promise.resolve(t[o]))),r={};let s=null;for(let o=0;o<e.length;o++){const i=n[o];i.status==="fulfilled"?r[e[o]]=i.value:(r[e[o]]=xt,s||(s=[]),s.push({key:e[o],error:i.reason}))}return{resolved:r,errors:s}}function $(t){const e=t[0];if(Array.isArray(e)&&typeof e.raw<"u"){const n=e,r=t.slice(1);let s="";for(let o=0;o<n.length;o++)s+=n[o],o<r.length&&(s+=String(r[o]));return[s]}return t}let C=(function(t){return t.transformLogLevel="transformLogLevel",t.onBeforeDataOut="onBeforeDataOut",t.shouldSendToLogger="shouldSendToLogger",t.onMetadataCalled="onMetadataCalled",t.onBeforeMessageOut="onBeforeMessageOut",t.onContextCalled="onContextCalled",t})({});var Po=class nr{context={};hasContext=!1;setContext(e){if(!e){this.context={},this.hasContext=!1;return}this.context=e,this.hasContext=!0}appendContext(e){this.context={...this.context,...e},this.hasContext=!0}getContext(){return this.context}hasContextData(){return this.hasContext}clearContext(e){if(e===void 0){this.context={},this.hasContext=!1;return}const n=Array.isArray(e)?e:[e];for(const r of n)delete this.context[r];this.hasContext=Object.keys(this.context).length>0}onChildLoggerCreated({parentContextManager:e,childContextManager:n}){if(e.hasContextData()){const r=e.getContext();n.setContext({...r})}}clone(){const e=new nr;return e.setContext({...this.context}),e.hasContext=this.hasContext,e}},Ao=class mt{logLevelEnabledStatus={info:!0,warn:!0,error:!0,debug:!0,trace:!0,fatal:!0};setLevel(e){const n=ue[e];for(const r of Object.values(m)){const s=r,o=ue[r];this.logLevelEnabledStatus[s]=o>=n}}enableIndividualLevel(e){const n=e;n in this.logLevelEnabledStatus&&(this.logLevelEnabledStatus[n]=!0)}disableIndividualLevel(e){const n=e;n in this.logLevelEnabledStatus&&(this.logLevelEnabledStatus[n]=!1)}isLevelEnabled(e){const n=e;return this.logLevelEnabledStatus[n]}enableLogging(){for(const e of Object.keys(this.logLevelEnabledStatus))this.logLevelEnabledStatus[e]=!0}disableLogging(){for(const e of Object.keys(this.logLevelEnabledStatus))this.logLevelEnabledStatus[e]=!1}onChildLoggerCreated({parentLogLevelManager:e,childLogLevelManager:n}){const r=e.logLevelEnabledStatus;n instanceof mt&&(n.logLevelEnabledStatus={...r})}clone(){const e=new mt;return e.logLevelEnabledStatus={...this.logLevelEnabledStatus},e}},Io=class{id;enabled;level;consoleDebug;constructor(t){this.id=t.id??Date.now().toString()+Math.random().toString(),this.enabled=t.enabled??!0,this.consoleDebug=t.consoleDebug??!1,this.level=t.level??"trace"}_sendToLogger(t){if(!this.enabled||ue[t.logLevel]<ue[this.level])return;const e=this.shipToLogger(t);if(this.consoleDebug)switch(t.logLevel){case m.info:console.info(...e);break;case m.warn:console.warn(...e);break;case m.error:console.error(...e);break;case m.trace:console.debug(...e);break;case m.debug:console.debug(...e);break;case m.fatal:console.debug(...e);break;default:console.log(...e)}}getLoggerInstance(){throw new Error("This transport does not have a logger instance")}},xo={};const Ro=[C.onBeforeDataOut,C.onMetadataCalled,C.onBeforeMessageOut,C.transformLogLevel,C.shouldSendToLogger,C.onContextCalled];var on=class{idToPlugin;transformLogLevel=[];onBeforeDataOut=[];shouldSendToLogger=[];onMetadataCalled=[];onBeforeMessageOut=[];onContextCalled=[];constructor(t){this.idToPlugin={},this.mapPlugins(t),this.indexPlugins()}mapPlugins(t){for(const e of t){if(e.id||(e.id=Date.now().toString()+Math.random().toString()),this.idToPlugin[e.id])throw new Error(`[LogLayer] Plugin with id ${e.id} already exists.`);e.registeredAt=Date.now(),this.idToPlugin[e.id]=e}}indexPlugins(){this.transformLogLevel=[],this.onBeforeDataOut=[],this.shouldSendToLogger=[],this.onMetadataCalled=[],this.onBeforeMessageOut=[],this.onContextCalled=[];const t=Object.values(this.idToPlugin).sort((e,n)=>e.registeredAt-n.registeredAt);for(const e of t){if(e.disabled)return;for(const n of Ro)e[n]&&e.id&&this[n].push(e.id)}}hasPlugins(t){return this[t].length>0}countPlugins(t){return t?this[t].length:Object.keys(this.idToPlugin).length}addPlugins(t){this.mapPlugins(t),this.indexPlugins()}enablePlugin(t){const e=this.idToPlugin[t];e&&(e.disabled=!1),this.indexPlugins()}disablePlugin(t){const e=this.idToPlugin[t];e&&(e.disabled=!0),this.indexPlugins()}removePlugin(t){delete this.idToPlugin[t],this.indexPlugins()}runTransformLogLevel(t,e){let n=null;for(const r of this.transformLogLevel){const s=this.idToPlugin[r];if(s.transformLogLevel){const o=s.transformLogLevel({data:t.data,logLevel:t.logLevel,messages:t.messages,error:t.error,metadata:t.metadata,context:t.context,groups:t.groups,schema:t.schema,prefix:t.prefix},e);o!=null&&o!==!1&&(n=o)}}return n!=null&&n!==!1?n:t.logLevel}runOnBeforeDataOut(t,e){const n={...t},r=n.data;for(const s of this.onBeforeDataOut){const o=this.idToPlugin[s];if(o.onBeforeDataOut){const i=o.onBeforeDataOut({data:n.data,logLevel:n.logLevel,error:n.error,metadata:n.metadata,context:n.context,groups:n.groups,schema:n.schema,prefix:n.prefix},e);i&&(n.data||(n.data={}),i!==r&&Object.assign(n.data,i))}}return n.data}runShouldSendToLogger(t,e){return!this.shouldSendToLogger.some(n=>!this.idToPlugin[n].shouldSendToLogger?.(t,e))}runOnMetadataCalled(t,e){let n={...t};for(const r of this.onMetadataCalled){const s=this.idToPlugin[r].onMetadataCalled?.(n,e);if(s)n=s;else return null}return n}runOnBeforeMessageOut(t,e){let n=[...t.messages];for(const r of this.onBeforeMessageOut){const s=this.idToPlugin[r].onBeforeMessageOut?.({messages:n,logLevel:t.logLevel,groups:t.groups,schema:t.schema,prefix:t.prefix},e);s&&(n=s)}return n}runOnContextCalled(t,e){let n={...t};for(const r of this.onContextCalled){const s=this.idToPlugin[r].onContextCalled?.(n,e);if(s)n=s;else return null}return n}},Co=class rr{pluginManager;idToTransport;hasMultipleTransports;singleTransport;contextManager;logLevelManager;_isLoggingLazyError=!1;_lazyContextCount=0;_assignedGroups=null;_groupsConfig=null;_activeGroups=null;_ungroupedBehavior="all";_config;constructor(e){this._config={...e,enabled:e.enabled??!0},this.contextManager=new Po,this.logLevelManager=new Ao,this._config.enabled||this.disableLogging();const n=[...e.plugins||[],...ye.pluginsToInit];this.pluginManager=new on(n),this._config.errorFieldName||(this._config.errorFieldName="err"),this._config.copyMsgOnOnlyError||(this._config.copyMsgOnOnlyError=!1),this._initializeTransports(this._config.transport),this._groupsConfig=e.groups?{...e.groups}:null,this._ungroupedBehavior=e.ungroupedBehavior??"all",this._activeGroups=e.activeGroups?new Set(e.activeGroups):null,this._parseEnvGroups(),ye.logLayerHandlers.length>0&&ye.logLayerHandlers.forEach(r=>{r.onConstruct&&r.onConstruct(this,e)})}withContextManager(e){return this.contextManager&&typeof this.contextManager[Symbol.dispose]=="function"&&this.contextManager[Symbol.dispose](),this.contextManager=e,this._lazyContextCount=e.hasContextData()?rn(e.getContext()):0,this}getContextManager(){return this.contextManager}withLogLevelManager(e){return this.logLevelManager&&typeof this.logLevelManager[Symbol.dispose]=="function"&&this.logLevelManager[Symbol.dispose](),this.logLevelManager=e,this}getLogLevelManager(){return this.logLevelManager}getConfig(){return this._config}_initializeTransports(e){if(this.idToTransport)for(const n in this.idToTransport)this.idToTransport[n]&&typeof this.idToTransport[n][Symbol.dispose]=="function"&&this.idToTransport[n][Symbol.dispose]();this.hasMultipleTransports=Array.isArray(e)&&e.length>1,this.singleTransport=this.hasMultipleTransports?null:Array.isArray(e)?e[0]:e,Array.isArray(e)?this.idToTransport=e.reduce((n,r)=>(n[r.id]=r,n),{}):this.idToTransport={[e.id]:e}}withPrefix(e){const n=this.child();return n._config.prefix=e,n}withGroup(e){const n=this.child(),r=Array.isArray(e)?e:[e];if(n._assignedGroups){const s=new Set([...n._assignedGroups,...r]);n._assignedGroups=Array.from(s)}else n._assignedGroups=[...r];return n}addGroup(e,n){return this._groupsConfig||(this._groupsConfig={}),this._groupsConfig[e]={...n},this}removeGroup(e){return this._groupsConfig&&(delete this._groupsConfig[e],Object.keys(this._groupsConfig).length===0&&(this._groupsConfig=null)),this}enableGroup(e){return this._groupsConfig?.[e]&&(this._groupsConfig[e]={...this._groupsConfig[e],enabled:!0}),this}disableGroup(e){return this._groupsConfig?.[e]&&(this._groupsConfig[e]={...this._groupsConfig[e],enabled:!1}),this}setGroupLevel(e,n){return this._groupsConfig?.[e]&&(this._groupsConfig[e]={...this._groupsConfig[e],level:n}),this}setActiveGroups(e){return this._activeGroups=e?new Set(e):null,this}getGroups(){return this._groupsConfig?{...this._groupsConfig}:{}}withContext(e){let n=e;if(!e)return this._config.consoleDebug&&console.debug("[LogLayer] withContext was called with no context; dropping."),this;if(this.pluginManager.hasPlugins(C.onContextCalled)&&(n=this.pluginManager.runOnContextCalled(e,this),!n))return this._config.consoleDebug&&console.debug("[LogLayer] Context was dropped due to plugin returning falsy value."),this;const r=this.contextManager.getContext();for(const s of Object.keys(n)){const o=s in r&&le(r[s]),i=le(n[s]);!o&&i?this._lazyContextCount++:o&&!i&&this._lazyContextCount--}return this.contextManager.appendContext(n),this}clearContext(e){if(e!==void 0&&this._lazyContextCount>0){const n=this.contextManager.getContext(),r=Array.isArray(e)?e:[e];for(const s of r)s in n&&le(n[s])&&this._lazyContextCount--}else e===void 0&&(this._lazyContextCount=0);return this.contextManager.clearContext(e),this}getContext(e){const n=this.contextManager.getContext();if(e?.raw||this._lazyContextCount===0)return n;const{resolved:r,errors:s}=it(n);s&&this._logLazyEvalErrors(s,"context");const{resolved:o,asyncKeys:i}=sn(r);return i&&this._logAsyncLazyContextErrors(i),o}addPlugins(e){this.pluginManager.addPlugins(e)}enablePlugin(e){this.pluginManager.enablePlugin(e)}disablePlugin(e){this.pluginManager.disablePlugin(e)}removePlugin(e){this.pluginManager.removePlugin(e)}withMetadata(e){return new an(this).withMetadata(e)}withError(e){return new an(this).withError(e)}child(){const e=new rr({...this._config,transport:Array.isArray(this._config.transport)?[...this._config.transport]:this._config.transport}).withPluginManager(this.pluginManager).withContextManager(this.contextManager.clone()).withLogLevelManager(this.logLevelManager.clone());return this.contextManager.onChildLoggerCreated({parentContextManager:this.contextManager,childContextManager:e.contextManager,parentLogger:this,childLogger:e}),this.logLevelManager.onChildLoggerCreated({parentLogLevelManager:this.logLevelManager,childLogLevelManager:e.logLevelManager,parentLogger:this,childLogger:e}),e._lazyContextCount=e.contextManager.hasContextData()?rn(e.contextManager.getContext()):0,e._groupsConfig=this._groupsConfig,e._activeGroups=this._activeGroups,e._ungroupedBehavior=this._ungroupedBehavior,e._assignedGroups=this._assignedGroups?[...this._assignedGroups]:null,e}withFreshTransports(e){return this._config.transport=e,this._initializeTransports(e),this}addTransport(e){const n=Array.isArray(e)?e:[e],r=Array.isArray(this._config.transport)?this._config.transport:[this._config.transport],s=new Set(n.map(i=>i.id));for(const i of n){const a=this.idToTransport[i.id];a&&typeof a[Symbol.dispose]=="function"&&a[Symbol.dispose]()}const o=[...r.filter(i=>!s.has(i.id)),...n];this._config.transport=o;for(const i of n)this.idToTransport[i.id]=i;return this.hasMultipleTransports=o.length>1,this.singleTransport=this.hasMultipleTransports?null:o[0],this}removeTransport(e){const n=this.idToTransport[e];if(!n)return!1;typeof n[Symbol.dispose]=="function"&&n[Symbol.dispose](),delete this.idToTransport[e];const r=(Array.isArray(this._config.transport)?this._config.transport:[this._config.transport]).filter(s=>s.id!==e);return this._config.transport=r.length===1?r[0]:r,this.hasMultipleTransports=r.length>1,this.singleTransport=this.hasMultipleTransports?null:r[0]||null,!0}withFreshPlugins(e){return this._config.plugins=e,this.pluginManager=new on(e),this}withPluginManager(e){return this.pluginManager=e,this}errorOnly(e,n){const r=n?.logLevel||m.error;if(!this.isLevelEnabled(r))return;const{copyMsgOnOnlyError:s}=this._config,o={logLevel:r,err:e};(s&&n?.copyMsg!==!1||n?.copyMsg===!0)&&e?.message&&(o.params=[e.message]),this._formatLog(o)}metadataOnly(e,n=m.info){if(!this.isLevelEnabled(n))return;const{muteMetadata:r,consoleDebug:s}=this._config;if(r)return;if(!e){s&&console.debug("[LogLayer] metadataOnly was called with no metadata; dropping.");return}let o=e;if(this.pluginManager.hasPlugins(C.onMetadataCalled)&&(o=this.pluginManager.runOnMetadataCalled(e,this),!o)){s&&console.debug("[LogLayer] Metadata was dropped due to plugin returning falsy value.");return}const i={logLevel:n,metadata:o};return this._formatLog(i)}info(...e){if(!this.isLevelEnabled(m.info))return;const n=$(e);this._formatMessage(n),this._formatLog({logLevel:m.info,params:n})}warn(...e){if(!this.isLevelEnabled(m.warn))return;const n=$(e);this._formatMessage(n),this._formatLog({logLevel:m.warn,params:n})}error(...e){if(!this.isLevelEnabled(m.error))return;const n=$(e);this._formatMessage(n),this._formatLog({logLevel:m.error,params:n})}debug(...e){if(!this.isLevelEnabled(m.debug))return;const n=$(e);this._formatMessage(n),this._formatLog({logLevel:m.debug,params:n})}trace(...e){if(!this.isLevelEnabled(m.trace))return;const n=$(e);this._formatMessage(n),this._formatLog({logLevel:m.trace,params:n})}fatal(...e){if(!this.isLevelEnabled(m.fatal))return;const n=$(e);this._formatMessage(n),this._formatLog({logLevel:m.fatal,params:n})}raw(e){if(!this.isLevelEnabled(e.logLevel))return;const n={logLevel:e.logLevel,params:e.messages,metadata:e.metadata,rootData:e.rootData,err:e.error,context:e.context};return this._formatMessage(e.messages),this._formatLog(n)}disableLogging(){return this.logLevelManager.disableLogging(),this}enableLogging(){return this.logLevelManager.enableLogging(),this}muteContext(){return this._config.muteContext=!0,this}unMuteContext(){return this._config.muteContext=!1,this}muteMetadata(){return this._config.muteMetadata=!0,this}unMuteMetadata(){return this._config.muteMetadata=!1,this}enableIndividualLevel(e){return this.logLevelManager.enableIndividualLevel(e),this}disableIndividualLevel(e){return this.logLevelManager.disableIndividualLevel(e),this}setLevel(e){return this.logLevelManager.setLevel(e),this}isLevelEnabled(e){return this.logLevelManager.isLevelEnabled(e)}formatContext(e){const{contextFieldName:n,muteContext:r}=this._config;return e&&Object.keys(e).length>0&&!r?n?{[n]:{...e}}:{...e}:{}}formatMetadata(e=null){const{metadataFieldName:n,muteMetadata:r}=this._config;return e&&!r?n?{[n]:{...e}}:{...e}:{}}getLoggerInstance(e){const n=this.idToTransport[e];if(n)return n.getLoggerInstance()}_parseEnvGroups(){const e=typeof process<"u"?xo?.LOGLAYER_GROUPS:void 0;if(!e)return;const n=e.split(",").map(s=>s.trim()).filter(Boolean),r=[];for(const s of n){const o=s.indexOf(":");if(o>0){const i=s.slice(0,o),a=s.slice(o+1);r.push(i),this._groupsConfig?.[i]&&(this._groupsConfig[i]={...this._groupsConfig[i],level:a})}else r.push(s)}this._activeGroups=new Set(r)}_mergeGroups(e){if(this._assignedGroups&&e){const n=new Set([...this._assignedGroups,...e]);return Array.from(n)}return e||this._assignedGroups}_applyUngroupedRules(e){return this._ungroupedBehavior==="all"?!0:this._ungroupedBehavior==="none"?!1:this._ungroupedBehavior.includes(e)}_shouldTransportReceiveLog(e,n,r){if(!this._groupsConfig)return!0;const s=this._mergeGroups(r);if(!s||s.length===0)return this._applyUngroupedRules(e);let o=!1;for(const i of s){const a=this._groupsConfig[i];if(a&&(o=!0,a.enabled!==!1&&!(this._activeGroups&&!this._activeGroups.has(i)))){if(a.level){const l=ue[a.level];if(ue[n]<l)continue}if(a.transports.includes(e))return!0}}return o?!1:this._applyUngroupedRules(e)}_formatMessage(e=[]){const{prefix:n}=this._config;n&&typeof e[0]=="string"&&(e[0]=`${n} ${e[0]}`)}_formatLog({logLevel:e,params:n=[],metadata:r=null,rootData:s=null,err:o,context:i=null,groups:a=null}){const l=i!==null?i:this.contextManager.getContext();let p;if(this._lazyContextCount>0||i!==null){const f=it(l);f.errors&&this._logLazyEvalErrors(f.errors,"context");const{resolved:d,asyncKeys:c}=sn(f.resolved);c&&this._logAsyncLazyContextErrors(c),p=d}else p=l;let u=null;if(r){const f=it(r);r=f.resolved,u=f.errors}if(u&&this._logLazyEvalErrors(u,"metadata"),r&&Mo(r))return this._resolveAsyncAndProcess(e,n,p,r,s,o,i,a);this._processLog(e,n,p,r,s,o,i,a)}async _resolveAsyncAndProcess(e,n,r,s,o,i,a,l){let p=null;if(s){const u=await To(s);p=u.resolved,u.errors&&this._logLazyEvalErrors(u.errors,"metadata")}this._processLog(e,n,r,p,o,i,a,l)}_logLazyEvalErrors(e,n){if(this._isLoggingLazyError){for(const r of e)console.error(`[LogLayer] Lazy evaluation error in ${n} key "${r.key}":`,r.error);return}this._isLoggingLazyError=!0;try{for(const r of e){const s=r.error instanceof Error?r.error.message:String(r.error);this._processLog(m.error,[`[LogLayer] Lazy evaluation failed for ${n} key "${r.key}": ${s}`],{},null,null,r.error instanceof Error?r.error:void 0,{})}}finally{this._isLoggingLazyError=!1}}_logAsyncLazyContextErrors(e){if(this._isLoggingLazyError){for(const n of e)console.error(`[LogLayer] Async lazy values are not supported in context (key "${n}"). Use async lazy only in metadata.`);return}this._isLoggingLazyError=!0;try{for(const n of e)this._processLog(m.error,[`[LogLayer] Async lazy values are not supported in context (key "${n}"). Use async lazy only in metadata.`],{},null,null,void 0,{})}finally{this._isLoggingLazyError=!1}}_processLog(e,n,r,s,o,i,a,l=null){const{errorSerializer:p,errorFieldInMetadata:u,muteContext:f,contextFieldName:d,metadataFieldName:c,errorFieldName:h,prefix:E}=this._config,v={contextFieldName:d??void 0,metadataFieldName:c??void 0,errorFieldName:h??"err"},S=this._mergeGroups(l)??void 0;let y=!!s||(f?!1:a!==null?Object.keys(a).length>0:this.contextManager.hasContextData()),w={};if(y)if(d&&d===c){const _=this.formatContext(r)[d],T=this.formatMetadata(s)[c];w={[d]:{..._,...T}}}else w={...this.formatContext(r),...this.formatMetadata(s)};if(i){const _=p?p(i):i;u&&s&&c?w?.[c]?w[c][h]=_:w={...w,[c]:{[h]:_}}:u&&!s&&c?w={...w,[c]:{[h]:_}}:w={...w,[h]:_},y=!0}o&&Object.keys(o).length>0&&(w={...w,...o},y=!0),this.pluginManager.hasPlugins(C.onBeforeDataOut)&&(w=this.pluginManager.runOnBeforeDataOut({data:y?w:void 0,logLevel:e,error:i,metadata:s,context:r,groups:S,schema:v,prefix:E},this),w&&!y&&(y=!0)),this.pluginManager.hasPlugins(C.onBeforeMessageOut)&&(n=this.pluginManager.runOnBeforeMessageOut({messages:[...n],logLevel:e,groups:S,schema:v,prefix:E},this)),this.pluginManager.hasPlugins(C.transformLogLevel)&&(e=this.pluginManager.runTransformLogLevel({data:y?w:void 0,logLevel:e,messages:[...n],error:i,metadata:s,context:r,groups:S,schema:v,prefix:E},this));const k={data:y?w:void 0,error:i,metadata:s,context:r,groups:S,schema:v,prefix:E};if(this.hasMultipleTransports){const _=this._config.transport.filter(T=>!(!T.enabled||!this._shouldTransportReceiveLog(T.id,e,S))).map(async T=>{const D=e;if(!(this.pluginManager.hasPlugins(C.shouldSendToLogger)&&!this.pluginManager.runShouldSendToLogger({messages:[...n],logLevel:D,transportId:T.id,...k},this)))return T._sendToLogger({logLevel:D,messages:[...n],hasData:y,...k})});Promise.all(_).catch(T=>{this._config.consoleDebug&&console.error("[LogLayer] Error executing transports:",T)})}else{if(!this.singleTransport?.enabled||!this._shouldTransportReceiveLog(this.singleTransport.id,e,S)||this.pluginManager.hasPlugins(C.shouldSendToLogger)&&!this.pluginManager.runShouldSendToLogger({messages:[...n],logLevel:e,transportId:this.singleTransport.id,...k},this))return;this.singleTransport._sendToLogger({logLevel:e,messages:[...n],hasData:y,...k})}}};const ye={logLayerHandlers:[],pluginsToInit:[],logBuilderHandlers:[]};var an=class{err;metadata;structuredLogger;hasMetadata;pluginManager;_groups=null;constructor(t){this.err=null,this.metadata={},this.structuredLogger=t,this.hasMetadata=!1,this.pluginManager=t.pluginManager,ye.logBuilderHandlers.length>0&&ye.logBuilderHandlers.forEach(e=>{e.onConstruct&&e.onConstruct(this,t)})}withMetadata(t){const{pluginManager:e,structuredLogger:{_config:{consoleDebug:n}}}=this;if(!t)return n&&console.debug("[LogLayer] withMetadata was called with no metadata; dropping."),this;let r=t;return e.hasPlugins(C.onMetadataCalled)&&(r=e.runOnMetadataCalled(t,this.structuredLogger),!r)?(n&&console.debug("[LogLayer] Metadata was dropped due to plugin returning falsy value."),this):(this.metadata={...this.metadata,...r},this.hasMetadata=!0,this)}withError(t){return this.err=t,this}withGroup(t){const e=Array.isArray(t)?t:[t];if(this._groups){const n=new Set([...this._groups,...e]);this._groups=Array.from(n)}else this._groups=[...e];return this}info(...t){if(!this.structuredLogger.isLevelEnabled(m.info))return;const e=$(t);return this.structuredLogger._formatMessage(e),this.formatLog(m.info,e)}warn(...t){if(!this.structuredLogger.isLevelEnabled(m.warn))return;const e=$(t);return this.structuredLogger._formatMessage(e),this.formatLog(m.warn,e)}error(...t){if(!this.structuredLogger.isLevelEnabled(m.error))return;const e=$(t);return this.structuredLogger._formatMessage(e),this.formatLog(m.error,e)}debug(...t){if(!this.structuredLogger.isLevelEnabled(m.debug))return;const e=$(t);return this.structuredLogger._formatMessage(e),this.formatLog(m.debug,e)}trace(...t){if(!this.structuredLogger.isLevelEnabled(m.trace))return;const e=$(t);return this.structuredLogger._formatMessage(e),this.formatLog(m.trace,e)}fatal(...t){if(!this.structuredLogger.isLevelEnabled(m.fatal))return;const e=$(t);return this.structuredLogger._formatMessage(e),this.formatLog(m.fatal,e)}disableLogging(){return this.structuredLogger.disableLogging(),this}enableLogging(){return this.structuredLogger.enableLogging(),this}formatLog(t,e){const{muteMetadata:n}=this.structuredLogger._config,r=n?!1:this.hasMetadata;return this.structuredLogger._formatLog({logLevel:t,params:e,metadata:r?this.metadata:null,err:this.err,groups:this._groups})}},Oo=class extends Io{shipToLoggerFn;constructor(t){super(t),this.shipToLoggerFn=t.shipToLogger}shipToLogger(t){return this.shipToLoggerFn(t)}};let yt=!1;const ko={trace:"log",debug:"log",info:"log",warn:"warn",error:"error",fatal:"error"},Rt=new Co({transport:new Oo({shipToLogger:({logLevel:t,messages:e,data:n,hasData:r})=>{const s=ko[t]??"log";let o,i;if(r&&n){const{_sub:a,...l}=n;o=a?String(a):void 0,Object.keys(l).length>0&&(i=l)}return yt=!0,i?console[s](...e,i):console[s](...e),yt=!1,typeof window<"u"&&window.postMessage({type:"engine-log",level:t,message:e.join(" "),subsystem:o,metadata:i,timestamp:Date.now()},"*"),e}}),prefix:"[engine]"});Rt.setLevel(m.info);typeof window<"u"&&(window.setEngineLogLevel=t=>{Rt.setLevel(t)});if(typeof window<"u"){const t=new URLSearchParams(window.location.search).get("engineLogLevel");t&&Rt.setLevel(t)}const Do=4,No=1e4;async function Fo(t,e,n,r){const s=t.getRunTicksTarget();if(s===null)throw new K("RUN_TICKS_UNAVAILABLE","runTicksWhenSettled: no run-ticks target is wired — no Game has mounted yet");const o=No,i=Do,a=n?.render??"last";for(let l=0;l<e;l++){if(!t.worldSettled()){const f=Date.now()+o;for(;!t.worldSettled();){if(Date.now()>f)throw new K("WORLD_UNSETTLED_TIMEOUT",`runTicksWhenSettled: a world-settled probe still answers false after ${o}ms — a scene remount (or a broken probe) is stuck, and driving ticks into it would race it`);await new Promise(d=>setTimeout(d,i))}}const p=l===e-1,u=a==="all"?"all":a==="none"?"none":p?"last":"none";s.runTicks(1,{render:u})}}const jo="fit",sr=[{id:jo,label:"Fit panel",kind:"fit",width:null,height:null,dpr:null,safeArea:null},{id:"iphone-portrait",label:"iPhone 14 — 390×844 @3x",kind:"phone",width:390,height:844,dpr:3,safeArea:{top:47,right:0,bottom:34,left:0}},{id:"iphone-landscape",label:"iPhone 14 landscape — 844×390 @3x",kind:"phone",width:844,height:390,dpr:3,safeArea:{top:0,right:47,bottom:21,left:47}},{id:"android-portrait",label:"Android — 412×915 @2.6x",kind:"phone",width:412,height:915,dpr:2.6,safeArea:{top:24,right:0,bottom:24,left:0}},{id:"ipad-portrait",label:"iPad — 820×1180 @2x",kind:"tablet",width:820,height:1180,dpr:2,safeArea:{top:24,right:0,bottom:20,left:0}},{id:"desktop-1080p",label:"Desktop — 1920×1080 @1x",kind:"desktop",width:1920,height:1080,dpr:1,safeArea:null}],Ct=sr[0];function or(t){return sr.find(e=>e.id===t)??Ct}let O=Ct,te=null,ir=0;const wt=new Set;function Ot(){ir++;for(const t of wt)t()}function Ba(t){return wt.add(t),()=>{wt.delete(t)}}const Ga=()=>ir;function za(){return O}function ar(){return te??(O.kind==="phone"||O.kind==="tablet")}function Ua(t){const e=or(t);e!==O&&(O=e,te=null,lr(),Ot())}function Wa(t){t!==te&&(te=t,lr(),Ot())}function $o(){return O.dpr}function Va(){return Math.min(typeof window<"u"&&window.devicePixelRatio||1,2)}function lr(){$r({devicePreview:{preset:O.id,touch:te}})}function qa(){const t=Br().devicePreview;return t?.preset?(O=or(t.preset),te=typeof t.touch=="boolean"?t.touch:null):(O=Ct,te=null),Ot(),O}const ln=["pointerdown","pointermove","pointerup","pointercancel"],cn=new WeakSet;let vt=null,at=null;function un(t){if(!ar()||cn.has(t)||!(t instanceof PointerEvent)||t.pointerType!=="mouse")return;const e=t.target;if(!e)return;t.stopImmediatePropagation();const n=new PointerEvent(t.type,{bubbles:!0,cancelable:t.cancelable,composed:!0,view:t.view,detail:t.detail,clientX:t.clientX,clientY:t.clientY,screenX:t.screenX,screenY:t.screenY,button:t.button,buttons:t.buttons,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,pointerId:t.pointerId,pointerType:"touch",isPrimary:!0,pressure:t.type==="pointerup"||t.type==="pointercancel"?0:Math.max(t.pressure,.5),width:20,height:20});cn.add(n),e.dispatchEvent(n),n.defaultPrevented&&t.preventDefault()}function Bo(t){if(t!==vt&&(at?.(),at=null,vt=t,!!t)){for(const e of ln)t.addEventListener(e,un,{capture:!0});at=()=>{for(const e of ln)t.removeEventListener(e,un,{capture:!0})}}}function Ha(t){vt===t&&Bo(null)}function Go(){return{presetId:O.id,presetLabel:O.label,dpr:O.dpr,safeArea:O.safeArea,touchActive:ar()}}typeof window<"u"&&(window.__volterDevicePreview=Go);const zo=15e3;function Uo(t,e,n){const r=n?` (open ${n})`:"";return`Play start stalled at "${t}" for ${Math.round(e/1e3)}s and the editor tab is HIDDEN — a backgrounded tab has its network requests deprioritized by the browser, so this step is queued rather than broken. Bring the editor tab to the foreground${r} and run play again; the engine loop itself is hidden-safe, only the boot's fetches are starved.`}function Wo(t,e,n){const r=n.stallMs??zo,s=n.setTimer??((i,a)=>setTimeout(i,a)),o=n.clearTimer??(i=>clearTimeout(i));return new Promise((i,a)=>{let l=!1;const p=s(()=>{l||n.isHidden()&&(l=!0,a(new Error(Uo(t,r,n.editorUrl))))},r);e.then(u=>{l||(l=!0,o(p),i(u))},u=>{l||(l=!0,o(p),a(u instanceof Error?u:new Error(String(u))))})})}function Vo(t,e,n=Date.now()){const r=t.filter(s=>s.seq>e).sort((s,o)=>s.seq-o.seq);return{entries:r.map(s=>({t:n,level:"info",source:"game-event",msg:s.event,tick:s.tick,simT:s.simT,meta:{seq:s.seq,...s.detail!==void 0?{detail:s.detail}:{}}})),lastSeq:r.at(-1)?.seq??e}}const Ne="data-volter-replay-block",pe="data-volter-replay-video",dn="https://replay-assets.invalid/",qo=1e3,Ho=256*1024,Ko=/data:image\/(?:png|jpeg|webp|gif|svg\+xml);base64,[a-zA-Z0-9+/=]+/g;function lt(t){const e=t.getBoundingClientRect();return{left:e.left,top:e.top,width:e.width,height:e.height}}function Yo(t){switch(t.toLowerCase()){case"image/png":return"png";case"image/jpeg":return"jpg";case"image/webp":return"webp";case"image/gif":return"gif";case"image/svg+xml":return"svg";default:return null}}function Jo(t){const e=/^data:([^;,]+);base64,([\s\S]+)$/i.exec(t);if(!e)throw new Error("image data URL is not base64 encoded");const n=atob(e[2]),r=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)r[s]=n.charCodeAt(s);return new Blob([r],{type:e[1].toLowerCase()})}function Xo(t){const e=[];for(let n=t;n&&n!==document.body;n=n.parentElement){const r=n.parentElement;if(!r)break;for(const s of Array.from(r.children))s!==n&&!["STYLE","LINK","SCRIPT"].includes(s.tagName)&&!s.hasAttribute(Ne)&&(s.setAttribute(Ne,""),e.push(s))}return()=>{for(const n of e)n.removeAttribute(Ne)}}function Qo(t,e,n){if(n.format!=="canvas-dom"||n.replayPath===null)throw new Error("gameplay DOM recording requires a canvas-dom sink");const r=Xo(t),s=e.getAttribute(pe);e.setAttribute(pe,"");const o=()=>{r(),s===null?e.removeAttribute(pe):e.setAttribute(pe,s)},i=[],a=new Map,l=[];let p=0,u=0,f=0,d=0,c=0,h=null,E=Date.now(),v=null,S=Promise.resolve(),y=!1;const w=(b,z)=>{S=S.then(async()=>{if(!v)try{await z()}catch(re){const H=re instanceof Error?re.message:String(re);v=new Error(`${b}: ${H}`)}})},k=b=>{const z=a.get(b);if(z)return`${dn}${z}`;const re=/^data:([^;,]+)/i.exec(b)?.[1]??"",H=Yo(re);if(!H)return b;const Pe=`${String(c).padStart(6,"0")}.${H}`;return c+=1,a.set(b,Pe),w(`replay asset ${Pe}`,async()=>{const Ht=Jo(b);f+=Ht.size,await Gr(n,Pe,Ht)}),`${dn}${Pe}`},_=b=>b.includes("data:image/")?b.replace(Ko,k):b,T=()=>{if(i.length===0)return;const b=new Blob([`[${i.join(",")}]`],{type:"application/json"});i.length=0,p=0;const z=d;d+=1,w(`DOM event batch ${z}`,()=>zr(n,z,b))};let D;try{D=se({emit(b){h??=b.timestamp;const z=JSON.stringify(b,(re,H)=>typeof H=="string"?_(H):H);i.push(z),p+=z.length,u+=1,p>=Ho&&T()},blockSelector:`[${Ne}], [${pe}]`,recordCanvas:!0,inlineStylesheet:!0,inlineImages:!1,collectFonts:!0,sampling:{mousemove:!1,mouseInteraction:!1,scroll:100,canvas:15},errorHandler(b){return l.push(b instanceof Error?b.message:String(b)),!0}})}catch(b){throw o(),b}if(!D)throw o(),new Error("rrweb could not start the DOM recording");const N=t.ownerDocument.defaultView??window,L={width:N.innerWidth,height:N.innerHeight,dpr:N.devicePixelRatio},I=lt(t),fe=lt(e),st=se.mirror.getId(t),Pr=se.mirror.getId(e),Vt=typeof ResizeObserver>"u"?null:new ResizeObserver(()=>{se.addCustomEvent("volter-canvas-layout",{rect:lt(e),drawingWidth:e.width,drawingHeight:e.height,dpr:N.devicePixelRatio})});Vt?.observe(e),se.addCustomEvent("volter-canvas-layout",{rect:fe,drawingWidth:e.width,drawingHeight:e.height,dpr:N.devicePixelRatio});const Ar=N.setInterval(T,qo),qt=()=>{N.clearInterval(Ar),Vt?.disconnect(),o()};return{markVideoStarted(b){E=b},async stop(b){if(y)throw new Error("gameplay DOM recording is already stopped");if(y=!0,se.addCustomEvent("volter-recording-stop",{}),D(),qt(),T(),await S,v)throw v;return{version:1,recorder:"rrweb@2.1.6",events:"events.json",assets:"assets/",video:b,videoStartEpochMs:E,firstEventEpochMs:h,viewport:L,surface:I,surfaceNodeId:st,canvas:{...fe,nodeId:Pr,drawingWidth:e.width,drawingHeight:e.height},eventCount:u,assetCount:a.size,assetBytes:f,rrwebErrors:l}},async abort(){y||(y=!0,D(),qt(),i.length=0,await S)}}}function Zo(){let t=null,e=!1,n=null;const r=`
3
3
  let canvas;
4
4
  onmessage = async ({data}) => {
5
5
  const {bitmap, width, height, type, quality} = data;
@@ -19,4 +19,4 @@ import{u as An,p as Ir,S as xr}from"./index-OZVqp6xS.js";import{decode as Q,enco
19
19
  postMessage({error: error instanceof Error ? error.message : String(error)});
20
20
  }
21
21
  };
22
- `;function s(o){const i=n;n=null,t?.terminate(),t=null,i?.reject(o)}return{encode(o,i,a,l,p){return e?Promise.reject(new Error("Recording preview encoder stopped")):n?Promise.reject(new Error("Recording preview already in flight")):new Promise((u,f)=>{const d={resolve:u,reject:f};n=d;try{if(!t){const c=URL.createObjectURL(new Blob([r],{type:"text/javascript"}));try{t=new Worker(c)}finally{URL.revokeObjectURL(c)}t.onmessage=({data:h})=>{if(h.error||!h.blob){s(new Error(h.error??"No recording preview image"));return}const E=n;n=null,E?.resolve(h.blob)},t.onerror=h=>{h.preventDefault(),s(new Error(h.message||"Recording preview worker failed"))},t.onmessageerror=()=>s(new Error("Recording preview worker message failed"))}createImageBitmap(o).then(c=>{if(e||n!==d||!t){c.close();return}try{t.postMessage({bitmap:c,width:i,height:a,type:l,quality:p},[c])}catch(h){c.close(),s(h instanceof Error?h:new Error(String(h)))}},c=>{n===d&&s(c instanceof Error?c:new Error(String(c)))})}catch(c){s(c instanceof Error?c:new Error(String(c)))}})},dispose(){e=!0,s(new Error("Recording preview encoder stopped"))}}}let q=null;const fn=1,pn=60,ei=30,Ze=2,ti=1e3/Ze,et=12e4,ni=et/1e3*Ze,ri=256,si="image/webp",oi=.72;function ii(t,e){const n="'use strict';var t=null;onmessage=function(e){clearInterval(t);t=null;if(e.data&&e.data.ms>0){t=setInterval(function(){postMessage(0)},e.data.ms)}};";try{const r=URL.createObjectURL(new Blob([n],{type:"text/javascript"})),s=new Worker(r);URL.revokeObjectURL(r);let o=null;return s.addEventListener("error",i=>{i.preventDefault(),o===null&&(o=window.setInterval(e,t))}),s.addEventListener("message",()=>e()),s.postMessage({ms:t}),{stop(){s.postMessage({ms:0}),s.terminate(),o!==null&&window.clearInterval(o)}}}catch{const r=window.setInterval(e,t);return{stop(){window.clearInterval(r)}}}}function ai(t){const e=t??ei;if(!Number.isFinite(e)||!Number.isInteger(e)||e<fn||e>pn)throw new Error(`gameplay recording fps must be an integer from ${fn} to ${pn}`);return e}function li(t){const n=(t?["video/webm;codecs=vp9,opus","video/webm;codecs=vp8,opus","video/webm"]:["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"]).find(r=>MediaRecorder.isTypeSupported(r));if(!n)throw new Error("this browser exposes MediaRecorder but no WebM video codec");return n}function kt(){Hr(q?.previewSnapshot??null)}function ct(t,e){t.previewSnapshot={startedAt:t.started.startedAt,width:t.started.width,height:t.started.height,liveEdgeMs:e,sampleFps:Ze,retentionMs:et,frames:[...t.previewFrames],previewError:t.previewError},q===t&&kt()}function ci(t){for(const e of t.previewFrames)URL.revokeObjectURL(e.src);t.previewFrames.length=0}function cr(t,e){if(t.stopping||t.previewEncoding||t.previewError||e<t.nextPreviewAt)return;t.nextPreviewAt=e+ti;const n=Math.min(1,ri/Math.max(1,t.output.width)),r=Math.max(1,Math.round(t.output.width*n)),s=Math.max(1,Math.round(t.output.height*n));t.previewEncoding=!0;const o=new Date().toISOString(),i=t.nextPreviewSequence;t.nextPreviewSequence+=1;const a=t.previewEncoder.encode(t.output,r,s,si,oi).then(l=>{if(t.stopping)return;if(!l){t.previewError="The browser could not encode recording previews.",ct(t,e);return}const p={sequence:i,mediaTimeMs:Math.max(0,Math.round(e)),capturedAt:o,src:URL.createObjectURL(l),width:r,height:s};for(t.previewFrames.push(p);t.previewFrames.length>ni||(t.previewFrames[0]?.mediaTimeMs??p.mediaTimeMs)<p.mediaTimeMs-et;){const u=t.previewFrames.shift();u&&URL.revokeObjectURL(u.src)}ct(t,p.mediaTimeMs)}).catch(l=>{t.stopping||(t.previewError=l instanceof Error?l.message:"The browser could not encode recording previews.",ct(t,e))}).finally(()=>{t.previewEncoding=!1});t.previewTask=a}function ui(){if(q)throw new Error("a gameplay recording is already active; stop it before starting one");if(typeof MediaRecorder>"u")throw new Error("this browser does not support MediaRecorder gameplay capture")}function di(t){t.stopping||t.drawing||performance.now()<t.nextFrameAt||(typeof document<"u"&&document.hidden&&(t.hidden=!0),t.drawing=!0,t.frameTask=(async()=>{const e=performance.now();try{if(t.options.refreshFrame?.(),t.started.format==="composite-webm"){const n=t.staging,r=t.overlayCache;if(!n||!r)throw new Error("gameplay recording: composite buffers unavailable");await Cn(t.container,n,{canvasFrame:t.options.canvasFrame,snapshots:t.snapshots,overlayCache:r});const{output:s}=t,o=s.getContext("2d");if(!o)throw new Error("gameplay recording: output context unavailable");s.width!==n.width&&(s.width=n.width),s.height!==n.height&&(s.height=n.height),o.globalCompositeOperation="copy",o.drawImage(n,0,0),o.globalCompositeOperation="source-over",cr(t,performance.now()-t.startedWallMs)}t.frames+=1}catch{t.frameErrors+=1}finally{t.drawing=!1;const n=performance.now()-e;t.nextFrameAt=e+Math.max(t.intervalMs/2,2*n)}})())}async function ur(t,e={}){ui();const n=ai(e.fps),r=e.format??"composite-webm",s=t.ownerDocument.createElement("canvas"),o=e.audio??null;let i=null,a=null,l=null;const p=qr(),u=Vr();try{const f=await Cn(t,s,{canvasFrame:e.canvasFrame,snapshots:p,overlayCache:u});if(f.canvases===0&&f.domOverlays===0)throw new Error("gameplay recording: no game layers are mounted");const d=Array.from(t.querySelectorAll("canvas")).filter(On);if(r==="canvas-dom"&&d.length!==1)throw new Error(`canvas-dom recording requires exactly one root canvas; this game has ${d.length}`);const c=r==="canvas-dom"?d[0]:s;if(typeof c.captureStream!="function")throw new Error("this browser cannot capture a canvas as a media stream");if(i=c.captureStream(n),o)for(const w of o.stream.getAudioTracks())i.addTrack(w);const h=li(i.getAudioTracks().length>0),E=new MediaRecorder(i,{mimeType:h}),v=new Date().toISOString();a=await Ur({startedAt:v,mimeType:h,name:e.name??null,format:r}),r==="canvas-dom"&&(l=Qo(t,c,a),u.dispose());const S={format:r,startedAt:v,mimeType:h,width:c.width,height:c.height,fps:n,audio:i.getAudioTracks().length>0,layers:f,path:a.path,replayPath:a.replayPath,rotates:a.rotates,logFile:a.logFile},y={started:S,recorder:E,output:c,staging:r==="composite-webm"?t.ownerDocument.createElement("canvas"):null,stream:i,audio:o,sink:a,startedWallMs:performance.now(),intervalMs:1e3/n,container:t,options:{canvasFrame:e.canvasFrame,refreshFrame:e.refreshFrame},clock:null,frameTask:null,drawing:!1,nextFrameAt:0,snapshots:p,overlayCache:r==="composite-webm"?u:null,domRecording:l,previewEncoder:Zo(),previewFrames:[],previewSnapshot:{startedAt:v,width:c.width,height:c.height,liveEdgeMs:0,sampleFps:Ze,retentionMs:et,frames:[],previewError:null},previewTask:null,previewEncoding:!1,previewError:null,nextPreviewAt:0,nextPreviewSequence:0,frames:1,frameErrors:0,hidden:typeof document<"u"&&document.hidden,recorderError:null,uploadError:null,uploads:Promise.resolve(),nextSequence:0,stopping:!1};return E.addEventListener("dataavailable",w=>{if(w.data.size===0||y.uploadError)return;const k=y.nextSequence;y.nextSequence+=1,y.uploads=y.uploads.then(async()=>{if(!y.uploadError)try{await Wr(y.sink,k,w.data)}catch(_){y.uploadError=_ instanceof Error?_:new Error(String(_))}})}),E.addEventListener("error",w=>{y.recorderError=w.error??new Error("gameplay recording failed")}),E.addEventListener("start",()=>{y.domRecording?.markVideoStarted(Date.now())}),E.start(1e3),q=y,kt(),r==="composite-webm"&&cr(y,0),y.clock=ii(y.intervalMs,()=>di(y)),S}catch(f){await l?.abort(),u.dispose(),a&&await kn(a);for(const d of i?.getTracks()??[])d.stop();throw o?.dispose(),f}}async function dr(t){const e=q;if(!e)throw new Error("no gameplay recording is active");e.stopping=!0,e.clock?.stop(),e.clock=null,await e.frameTask,e.previewEncoder.dispose(),await e.previewTask;let n=!1;try{if(e.recorder.state!=="inactive"){const l=new Promise(p=>{e.recorder.addEventListener("stop",()=>p(),{once:!0})});e.recorder.stop(),await l}if(e.recorderError)throw e.recorderError;if(await e.uploads,e.uploadError)throw e.uploadError;const r=Math.max(0,Math.round(performance.now()-e.startedWallMs)),s=Math.round(r/1e3*e.started.fps),o={...e.started,durationMs:r,droppedFrames:Math.max(0,s-e.frames),frameErrors:e.frameErrors,effectiveFps:r>0?Math.round(e.frames/(r/1e3)*10)/10:0,hidden:e.hidden},i=e.sink.path.split(/[\\/]/).at(-1)??"video.webm",a=await e.domRecording?.stop(i);return await Kr(e.sink,t??null,void 0,a?{...a,capture:{durationMs:o.durationMs,droppedFrames:o.droppedFrames,frameErrors:o.frameErrors,effectiveFps:o.effectiveFps,hidden:o.hidden,fps:o.fps,width:o.width,height:o.height,mimeType:o.mimeType,audio:o.audio}}:null),n=!0,o}finally{n||(await e.domRecording?.abort(),await kn(e.sink)),q=null,kt(),ci(e),e.overlayCache?.dispose();for(const r of e.stream.getTracks())r.stop();e.audio?.dispose()}}function Dt(){return q!==null}function fi(){return q?.started??null}function fr(t,e){return Math.max(0,Math.floor(e-t))}function pi(){const t=q;return t===null?null:{startedAt:t.started.startedAt,elapsedMs:fr(t.startedWallMs,performance.now())}}const Ka=Object.freeze(Object.defineProperty({__proto__:null,activeGameplayRecording:fi,activeGameplayRecordingTimeline:pi,gameplayRecordingActive:Dt,recordingTimelineElapsedMs:fr,startGameplayRecording:ur,stopGameplayRecording:dr},Symbol.toStringTag,{value:"Module"})),Nt=12e4,gi=5e3,gn=["keydown","keyup","pointerdown","pointermove","wheel","touchstart","touchmove"];let x=null,Fe=null,hn=0,hi=null,pr=null;function mi(t){pr=t}function yi(){return!x||!Dt()?null:{path:x.started.path,format:x.started.format,replayPath:x.started.replayPath,startedAt:x.started.startedAt,rotates:x.started.rotates,logFile:x.started.logFile,idleAutoStopMs:Nt}}function gr(){x&&(x.lastActivityMs=Date.now())}function wi(){if(typeof window>"u")return()=>{};const t=()=>gr();for(const e of gn)window.addEventListener(e,t,{capture:!0,passive:!0});return()=>{for(const e of gn)window.removeEventListener(e,t,{capture:!0})}}async function Ya(t,e={}){if(x&&await Ft("restart"),await Fe,!t)return M.warn("Play started, but gameplay recording did not: no game surface is mounted to record.","play-recording"),null;try{return x={started:await ur(t,{format:Array.from(t.querySelectorAll("canvas")).filter(On).length===1?"canvas-dom":"composite-webm",...e.name?{name:e.name}:{},...e.audio?{audio:e.audio}:{},...e.refreshFrame?{refreshFrame:e.refreshFrame}:{},...e.canvasFrame?{canvasFrame:e.canvasFrame}:{}}),lastActivityMs:Date.now(),poll:null,releaseInput:wi(),ending:!1},x.poll=window.setInterval(()=>{const r=x;!r||r.ending||Date.now()-r.lastActivityMs<Nt||bi()},gi),yi()}catch(n){return M.warn(`Play started, but gameplay recording did not: ${n instanceof Error?n.message:String(n)}`,"play-recording"),null}}async function Ft(t){const e=x;if(!e||e.ending)return Fe;if(e.ending=!0,e.poll!==null&&window.clearInterval(e.poll),e.releaseInput?.(),x=null,!Dt())return null;const n=++hn,r=(async()=>{try{const s=await dr(t);return hi=s,s}catch(s){return M.warn(`Gameplay recording could not be finalized: ${s instanceof Error?s.message:String(s)}`,"play-recording"),null}finally{hn===n&&(Fe=null)}})();return Fe=r,r}function vi(t){const e=Math.round(t.durationMs/100)/10;return`${t.path} — ${e}s at ${t.effectiveFps} fps${t.hidden?" (tab hidden; that is the cadence actually captured, not the requested one)":""}`}async function bi(){const t=Math.round(Nt/1e3),e=await Ft("idle-autostop");M.log(e===null?`Play auto-stopped after ${t}s with no session command and no player input.`:`Play auto-stopped after ${t}s with no session command and no player input. Recording finalized: ${vi(e)}`,"play-recording"),pr?.()}P().session.onCommandDispatched(()=>gr());const Li={source:"live",label:"live",detail:"Running DOM adopted from the playing game. Edits apply to this session only and are discarded when play stops."},mn="structure is owned by the running React tree — play edits are live-DOM only and are discarded on stop; stop play to change structure in source";function ut(t,e){const n=[];for(const r of Ys(t).nodes.values())r.oid===e&&n.push(r.el);return n}function yn(t){return t.style?t.style:null}function Ei(t){return{writeStyle:async(e,n,r)=>{const s=ut(t,e);if(s.length===0)return{changed:!1,error:`no live element carries oid "${e}"`};for(const o of s){const i=yn(o);i&&(i[n]=r)}return{changed:!0,route:"live-dom"}},removeStyle:async(e,n)=>{const r=ut(t,e);if(r.length===0)return{changed:!1,error:`no live element carries oid "${e}"`};let s=!1;for(const o of r){const i=yn(o),a=i?.[n];i&&a!==void 0&&a!==null&&a!==""&&(delete i[n],s=!0)}return{changed:s,route:"live-dom"}},writeText:async(e,n)=>{const r=ut(t,e).filter(o=>o.children.length===0);if(r.length===0)return{changed:!1,error:`no live leaf element carries oid "${e}"`};const s=r[0]?.textContent??null;for(const o of r)o.textContent=n;return{changed:!0,prevText:s}},writeProp:async(e,n)=>({changed:!1,error:`prop "${n}" is owned by the running React element (its value lives at the parent call site, not in the DOM) — play edits are live-DOM only and are discarded on stop; stop play to change it in source`}),writeStruct:async()=>({changed:!1,error:mn}),writeStructMany:async()=>({changed:!1,error:mn})}}function Si(t,e){return new Ks(t,e.shell,{writeBackend:Ei(t),provenance:Li})}function hr(){return{id:"",journalSession:"",name:"",container:null,session:null,presentation:null,unregisterPerformanceSource:null,unsubscribeSystemAdapters:null,determinismDeclared:!1,resizeObserver:null,rootResources:[]}}const g=hr(),G=[];let we=[],Y=null;const bt=new Set;function jt(){return Y&&(Y===g.id||G.some(t=>t.id===Y))?Y:g.id}function Ja(){return g.id}function Xa(t){return bt.add(t),()=>bt.delete(t)}function $t(){for(const t of bt)t()}function Qa(t){Nn(t),jt()!==t&&(Y=t,$t())}function Lt(t){if(!A)return!1;const{store:e}=A;return e.shell.playState==="playing"&&e.shell.activeViewportTab==="play"&&jt()===t&&gs()}let A=null;const je=new Set;function _i(){return A?Promise.resolve():new Promise((t,e)=>{const n=()=>{clearTimeout(r),je.delete(n),t()},r=setTimeout(()=>{je.delete(n),e(new Error("Play mode failed to start: the editor shell did not bind within 15 seconds."))},15e3);je.add(n)})}const Et=new Set,qe=new Set;let He=null;function mr(){return He}function Za(t){return qe.add(t),()=>qe.delete(t)}function Mi(t){He=t;for(const e of qe)e();P().live.notifyChanged()}const dt=new Set;function Ti(){if(dt.size>0){const t=[...dt].map(e=>({severity:"warn",message:e}));dt.clear(),cs("console-resolved",{conditions:t,by:"play-mode"})}if(He!==null){He=null;for(const t of qe)t();P().live.notifyChanged()}}function tt(){vr();for(const t of Et)t()}function el(t){return Et.add(t),()=>Et.delete(t)}let R=0,Bt=null,Ke=null;ks();let $e;function Oe(t){const e={...t.capabilities,persist:!1},n=xs(),r=()=>ms({resolve:()=>ys("play edits are session-local by architecture",ws),record:()=>{}}),s=t.transforms,o=s&&{...s,get:l=>s.get(l),beginEdit:l=>s.beginEdit(l),apply:(l,p)=>s.apply(l,p),endEdit:l=>(s.endEdit(l),r()),...s.remove?{remove:()=>r()}:{}},i=t.inspector,a=i&&{...i,properties:l=>i.properties(l),get:(l,p)=>i.get(l,p),set:(l,p,u)=>(i.set(l,p,u),r()),...i.remove?{remove:()=>r()}:{}};return new Proxy(t,{get(l,p){if(p==="capabilities")return e;if(p==="persistence")return n;if(p==="transforms"&&o)return o;if(p==="inspector"&&a)return a;const u=Reflect.get(l,p,l);return typeof u=="function"?u.bind(l):u}})}function Pi(){$e!==void 0&&(Wn($e),$e=void 0)}async function Ai(t,e,n,r,s){$e=Ls();const o=[],i=[],a=()=>{for(const u of i)"dispose"in u&&typeof u.dispose=="function"&&u.dispose()};for(const u of e){const f=n?us(n,u.id):void 0,d=f?{zOrder:f.zOrder,pausable:f.pausable,...f.entry?{content:`Entry · ${f.entry}`}:{}}:{};if(f?.adapter.identity==="ingest-react"){o.push({worldId:u.id,kind:u.kind,adapter:new Yt(t.shell,{id:u.id,kind:u.kind,adapter:f.adapter.identity,entryOrScenePath:f.entry,zOrder:f.zOrder,pausable:f.pausable}),...d});continue}const c=u.mounted;if(c.kind==="three"){const h=It(c).scene,E=u.id===r&&h===t.scene,v=E?await Us():void 0;if(!s()){a();return}const S=E?Ws(t,h,Gs(u.id),ft(u.id),{explicitSourceCommit:!0,sourceAnchor:v}):Vs(t,h,{frameControl:"host",journal:ft(u.id)});i.push(S),o.push({worldId:u.id,kind:u.kind,adapter:Oe(S),...d})}else if(c.kind==="canvas"){if(c.substrate.name==="babylon"){const{BabylonAuthoringAdapter:I}=await B(async()=>{const{BabylonAuthoringAdapter:st}=await import("./babylon-authoring-adapter-C-EAsfMr.js");return{BabylonAuthoringAdapter:st}},__vite__mapDeps([23,18,2,3,4,10,19,6,20,5,21,24,25,26]));if(!s()){a();return}const fe=new I(c.substrate.root,t,{canvas:c.canvas,api:c.substrate.api,provenance:{source:"live",label:"live",detail:"Native Babylon.js play scene; ordinary Play edits are ephemeral."}});i.push(fe),o.push({worldId:u.id,kind:u.kind,adapter:Oe(fe),...d});continue}if(c.substrate.name!=="pixi"){const I=new Yt(t.shell,{id:u.id,kind:u.kind,adapter:c.substrate.name,entryOrScenePath:f?.entry,zOrder:f?.zOrder??0,pausable:f?.pausable??!0},`No authoring adapter is registered for canvas substrate "${c.substrate.name}".`);i.push(I),o.push({worldId:u.id,kind:u.kind,adapter:I,...d});continue}const h=c.substrate.root,[E,v,S,y,w]=await Promise.all([B(()=>import("./physics-registry-B2Jkp8e6.js"),[]),B(()=>import("./system-adapters-rIC8FSGP.js"),[]),B(()=>import("./pixi-authoring-adapter-B1BBfTju.js").then(I=>I.p),__vite__mapDeps([27,28,18,2,3,4,10,19,6,20,5,21,25,26,29,30,31,24,32])),B(()=>import("./pixi-live-write-target-BcUhtqmJ.js"),__vite__mapDeps([33,18,2,3,4,10,19,6,20,5,21,24,25,26,32])),B(()=>import("./canvas-entry-runtime-CLOuJcgT.js"),__vite__mapDeps([34,18,2,3,4,10,19,6,20,5,21,35]))]);if(!s()){a();return}const{createPhysics2DRegistry:k}=E,{createPhysicsAdapter2D:_}=v,{PixiAuthoringAdapter:T}=S,{createLiveCanvasWriteTarget:D}=y,N=_(u.physics2d??k()),L=new T(h,t,{pixi:await w.resolveCanvasPixiForEditor(),target:D({physics:N}),journal:ft(u.id),surface:Ri});i.push(L),o.push({worldId:u.id,kind:u.kind,adapter:Oe(L),...d})}else if(c.kind==="dom"){const h=Si(c.container,t);i.push(h),o.push({worldId:u.id,kind:u.kind,adapter:Oe(h),...d})}else zs(c,"installPlayRootAuthoring")}if(!s()){a();return}g.rootResources=i;const l=ds(Xe()?.config),p=new fs(o,void 0,l);Wn(p),t.shell.notifyIngestEdit()}function ft(t){return Kn(g.id,t)}function Ii(t){for(const e of g.rootResources)"dispose"in e&&typeof e.dispose=="function"&&e.dispose();g.rootResources=[],g.journalSession&&(t.shell.projectHistory?.expireSession(g.journalSession),g.journalSession="")}function xi(t){return!(t.defaultPrevented||bs(t.target))}let ve=null,be=null,Le=null,Ee=null,Se=null,J=Promise.resolve(),Be=null,Z=[],Ge=0;function yr(){const t=g.session?.game;if(!t)return{};const e=t.roots,n=g.presentation?.worldId??(e.length===1?e[0]?.id:void 0),r=t.loop.timeScale;return{...n!==void 0?{world:n}:{},...typeof r=="number"?{simSpeed:r}:{}}}function St(){const t=g.session?.game?.systemAdapters?.debug;if(t)try{const e=Vo(t.events(Ge),Ge);Ge=e.lastSeq;const n=yr();for(const r of e.entries)Z.push({...r,...n})}catch{}}es(t=>{eo(t),g.session&&Mi("Project assets changed — restart play to load the revised models or textures.")});function Ri(){return P().workspace.liveDocument.container()}function Ci(){const t=()=>{const e=P().workspace.liveDocument.container();if(!e)return;const n=typeof document<"u"?document.activeElement:null;n instanceof HTMLElement&&n!==e&&n.tagName==="BUTTON"&&n.blur(),e.hasAttribute("tabindex")||(e.tabIndex=-1);try{e.focus({preventScroll:!0})}catch{}hs("viewport")};t(),setTimeout(t,150),setTimeout(t,600)}Js(t=>Oi(t));function Oi(t){A={store:t,gameContainer:null},mi(ae);for(const e of je)e()}function ze(){return g.session!==null}function ke(){const t=g.session?.game;if(!t)return null;const e=Qe(t),n=e?.getRunTicksTarget()??null;return{getInputTarget:r=>e?.getVirtualInputTarget(r)??null,loop:t.loop,runTicks:n?n.runTicks.bind(n):null,runTicksSettled:e&&n?(r,s)=>Fo(e,r,s):null,random:Ts(t),determinismDeclared:g.determinismDeclared}}function tl(){const t=g.session?.game.defaultRoot.mounted;return t?.kind==="three"?It(t).scene:null}function nl(){const t=g.session?.game?.roots;return t?t.map(e=>{const n=e.mounted;let r=!1;if(n.kind==="three")r=js(It(n).scene);else if(n.kind==="canvas")try{r=n.substrate.name==="pixi"?Fs(n.substrate.root):n.substrate.name==="babylon"?(n.substrate.root.scenes??[]).some(s=>(s.rootNodes?.length??0)>0):!1}catch{r=!1}else r=$s(n.container);return{rootId:e.id,kind:n.kind,hasRenderableContent:r}}):[]}function ki(){return g.session?Dn(P().workspace.liveDocument.container()).canvas:null}function Di(t){return!t||t===g.id?P().workspace.liveDocument.container():G.find(e=>e.id===t)?.container??null}function rl(t){if(!t||t===g.id)return ki();const e=G.find(n=>n.id===t);return e?.session?Dn(e.container).canvas:null}function wr(){return Bt}function Ni(){return Ke}function ne(){return[g,...G].filter(t=>t.session)}const De=new Set;function vr(){const t=new Set(ne().map(e=>e.session.game.loop));for(const e of De)t.has(e)||De.delete(e);for(const e of t)Rs()?De.delete(e)&&e.start():e.liveness!=="stopped"&&(De.add(e),e.stop())}Cs(vr);function wn(){const t=ne(),e=vs();return t.find(n=>n.id===e)??t[0]??null}let Ye=null;function Fi(){Ye?.(),Ye=ps(()=>({projectName:Xe()?.config.name??null,instanceName:ne().length>1?wn()?.name??null:null})),Vn(()=>{const t=wn();return t?.session?{game:t.session.game,instanceId:t.id,recording:Es}:null})}function ji(){Ye?.(),Ye=null,Vn(null)}function sl(t,e,n){for(const r of ne())r.session?.resize(t,e,n)}let vn=Promise.resolve(),nt=null,Gt=null;function ol(){return nt}function $i(){const t=globalThis.crypto?.randomUUID?.()??`private-${Date.now()}`;return{mode:"private",id:t,roomKey:`private:${t}`,revision:null,participantId:Qr}}function bn(t,e=$i(),n,r){const s=r??null,o=vn.then(()=>(Jr(),Gi(t,e,n??null,s).finally(()=>{Xr()})));return vn=o.then(()=>{},()=>{}),o}async function Bi(t){const{autoLaunchIngest:e}=await B(async()=>{const{autoLaunchIngest:s}=await import("./mount-ingest-root-C3o0o28C.js").then(o=>o.m);return{autoLaunchIngest:s}},__vite__mapDeps([36,18,2,3,4,10,19,6,20,5,21,37,38,39,26,40,41,42,43,7,8,44,45,31,30,46,47]));await e(t);const n=Ns();if(n)return n.play(),!0;const{isModuleModeActive:r}=await B(async()=>{const{isModuleModeActive:s}=await import("./module-mode-D8en13PD.js");return{isModuleModeActive:s}},__vite__mapDeps([48,18,2,3,4,10,19,6,20,5,21,39,38,49,50,51,35,40,52,11,53,8,54,9,7,55,34,56,57,58,59,44,60,61,62]));return r()}function pt(t,e){return X(t),Wo(t,e,{isHidden:()=>typeof document<"u"&&document.hidden,editorUrl:typeof window<"u"?window.location.href:void 0})}async function Gi(t,e,n,r){if(!A){const d=R;if(X("waiting for the editor to bind Play"),await _i(),R!==d)throw new Error("Play start cancelled while waiting for the editor to bind.")}if(!A)throw new Error("Play mode failed to start: the editor shell is not bound.");if(X("waiting for the project bootstrap to settle"),await ts(),g.session&&ae(),Gt=r,await Bi(A.store)||await qs(A.store))return;const s=++R;nt=e,Bt=Date.now(),Ke=null;const{store:o}=A;Yi();const i=J.then(()=>Qs(n));if(J=i,await pt("starting the play log session",i),s!==R||(Z=[],Ge=0,M.setSink(d=>{let c;try{const h=g.session?.game?.systemAdapters.debug?.state("time");typeof h?.tick=="number"&&typeof h.simSeconds=="number"&&(c={tick:h.tick,simT:h.simSeconds})}catch{}Z.push({t:d.timestamp,level:d.level,msg:d.message,...d.source?{source:d.source}:{},...d.subsystem?{sub:d.subsystem}:{},...d.metadata?{meta:d.metadata}:{},...c??{},...yr()})}),Be=setInterval(()=>{if(St(),Z.length>0){const d=Z.splice(0);J=J.then(()=>Zn(d))}},200),ve=d=>{d.key==="Escape"&&xi(d)&&ae()},window.addEventListener("keydown",ve),X("opening the Game document"),await P().workspace.liveDocument.acquire(),s!==R))return;const a=P().workspace.liveDocument.container();if(!a){const d="Play mode failed to start: the game container is not mounted in the workspace.";throw M.error(d,"play-mode"),ae(),new Error(d)}const l=a.clientWidth,p=a.clientHeight;a.style.contain||(a.style.cssText+=Xn),Qn(a),Fn(a),ht(a),P().viewport.transition.begin(),o.shell.setPlayState("playing"),Ci(),M.log("Play mode started","play-mode"),P().viewport.transition.onSettled(()=>{s===R&&o.shell.playState==="playing"&&ns()});let u=null,f=null;try{const d=Xe();if(!d)throw new Error("No project open — open or create a project first");const c=await pt("fetching the project manifest",jn());we=Ae(c).map(L=>L.id);for(const L of we)Kt({rootId:L,mechanism:"host-mount",source:"declared",state:"waiting"});let h;$n();const{entries:E,mountId:v}=await pt("resolving the project's root entries",Yn(c,d.rootPath,{selectionOverride:r??void 0}));if(M.log(`Resolved manifest composition (${Ae(c).length} world${Ae(c).length===1?"":"s"}): `+Ae(c).map(L=>`${L.id} (${L.surface})`).join(", "),"play-mode"),s!==R)return;const S=a.clientWidth||l,y=a.clientHeight||p;ht(a,v),u=v,X("mounting the runtime roots");const{mountManifestRoots:w}=await B(async()=>{const{mountManifestRoots:L}=await import("./mount-manifest-d7WQ9MYp.js");return{mountManifestRoots:L}},__vite__mapDeps([63,52,18,2,3,4,10,19,6,20,5,21,64,65,66,67,68,69,7,8,70,71,72,73,74,75,76,77,35,78,79,80,81,82,83,84,85,50,51,40,38,86,87,9,11,88,39,89,24,49,53,54,55,34,56,57,58,59,44,60,61,62,90,37,26,91,92,93,94,46,30,31,47,95,45,29,96,97,25,98,99,100,101,102,103,104,105,106,107,108,109,110,111,41,42,43,112,113]));if(h=await w({manifest:c,container:a,entries:E,width:S,height:y,seed:t,playtest:e}),f=h,s!==R){h.stop(),Te(h,v,"Cancelled instance");return}for(const L of Bn(d.rootPath))M.error(Gn(L),"play-mode");for(const L of we)Kt({rootId:L,mechanism:"host-mount",source:"declared",state:"ready"});if(er(h.game),g.session=h,g.id=v,g.journalSession=Kn(v,"").session,g.name=br(0),g.unregisterPerformanceSource?.(),g.unregisterPerformanceSource=zn({id:"workspace:game",label:"Game runtime",kind:"game",instanceId:v,profiler:h.game.profiler}),Ti(),g.determinismDeclared=c.determinism?.seededRandom===!0,c.configurations.some(L=>L.kind==="process")&&Qe(h.game)?.setRoomDeclared(!0),tt(),o.shell.setPlayEditRegime("ephemeral"),g.presentation=Xs(h.game.roots)??Bs(o,h.game.roots),X("installing play authoring for each root"),await Ai(o,h.game.roots,c,g.presentation?.worldId??null,()=>s===R),s!==R)return;X("binding the editor to the running game");const k=h.game.systemAdapters;Me(k,v),Nn(v),Fi(),g.unsubscribeSystemAdapters?.(),g.unsubscribeSystemAdapters=h.game.subscribeSystemAdapters?.(()=>{Un(h.game.systemAdapters,v)})??null,Ve(()=>Lt(v),v),Ve(()=>Lt(jt()));const _=Rn(k.physics);o.setEcsSyncTransform((L,I)=>{!_||rs(_,L)==="unresolved"||_.commit(L,{position:I.position.toArray(),rotation:I.quaternion.toArray(),scale:I.scale.toArray()})});const T=$o(),D=a.clientWidth,N=a.clientHeight;D>0&&N>0&&(D!==l||N!==p||T!==null)&&h.resize(D,N,T??void 0),P().viewport.transition.ready(()=>{const L=g.session?.game;if(!L)return null;for(const I of L.roots)if(I.mounted.kind==="three")return I.mounted.camera;return null})}catch(d){const c=`Play mode failed to start: ${d}`;if(M.error(c,"play-mode"),u!==null&&g.id!==u)if(f){try{f.stop()}catch(h){M.error(`Error stopping the failed play session: ${h}`,"play-mode")}Te(f,u,"Failed instance")}else rt(u,"Failed instance");throw s===R&&ae(),new Error(c)}}async function il(t,e){if(!A)throw new Error("Cannot mount an additional instance: play mode is not bound.");if(!g.session)throw new Error("Cannot mount an additional instance: no primary play session is running.");const n=R,r=Xe();if(!r)throw new Error("Cannot mount an additional instance: no project is open.");const s=await jn();$n();const{entries:o,mountId:i}=await Yn(s,r.rootPath,{selectionOverride:Gt??void 0});t.style.contain||(t.style.cssText+=Xn),Qn(t),Fn(t),ht(t,i);const{mountManifestRoots:a}=await B(async()=>{const{mountManifestRoots:d}=await import("./mount-manifest-d7WQ9MYp.js");return{mountManifestRoots:d}},__vite__mapDeps([63,52,18,2,3,4,10,19,6,20,5,21,64,65,66,67,68,69,7,8,70,71,72,73,74,75,76,77,35,78,79,80,81,82,83,84,85,50,51,40,38,86,87,9,11,88,39,89,24,49,53,54,55,34,56,57,58,59,44,60,61,62,90,37,26,91,92,93,94,46,30,31,47,95,45,29,96,97,25,98,99,100,101,102,103,104,105,106,107,108,109,110,111,41,42,43,112,113])),l=await a({manifest:s,container:t,entries:o,width:t.clientWidth,height:t.clientHeight,playtest:nt});for(const d of Bn(r.rootPath))M.error(Gn(d),"play-mode");if(n!==R||!g.session){try{l.stop()}catch{}return Te(l,i,e?.trim()||"Cancelled instance"),i}er(l.game);const p=hr();p.id=i,p.name=e?.trim()||br(G.length+1),p.container=t,p.session=l,p.unregisterPerformanceSource=zn({id:`workspace:game:${i}`,label:`Game runtime (instance ${i})`,kind:"game",instanceId:i,profiler:l.game.profiler});const u=l.game.systemAdapters;Me(u,i),p.unsubscribeSystemAdapters=l.game.subscribeSystemAdapters?.(()=>{Un(l.game.systemAdapters,i)})??null,Ve(()=>Lt(i),i),G.push(p);const f=g.session.game.systemAdapters;return Me(f,g.id),tt(),i}function zi(){return G.map(t=>t.id)}function al(){const t=[];g.id&&t.push({id:g.id,name:g.name});for(const e of G)e.id&&t.push({id:e.id,name:e.name});return t}function Ui(t){return g.id===t?g.name:G.find(e=>e.id===t)?.name}function rt(t,e){t&&(Jn(t),Os(t,e))}function Te(t,e,n){t.stopComplete.then(()=>rt(e,n))}function Wi(t){const e=G.findIndex(s=>s.id===t);if(e<0)return;const[n]=G.splice(e,1);if(!n)return;n.unsubscribeSystemAdapters?.(),n.unsubscribeSystemAdapters=null;const r=n.session;try{r?.stop()}catch(s){M.error(`Error stopping additional instance ${n.id}: ${s}`,"play-mode")}n.unregisterPerformanceSource?.(),Me(null,n.id),r?Te(r,n.id,n.name):rt(n.id,n.name),n.container=null,n.session=null,Y===t&&(Y=null,$t()),tt()}function Vi(){for(const t of zi())Wi(t)}let ce=[];const _t=new Set;function zt(t){if(t===0){const e=Zr()?.getPlayerIdentity?.()?.name?.trim();if(e)return e}return`Instance ${t+1}`}function ll(){return ce.length===0?0:ce.length-1}function br(t){return ce[t]??zt(t)}function cl(t){return _t.add(t),()=>_t.delete(t)}function qi(){for(const t of _t)t()}function Hi(t){const e=Math.max(0,Math.floor(t));Ki(e===0?[]:Array.from({length:e+1},(n,r)=>zt(r)))}function Ki(t){const e=t.length<=1?[]:t.map((n,r)=>n?.trim()?n.trim():zt(r));e.length===ce.length&&e.every((n,r)=>n===ce[r])||(ce=e,qi())}function ae(){if(R++,Yr(),!A||(Ft("teardown"),ji(),Gt=null,Hs(A.store)))return;nt=null,Y=null,$t();const{store:t}=A;St(),Hi(0),Vi(),P().viewport.transition.end(),t.setEcsSyncTransform(null);const e=g.id,n=g.name||"Game instance";g.id="",g.unsubscribeSystemAdapters?.(),g.unsubscribeSystemAdapters=null,Me(null,e),g.presentation?.dispose(),g.presentation=null,Ii(t),Pi(),t.shell.setPlayEditRegime(null);const r=g.session;if(r)try{r.stop()}catch(s){M.error(`Error stopping play session: ${s}`,"play-mode")}finally{g.unregisterPerformanceSource?.(),g.unregisterPerformanceSource=null,g.session=null,g.determinismDeclared=!1,tt()}r?Te(r,e,n):rt(e,n);for(const s of we)ss(s);if(we=[],Ve(()=>!0),Jn(),g.resizeObserver?.disconnect(),g.resizeObserver=null,ve&&(window.removeEventListener("keydown",ve),ve=null),M.log("Play mode stopped","play-mode"),os(),Be&&(clearInterval(Be),Be=null),St(),M.setSink(null),Z.length>0){const s=Z.splice(0);J=J.then(()=>Zn(s))}J=J.then(()=>Zs()),Ji(),t.shell.setPlayState("stopped"),P().workspace.liveDocument.release(),Bt!==null&&Ke===null&&(Ke=Date.now())}function ul(){if(!(!g.session||!A)){for(const t of ne())t.session?.pause();A.store.shell.setPlayState("paused"),M.log("Play mode paused","play-mode")}}function dl(){if(!(!g.session||!A)){for(const t of ne())t.session?.resume();A.store.shell.setPlayState("playing"),M.log("Play mode resumed","play-mode")}}function fl(){if(g.session)for(const t of ne())t.session?.step()}function Yi(){is(),be=console.log,Le=console.info,Ee=console.warn,Se=console.error;const t=(e,n)=>{if(yt)return;const r=Ds();M.logStructured(e,ls(n),"game",void 0,r?{instanceId:r,instanceName:Ui(r)??`Instance ${r}`}:void 0)};console.log=(...e)=>{be?.apply(console,e),t("info",e)},console.info=(...e)=>{Le?.apply(console,e),t("info",e)},console.warn=(...e)=>{Ee?.apply(console,e),t("warn",e)},console.error=(...e)=>{Se?.apply(console,e),t("error",e)}}function Ji(){as(),be&&(console.log=be),Le&&(console.info=Le),Ee&&(console.warn=Ee),Se&&(console.error=Se),be=null,Le=null,Ee=null,Se=null}P().live.register({id:"play",priority:0,mounted:ze,playing:ze,stop:ae,instanceContainer:t=>Di(t),startedAt:wr,endedAt:Ni,restartRequired:mr,restart:()=>void bn(),remount:async t=>{try{return await bn(void 0,void 0,void 0,t),ze()?{ok:!0}:{ok:!1,error:"Play did not start: the remount was superseded before it finished booting."}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}});P().session.reportFacet(()=>({timeScale:ke()?.loop.timeScale??null,loopLiveness:ke()?.loop.liveness??null,restartRequired:mr(),seed:ke()?.random?.seed??null,deterministic:ke()?.determinismDeclared??!1}));const Lr=10,Xi=11,Er=12,Ut=13,Qi=14,Zi=15,Sr=17,Wt=18,Ln=2e3,W=[],Mt=new WeakMap,En=new WeakMap,_e=new WeakMap;let Tt={latencyMs:0,jitterMs:0,packetLoss:0};function Sn(t,e,n){const{latencyMs:r,jitterMs:s}=Tt,o=performance.now(),i=e==="in"?t.dueIn:t.dueOut;if(r<=0&&s<=0&&i<=o){n();return}const a=Math.max(i,o+r+Math.random()*s);e==="in"?t.dueIn=a:t.dueOut=a,setTimeout(n,a-o)}const Ue=new Map,ge=[];let _n=0;const Pt=new Set;let ee={start:0,msgsIn:0,msgsOut:0,bytesIn:0,bytesOut:0},he={msgsIn:0,msgsOut:0,bytesIn:0,bytesOut:0};function V(){for(const t of Pt)t()}function _r(t){const e=t-ee.start;e<1e3||(he=e<2e3?{...ee}:{msgsIn:0,msgsOut:0,bytesIn:0,bytesOut:0},ee={start:t,msgsIn:0,msgsOut:0,bytesIn:0,bytesOut:0})}let de=!1;const ea="networkProfilerAutostart";let Mn;function ta(t){const e=new Map,n=(r,s)=>{if(!r||typeof r!="object"||e.has(r))return;e.set(r,s);const o=r.constructor?.[Symbol.metadata];if(o){for(const i of Object.keys(o)){const a=/^\d+$/.test(i)?o[i]?.name:void 0;a&&n(r[a],[...s,a])}return}r.forEach?.((i,a)=>n(i,[...s,String(a)]))};return n(t,[]),e}function na(t,e,n){if(!de||e.length===0)return;const r=ta(t.serializer?.getState()),s=new Map;for(const o of e){const i=[...r.get(o.ref)??[],String(o.dynamicIndex??o.field)],a=i.slice(0,i.length>1?2:1).join(".");s.set(a,(s.get(a)??0)+1)}for(const[o,i]of s){let a=t.entities.get(o);a||(a={path:o,syncs:0,changes:0,patchBytesMin:n,patchBytesMax:n},t.entities.set(o,a)),a.syncs+=1,a.changes+=i,a.patchBytesMin=Math.min(a.patchBytesMin,n),a.patchBytesMax=Math.max(a.patchBytesMax,n)}}function F(t,e,n,r,s){if(!de)return;const o=Date.now();_r(o),e==="in"?(ee.msgsIn+=1,ee.bytesIn+=r):(ee.msgsOut+=1,ee.bytesOut+=r);let i=t.types.get(n);i||(i={type:n,countIn:0,countOut:0,bytesIn:0,bytesOut:0},t.types.set(n,i)),e==="in"?(i.countIn+=1,i.bytesIn+=r):(i.countOut+=1,i.bytesOut+=r),s!==void 0&&(i.last=s),_n+=1,ge.push({seq:_n,time:performance.now(),direction:e,type:n,size:r}),ge.length>Ln&&ge.splice(0,ge.length-Ln)}function Je(t,e){const n=t;return Q.stringCheck(n,e)?Q.string(n,e):String(Q.number(n,e))}function ra(t,e){const n=e[0],r={offset:1},s=e;try{if(n===Lr)Q.utf8Read(s,r,e[r.offset++]),Q.utf8Read(s,r,e[r.offset++])==="schema"&&!t.serializer&&(t.serializer=new xr,e.byteLength>r.offset&&t.serializer.handshake(e,r)),t.state="connected",t.joinedAt??=Date.now(),F(t,"in","join",e.byteLength);else if(n===Xi){const o=Q.number(s,r),i=Q.string(s,r);t.error=`${o}: ${i}`,t.state="error",F(t,"in","error",e.byteLength)}else if(n===Er)F(t,"in","leave",e.byteLength);else if(n===Qi)t.serializer?.setState(e,r),t.stateBytes=e.byteLength,F(t,"in","state",e.byteLength);else if(n===Zi){const o=t.serializer?.decoder;let i=[];o&&(o.triggerChanges=a=>i=a),t.serializer?.patch(e,r),na(t,i,e.byteLength),de&&(t.patches+=1,t.patchBytes+=e.byteLength),F(t,"in","patch",e.byteLength)}else if(n===Ut){const o=Je(e,r),i=e.byteLength>r.offset?An(e,{start:r.offset}):void 0;F(t,"in",o,e.byteLength,i)}else if(n===Sr)F(t,"in",Je(e,r),e.byteLength);else if(n===Wt){t.pingSentAt!==null&&(t.rttMs=Math.round(performance.now()-t.pingSentAt)),t.pingSentAt=null;const o=_e.get(t);_e.delete(t),o&&t.rttMs!==null&&o(t.rttMs),F(t,"in","ping",e.byteLength)}}catch(o){t.error||(t.error=`the editor could not read a frame (code ${n}): ${String(o)}`)}V()}function sa(t,e){const n=e instanceof Uint8Array?e:e instanceof ArrayBuffer?new Uint8Array(e):ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):null;if(!n||n.byteLength===0)return;const r=n[0],s={offset:1};try{if(r===Ut){const o=Je(n,s),i=n.byteLength>s.offset?An(n,{start:s.offset}):void 0;F(t,"out",o,n.byteLength,i)}else r===Sr?F(t,"out",Je(n,s),n.byteLength):r===Wt?(t.pingSentAt=performance.now(),F(t,"out","ping",n.byteLength)):r===Lr?F(t,"out","join",n.byteLength):r===Er&&F(t,"out","leave",n.byteLength)}catch{}V()}function oa(t){let e;try{e=new URL(t,location.href)}catch{return null}const n=e.searchParams.get("sessionId"),r=e.pathname.split("/").filter(Boolean);if(!n||r.length<2)return null;const s=r[r.length-1];return{processId:r[r.length-2],roomId:s,sessionId:n,endpoint:`${e.protocol}//${e.host}`}}function ia(t,e){const n=oa(e);if(!n)return;const r={...n,state:"connecting",joinedAt:null,closedAt:null,closeCode:null,error:null,serializer:null,pingSentAt:null,rttMs:null,stateBytes:0,patches:0,entities:new Map,patchBytes:0,types:new Map,socket:t,dueIn:0,dueOut:0,receive:null},s=ze()?wr():null,o=!W.some(a=>a.state==="connected"||a.state==="connecting");(s!==Mn||s===null&&o)&&(Mn=s,de=P().projectLocalState.read(ea)??!1),W.push(r),Mt.set(t,r),t.addEventListener("message",a=>{Sn(r,"in",()=>{a.data instanceof ArrayBuffer&&ra(r,new Uint8Array(a.data)),r.receive?.(a)})}),t.addEventListener("close",a=>{r.state="disconnected",r.closedAt=Date.now(),r.closeCode=a.code,V()}),t.addEventListener("error",()=>{r.state="error",r.error??="the socket reported an error",V()});const i=t.send.bind(t);t.send=a=>{sa(r,a),Sn(r,"out",()=>{t.readyState===t.OPEN&&i(a)})},V()}function aa(t,e){const n=typeof t=="string"?t:t instanceof URL?t.href:t.url;/\/matchmake\//.test(n)&&e.clone().json().then(r=>{const s=r.room??r;typeof s.roomId=="string"&&typeof s.name=="string"&&(Ue.set(s.roomId,s.name),V())}).catch(()=>{})}function pl(){const t=window;if(t.__volterNetworkObserver)return;t.__volterNetworkObserver=!0;const e=window.WebSocket;if(typeof e=="function"){const r=class extends e{constructor(s,o){super(s,o),ia(this,String(s))}set onmessage(s){const o=Mt.get(this);if(!o){super.onmessage=s;return}En.set(this,s),o.receive=s?i=>s.call(this,i):null}get onmessage(){return Mt.has(this)?En.get(this)??null:super.onmessage}};window.WebSocket=r}const n=window.fetch;typeof n=="function"&&(window.fetch=async(r,s)=>{const o=await n(r,s);return aa(r,o),o})}function Mr(t){if(typeof t=="string")return t;if(typeof t=="function")return"schema";if(t&&typeof t=="object"){const[e,n]=Object.entries(t)[0]??[];if(e)return`${e}<${Mr(n)}>`}return"unknown"}function la(t,e){let n=t,r=null,s=null;for(const o of e){if(n==null)return null;const i=n.constructor?.[Symbol.metadata];if(i&&typeof i[o]=="number")s=i[i[o]]?.type??null,r=s&&typeof s=="object"?Object.values(s)[0]:null,n=n[o];else{s=r,r=null;const a=n;n=a.get?a.get(String(o)):a.at?a.at(Number(o)):void 0}}return s===null?null:Mr(s)}function Tr(t){return`${t.endpoint.replace(/^ws/,"http")}/monitor/api`}async function Tn(t){const e=await fetch(t).catch(()=>null);return!e||!e.ok?null:await e.json().catch(()=>null)}async function oe(t,e,n,r){const s=j();if(!s)throw new Error("No room is observed.");const o=new URLSearchParams({roomId:r??s.roomId,method:t,args:JSON.stringify(e)}),i=await fetch(`${Tr(s)}/room/call?${o}`);if(i.status===404)throw new Error(`The room server serves no Monitor view, so ${n} has nowhere to go (its \`server\` configuration sets VOLTER_ROOM_MONITOR=1).`);if(!i.ok)throw new Error(`The room server refused ${n} (${i.status}).`)}function j(){for(let t=W.length-1;t>=0;t-=1)if(W[t].state!=="disconnected")return W[t];return W[W.length-1]??null}function ca(t){const e=t?.serializer?.getState();return e?.toJSON?e.toJSON():e}function Pn(){return _r(Date.now()),{msgsInPerSec:he.msgsIn,msgsOutPerSec:he.msgsOut,bytesInPerSec:he.bytesIn,bytesOutPerSec:he.bytesOut}}const ua={peers(){return W.filter(t=>t.state==="connected").map(t=>({id:t.sessionId,label:`${Ue.get(t.roomId)??t.roomId} (this client)`}))},networkId:()=>null,authority:()=>"server",editable:()=>!1,getConnectionState(){return j()?.state??"disconnected"},getRoomInfo(){const t=j();return t?{roomId:t.roomId,sessionId:t.sessionId,roomName:Ue.get(t.roomId)??""}:null},getReplicationStats(){const e=j()?.serializer?.decoder?.root?.refs,n=Pn();return{entities:e?.size??0,msgsInPerSec:n.msgsInPerSec,msgsOutPerSec:n.msgsOutPerSec}},subscribe(t){return Pt.add(t),()=>{Pt.delete(t)}},getStateSnapshot:()=>ca(j()),messageEvents(t=0){return ge.filter(e=>e.seq>t)},getRates:Pn,sendMessage(t,e){const n=j();if(!n||n.state!=="connected")throw new Error("No room is connected to send into.");const r=new Uint8Array(6+t.length*3);r[0]=Ut;const s={offset:1};Rr.string(r,t,s);const o=e===void 0?new Uint8Array(0):new Uint8Array(Ir(e)),i=new Uint8Array(s.offset+o.byteLength);i.set(r.subarray(0,s.offset)),i.set(o,s.offset),n.socket.send(i)},getConditioning:()=>({...Tt}),setConditioning(t){Tt={latencyMs:Math.max(0,t.latencyMs),jitterMs:Math.max(0,t.jitterMs),packetLoss:0},V()},getConditioningLimits:()=>({packetLoss:"A WebSocket is reliable and ordered: a lost packet is resent, so loss is not simulated here."}),ping(){const t=j();return!t||t.state!=="connected"?Promise.reject(new Error("No room is connected to ping.")):new Promise((e,n)=>{_e.set(t,e),setTimeout(()=>{_e.get(t)===e&&(_e.delete(t),n(new Error("The server did not answer the ping within 5 s.")))},5e3),t.socket.send(new Uint8Array([Wt]))})},async inspectServer(t){const e=j();if(!e)return null;const n=Tr(e),r=await Tn(`${n}/`);if(!r)return null;const s=t??e.roomId,o=await Tn(`${n}/room?roomId=${encodeURIComponent(s)}`),i=a=>{const l=Number(a);return Number.isFinite(l)?l:null};return{rooms:(r.rooms??[]).map(a=>({roomId:a.roomId,name:a.name,clients:a.clients,maxClients:i(a.maxClients),locked:a.locked===!0,elapsedMs:a.elapsedTime??0})),connections:r.connections??0,cpuPercent:typeof r.cpu=="number"&&Number.isFinite(r.cpu)?r.cpu:null,memory:r.memory?.usedMemMb!==void 0&&r.memory.totalMemMb!==void 0?{usedMb:r.memory.usedMemMb,totalMb:r.memory.totalMemMb}:null,room:o?{roomId:s,clients:(o.clients??[]).map(a=>({sessionId:a.sessionId,elapsedMs:a.elapsedTime})),stateBytes:o.stateSize??0,...o.state!==void 0?{state:o.state}:{}}:null}},disconnectClient:(t,e)=>oe("_forceClientDisconnect",[t],"the disconnect",e),editServerState:(t,e,n)=>oe("_editStateProperty",[t,e],"the state edit",n),deleteServerState:(t,e)=>oe("_deleteStateProperty",[t],"the state delete",e),sendToClient:(t,e,n,r)=>oe("_sendMessageToClient",[t,e,n],"the send",r),broadcast:(t,e,n)=>oe("broadcast",[t,e],"the broadcast",n),disposeRoom:t=>oe("disconnect",[],"the dispose",t),clearTraffic(){for(const t of W)t.types.clear(),t.entities.clear(),t.patches=0,t.patchBytes=0;V()},stateFieldType(t){return la(j()?.serializer?.getState(),t)},getTrafficByType(){const t=j();return t?[...t.types.values()].map(({type:e,countIn:n,countOut:r,bytesIn:s,bytesOut:o})=>({type:e,countIn:n,countOut:r,bytesIn:s,bytesOut:o})):[]},getTrafficByEntity(){const t=j();return t?[...t.entities.values()].map(({path:e,syncs:n,changes:r,patchBytesMin:s,patchBytesMax:o})=>({path:e,syncs:n,changes:r,patchBytesMin:s,patchBytesMax:o})).sort((e,n)=>n.syncs-e.syncs):[]},isRecording:()=>de,setRecording(t){de=t,V()},getServerConfig(){const t=j();if(!t)return null;const e=Ue.get(t.roomId);return e?{endpoint:t.endpoint,roomName:e}:{endpoint:t.endpoint}}};export{il as $,Di as A,rl as B,yi as C,ur as D,pi as E,$a as F,Lo as G,eo as H,tl as I,sr as J,ar as K,Wa as L,za as M,ea as N,Ua as O,Ba as P,Ga as Q,Xa as R,qa as S,Bo as T,Ha as U,sl as V,Qa as W,Ja as X,br as Y,nl as Z,el as _,ze as a,Wi as a0,Va as a1,jo as a2,Ka as a3,al as b,Ki as c,dr as d,bn as e,fl as f,ke as g,Ft as h,pl as i,ae as j,Ya as k,dl as l,ol as m,gr as n,Zs as o,ul as p,Zn as q,Fo as r,Hi as s,Qs as t,Ri as u,jt as v,cl as w,ll as x,Za as y,mr as z};
22
+ `;function s(o){const i=n;n=null,t?.terminate(),t=null,i?.reject(o)}return{encode(o,i,a,l,p){return e?Promise.reject(new Error("Recording preview encoder stopped")):n?Promise.reject(new Error("Recording preview already in flight")):new Promise((u,f)=>{const d={resolve:u,reject:f};n=d;try{if(!t){const c=URL.createObjectURL(new Blob([r],{type:"text/javascript"}));try{t=new Worker(c)}finally{URL.revokeObjectURL(c)}t.onmessage=({data:h})=>{if(h.error||!h.blob){s(new Error(h.error??"No recording preview image"));return}const E=n;n=null,E?.resolve(h.blob)},t.onerror=h=>{h.preventDefault(),s(new Error(h.message||"Recording preview worker failed"))},t.onmessageerror=()=>s(new Error("Recording preview worker message failed"))}createImageBitmap(o).then(c=>{if(e||n!==d||!t){c.close();return}try{t.postMessage({bitmap:c,width:i,height:a,type:l,quality:p},[c])}catch(h){c.close(),s(h instanceof Error?h:new Error(String(h)))}},c=>{n===d&&s(c instanceof Error?c:new Error(String(c)))})}catch(c){s(c instanceof Error?c:new Error(String(c)))}})},dispose(){e=!0,s(new Error("Recording preview encoder stopped"))}}}let q=null;const fn=1,pn=60,ei=30,Ze=2,ti=1e3/Ze,et=12e4,ni=et/1e3*Ze,ri=256,si="image/webp",oi=.72;function ii(t,e){const n="'use strict';var t=null;onmessage=function(e){clearInterval(t);t=null;if(e.data&&e.data.ms>0){t=setInterval(function(){postMessage(0)},e.data.ms)}};";try{const r=URL.createObjectURL(new Blob([n],{type:"text/javascript"})),s=new Worker(r);URL.revokeObjectURL(r);let o=null;return s.addEventListener("error",i=>{i.preventDefault(),o===null&&(o=window.setInterval(e,t))}),s.addEventListener("message",()=>e()),s.postMessage({ms:t}),{stop(){s.postMessage({ms:0}),s.terminate(),o!==null&&window.clearInterval(o)}}}catch{const r=window.setInterval(e,t);return{stop(){window.clearInterval(r)}}}}function ai(t){const e=t??ei;if(!Number.isFinite(e)||!Number.isInteger(e)||e<fn||e>pn)throw new Error(`gameplay recording fps must be an integer from ${fn} to ${pn}`);return e}function li(t){const n=(t?["video/webm;codecs=vp9,opus","video/webm;codecs=vp8,opus","video/webm"]:["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"]).find(r=>MediaRecorder.isTypeSupported(r));if(!n)throw new Error("this browser exposes MediaRecorder but no WebM video codec");return n}function kt(){Hr(q?.previewSnapshot??null)}function ct(t,e){t.previewSnapshot={startedAt:t.started.startedAt,width:t.started.width,height:t.started.height,liveEdgeMs:e,sampleFps:Ze,retentionMs:et,frames:[...t.previewFrames],previewError:t.previewError},q===t&&kt()}function ci(t){for(const e of t.previewFrames)URL.revokeObjectURL(e.src);t.previewFrames.length=0}function cr(t,e){if(t.stopping||t.previewEncoding||t.previewError||e<t.nextPreviewAt)return;t.nextPreviewAt=e+ti;const n=Math.min(1,ri/Math.max(1,t.output.width)),r=Math.max(1,Math.round(t.output.width*n)),s=Math.max(1,Math.round(t.output.height*n));t.previewEncoding=!0;const o=new Date().toISOString(),i=t.nextPreviewSequence;t.nextPreviewSequence+=1;const a=t.previewEncoder.encode(t.output,r,s,si,oi).then(l=>{if(t.stopping)return;if(!l){t.previewError="The browser could not encode recording previews.",ct(t,e);return}const p={sequence:i,mediaTimeMs:Math.max(0,Math.round(e)),capturedAt:o,src:URL.createObjectURL(l),width:r,height:s};for(t.previewFrames.push(p);t.previewFrames.length>ni||(t.previewFrames[0]?.mediaTimeMs??p.mediaTimeMs)<p.mediaTimeMs-et;){const u=t.previewFrames.shift();u&&URL.revokeObjectURL(u.src)}ct(t,p.mediaTimeMs)}).catch(l=>{t.stopping||(t.previewError=l instanceof Error?l.message:"The browser could not encode recording previews.",ct(t,e))}).finally(()=>{t.previewEncoding=!1});t.previewTask=a}function ui(){if(q)throw new Error("a gameplay recording is already active; stop it before starting one");if(typeof MediaRecorder>"u")throw new Error("this browser does not support MediaRecorder gameplay capture")}function di(t){t.stopping||t.drawing||performance.now()<t.nextFrameAt||(typeof document<"u"&&document.hidden&&(t.hidden=!0),t.drawing=!0,t.frameTask=(async()=>{const e=performance.now();try{if(t.options.refreshFrame?.(),t.started.format==="composite-webm"){const n=t.staging,r=t.overlayCache;if(!n||!r)throw new Error("gameplay recording: composite buffers unavailable");await Cn(t.container,n,{canvasFrame:t.options.canvasFrame,snapshots:t.snapshots,overlayCache:r});const{output:s}=t,o=s.getContext("2d");if(!o)throw new Error("gameplay recording: output context unavailable");s.width!==n.width&&(s.width=n.width),s.height!==n.height&&(s.height=n.height),o.globalCompositeOperation="copy",o.drawImage(n,0,0),o.globalCompositeOperation="source-over",cr(t,performance.now()-t.startedWallMs)}t.frames+=1}catch{t.frameErrors+=1}finally{t.drawing=!1;const n=performance.now()-e;t.nextFrameAt=e+Math.max(t.intervalMs/2,2*n)}})())}async function ur(t,e={}){ui();const n=ai(e.fps),r=e.format??"composite-webm",s=t.ownerDocument.createElement("canvas"),o=e.audio??null;let i=null,a=null,l=null;const p=qr(),u=Vr();try{const f=await Cn(t,s,{canvasFrame:e.canvasFrame,snapshots:p,overlayCache:u});if(f.canvases===0&&f.domOverlays===0)throw new Error("gameplay recording: no game layers are mounted");const d=Array.from(t.querySelectorAll("canvas")).filter(On);if(r==="canvas-dom"&&d.length!==1)throw new Error(`canvas-dom recording requires exactly one root canvas; this game has ${d.length}`);const c=r==="canvas-dom"?d[0]:s;if(typeof c.captureStream!="function")throw new Error("this browser cannot capture a canvas as a media stream");if(i=c.captureStream(n),o)for(const w of o.stream.getAudioTracks())i.addTrack(w);const h=li(i.getAudioTracks().length>0),E=new MediaRecorder(i,{mimeType:h}),v=new Date().toISOString();a=await Ur({startedAt:v,mimeType:h,name:e.name??null,format:r}),r==="canvas-dom"&&(l=Qo(t,c,a),u.dispose());const S={format:r,startedAt:v,mimeType:h,width:c.width,height:c.height,fps:n,audio:i.getAudioTracks().length>0,layers:f,path:a.path,replayPath:a.replayPath,rotates:a.rotates,logFile:a.logFile},y={started:S,recorder:E,output:c,staging:r==="composite-webm"?t.ownerDocument.createElement("canvas"):null,stream:i,audio:o,sink:a,startedWallMs:performance.now(),intervalMs:1e3/n,container:t,options:{canvasFrame:e.canvasFrame,refreshFrame:e.refreshFrame},clock:null,frameTask:null,drawing:!1,nextFrameAt:0,snapshots:p,overlayCache:r==="composite-webm"?u:null,domRecording:l,previewEncoder:Zo(),previewFrames:[],previewSnapshot:{startedAt:v,width:c.width,height:c.height,liveEdgeMs:0,sampleFps:Ze,retentionMs:et,frames:[],previewError:null},previewTask:null,previewEncoding:!1,previewError:null,nextPreviewAt:0,nextPreviewSequence:0,frames:1,frameErrors:0,hidden:typeof document<"u"&&document.hidden,recorderError:null,uploadError:null,uploads:Promise.resolve(),nextSequence:0,stopping:!1};return E.addEventListener("dataavailable",w=>{if(w.data.size===0||y.uploadError)return;const k=y.nextSequence;y.nextSequence+=1,y.uploads=y.uploads.then(async()=>{if(!y.uploadError)try{await Wr(y.sink,k,w.data)}catch(_){y.uploadError=_ instanceof Error?_:new Error(String(_))}})}),E.addEventListener("error",w=>{y.recorderError=w.error??new Error("gameplay recording failed")}),E.addEventListener("start",()=>{y.domRecording?.markVideoStarted(Date.now())}),E.start(1e3),q=y,kt(),r==="composite-webm"&&cr(y,0),y.clock=ii(y.intervalMs,()=>di(y)),S}catch(f){await l?.abort(),u.dispose(),a&&await kn(a);for(const d of i?.getTracks()??[])d.stop();throw o?.dispose(),f}}async function dr(t){const e=q;if(!e)throw new Error("no gameplay recording is active");e.stopping=!0,e.clock?.stop(),e.clock=null,await e.frameTask,e.previewEncoder.dispose(),await e.previewTask;let n=!1;try{if(e.recorder.state!=="inactive"){const l=new Promise(p=>{e.recorder.addEventListener("stop",()=>p(),{once:!0})});e.recorder.stop(),await l}if(e.recorderError)throw e.recorderError;if(await e.uploads,e.uploadError)throw e.uploadError;const r=Math.max(0,Math.round(performance.now()-e.startedWallMs)),s=Math.round(r/1e3*e.started.fps),o={...e.started,durationMs:r,droppedFrames:Math.max(0,s-e.frames),frameErrors:e.frameErrors,effectiveFps:r>0?Math.round(e.frames/(r/1e3)*10)/10:0,hidden:e.hidden},i=e.sink.path.split(/[\\/]/).at(-1)??"video.webm",a=await e.domRecording?.stop(i);return await Kr(e.sink,t??null,void 0,a?{...a,capture:{durationMs:o.durationMs,droppedFrames:o.droppedFrames,frameErrors:o.frameErrors,effectiveFps:o.effectiveFps,hidden:o.hidden,fps:o.fps,width:o.width,height:o.height,mimeType:o.mimeType,audio:o.audio}}:null),n=!0,o}finally{n||(await e.domRecording?.abort(),await kn(e.sink)),q=null,kt(),ci(e),e.overlayCache?.dispose();for(const r of e.stream.getTracks())r.stop();e.audio?.dispose()}}function Dt(){return q!==null}function fi(){return q?.started??null}function fr(t,e){return Math.max(0,Math.floor(e-t))}function pi(){const t=q;return t===null?null:{startedAt:t.started.startedAt,elapsedMs:fr(t.startedWallMs,performance.now())}}const Ka=Object.freeze(Object.defineProperty({__proto__:null,activeGameplayRecording:fi,activeGameplayRecordingTimeline:pi,gameplayRecordingActive:Dt,recordingTimelineElapsedMs:fr,startGameplayRecording:ur,stopGameplayRecording:dr},Symbol.toStringTag,{value:"Module"})),Nt=12e4,gi=5e3,gn=["keydown","keyup","pointerdown","pointermove","wheel","touchstart","touchmove"];let x=null,Fe=null,hn=0,hi=null,pr=null;function mi(t){pr=t}function yi(){return!x||!Dt()?null:{path:x.started.path,format:x.started.format,replayPath:x.started.replayPath,startedAt:x.started.startedAt,rotates:x.started.rotates,logFile:x.started.logFile,idleAutoStopMs:Nt}}function gr(){x&&(x.lastActivityMs=Date.now())}function wi(){if(typeof window>"u")return()=>{};const t=()=>gr();for(const e of gn)window.addEventListener(e,t,{capture:!0,passive:!0});return()=>{for(const e of gn)window.removeEventListener(e,t,{capture:!0})}}async function Ya(t,e={}){if(x&&await Ft("restart"),await Fe,!t)return M.warn("Play started, but gameplay recording did not: no game surface is mounted to record.","play-recording"),null;try{return x={started:await ur(t,{format:Array.from(t.querySelectorAll("canvas")).filter(On).length===1?"canvas-dom":"composite-webm",...e.name?{name:e.name}:{},...e.audio?{audio:e.audio}:{},...e.refreshFrame?{refreshFrame:e.refreshFrame}:{},...e.canvasFrame?{canvasFrame:e.canvasFrame}:{}}),lastActivityMs:Date.now(),poll:null,releaseInput:wi(),ending:!1},x.poll=window.setInterval(()=>{const r=x;!r||r.ending||Date.now()-r.lastActivityMs<Nt||bi()},gi),yi()}catch(n){return M.warn(`Play started, but gameplay recording did not: ${n instanceof Error?n.message:String(n)}`,"play-recording"),null}}async function Ft(t){const e=x;if(!e||e.ending)return Fe;if(e.ending=!0,e.poll!==null&&window.clearInterval(e.poll),e.releaseInput?.(),x=null,!Dt())return null;const n=++hn,r=(async()=>{try{const s=await dr(t);return hi=s,s}catch(s){return M.warn(`Gameplay recording could not be finalized: ${s instanceof Error?s.message:String(s)}`,"play-recording"),null}finally{hn===n&&(Fe=null)}})();return Fe=r,r}function vi(t){const e=Math.round(t.durationMs/100)/10;return`${t.path} — ${e}s at ${t.effectiveFps} fps${t.hidden?" (tab hidden; that is the cadence actually captured, not the requested one)":""}`}async function bi(){const t=Math.round(Nt/1e3),e=await Ft("idle-autostop");M.log(e===null?`Play auto-stopped after ${t}s with no session command and no player input.`:`Play auto-stopped after ${t}s with no session command and no player input. Recording finalized: ${vi(e)}`,"play-recording"),pr?.()}P().session.onCommandDispatched(()=>gr());const Li={source:"live",label:"live",detail:"Running DOM adopted from the playing game. Edits apply to this session only and are discarded when play stops."},mn="structure is owned by the running React tree — play edits are live-DOM only and are discarded on stop; stop play to change structure in source";function ut(t,e){const n=[];for(const r of Ys(t).nodes.values())r.oid===e&&n.push(r.el);return n}function yn(t){return t.style?t.style:null}function Ei(t){return{writeStyle:async(e,n,r)=>{const s=ut(t,e);if(s.length===0)return{changed:!1,error:`no live element carries oid "${e}"`};for(const o of s){const i=yn(o);i&&(i[n]=r)}return{changed:!0,route:"live-dom"}},removeStyle:async(e,n)=>{const r=ut(t,e);if(r.length===0)return{changed:!1,error:`no live element carries oid "${e}"`};let s=!1;for(const o of r){const i=yn(o),a=i?.[n];i&&a!==void 0&&a!==null&&a!==""&&(delete i[n],s=!0)}return{changed:s,route:"live-dom"}},writeText:async(e,n)=>{const r=ut(t,e).filter(o=>o.children.length===0);if(r.length===0)return{changed:!1,error:`no live leaf element carries oid "${e}"`};const s=r[0]?.textContent??null;for(const o of r)o.textContent=n;return{changed:!0,prevText:s}},writeProp:async(e,n)=>({changed:!1,error:`prop "${n}" is owned by the running React element (its value lives at the parent call site, not in the DOM) — play edits are live-DOM only and are discarded on stop; stop play to change it in source`}),writeStruct:async()=>({changed:!1,error:mn}),writeStructMany:async()=>({changed:!1,error:mn})}}function Si(t,e){return new Ks(t,e.shell,{writeBackend:Ei(t),provenance:Li})}function hr(){return{id:"",journalSession:"",name:"",container:null,session:null,presentation:null,unregisterPerformanceSource:null,unsubscribeSystemAdapters:null,determinismDeclared:!1,resizeObserver:null,rootResources:[]}}const g=hr(),G=[];let we=[],Y=null;const bt=new Set;function jt(){return Y&&(Y===g.id||G.some(t=>t.id===Y))?Y:g.id}function Ja(){return g.id}function Xa(t){return bt.add(t),()=>bt.delete(t)}function $t(){for(const t of bt)t()}function Qa(t){Nn(t),jt()!==t&&(Y=t,$t())}function Lt(t){if(!A)return!1;const{store:e}=A;return e.shell.playState==="playing"&&e.shell.activeViewportTab==="play"&&jt()===t&&gs()}let A=null;const je=new Set;function _i(){return A?Promise.resolve():new Promise((t,e)=>{const n=()=>{clearTimeout(r),je.delete(n),t()},r=setTimeout(()=>{je.delete(n),e(new Error("Play mode failed to start: the editor shell did not bind within 15 seconds."))},15e3);je.add(n)})}const Et=new Set,qe=new Set;let He=null;function mr(){return He}function Za(t){return qe.add(t),()=>qe.delete(t)}function Mi(t){He=t;for(const e of qe)e();P().live.notifyChanged()}const dt=new Set;function Ti(){if(dt.size>0){const t=[...dt].map(e=>({severity:"warn",message:e}));dt.clear(),cs("console-resolved",{conditions:t,by:"play-mode"})}if(He!==null){He=null;for(const t of qe)t();P().live.notifyChanged()}}function tt(){vr();for(const t of Et)t()}function el(t){return Et.add(t),()=>Et.delete(t)}let R=0,Bt=null,Ke=null;ks();let $e;function Oe(t){const e={...t.capabilities,persist:!1},n=xs(),r=()=>ms({resolve:()=>ys("play edits are session-local by architecture",ws),record:()=>{}}),s=t.transforms,o=s&&{...s,get:l=>s.get(l),beginEdit:l=>s.beginEdit(l),apply:(l,p)=>s.apply(l,p),endEdit:l=>(s.endEdit(l),r()),...s.remove?{remove:()=>r()}:{}},i=t.inspector,a=i&&{...i,properties:l=>i.properties(l),get:(l,p)=>i.get(l,p),set:(l,p,u)=>(i.set(l,p,u),r()),...i.remove?{remove:()=>r()}:{}};return new Proxy(t,{get(l,p){if(p==="capabilities")return e;if(p==="persistence")return n;if(p==="transforms"&&o)return o;if(p==="inspector"&&a)return a;const u=Reflect.get(l,p,l);return typeof u=="function"?u.bind(l):u}})}function Pi(){$e!==void 0&&(Wn($e),$e=void 0)}async function Ai(t,e,n,r,s){$e=Ls();const o=[],i=[],a=()=>{for(const u of i)"dispose"in u&&typeof u.dispose=="function"&&u.dispose()};for(const u of e){const f=n?us(n,u.id):void 0,d=f?{zOrder:f.zOrder,pausable:f.pausable,...f.entry?{content:`Entry · ${f.entry}`}:{}}:{};if(f?.adapter.identity==="ingest-react"){o.push({worldId:u.id,kind:u.kind,adapter:new Yt(t.shell,{id:u.id,kind:u.kind,adapter:f.adapter.identity,entryOrScenePath:f.entry,zOrder:f.zOrder,pausable:f.pausable}),...d});continue}const c=u.mounted;if(c.kind==="three"){const h=It(c).scene,E=u.id===r&&h===t.scene,v=E?await Us():void 0;if(!s()){a();return}const S=E?Ws(t,h,Gs(u.id),ft(u.id),{explicitSourceCommit:!0,sourceAnchor:v}):Vs(t,h,{frameControl:"host",journal:ft(u.id)});i.push(S),o.push({worldId:u.id,kind:u.kind,adapter:Oe(S),...d})}else if(c.kind==="canvas"){if(c.substrate.name==="babylon"){const{BabylonAuthoringAdapter:I}=await B(async()=>{const{BabylonAuthoringAdapter:st}=await import("./babylon-authoring-adapter-BB5HErRG.js");return{BabylonAuthoringAdapter:st}},__vite__mapDeps([23,18,2,3,4,10,19,6,20,5,21,24,25,26]));if(!s()){a();return}const fe=new I(c.substrate.root,t,{canvas:c.canvas,api:c.substrate.api,provenance:{source:"live",label:"live",detail:"Native Babylon.js play scene; ordinary Play edits are ephemeral."}});i.push(fe),o.push({worldId:u.id,kind:u.kind,adapter:Oe(fe),...d});continue}if(c.substrate.name!=="pixi"){const I=new Yt(t.shell,{id:u.id,kind:u.kind,adapter:c.substrate.name,entryOrScenePath:f?.entry,zOrder:f?.zOrder??0,pausable:f?.pausable??!0},`No authoring adapter is registered for canvas substrate "${c.substrate.name}".`);i.push(I),o.push({worldId:u.id,kind:u.kind,adapter:I,...d});continue}const h=c.substrate.root,[E,v,S,y,w]=await Promise.all([B(()=>import("./physics-registry-B2Jkp8e6.js"),[]),B(()=>import("./system-adapters-rIC8FSGP.js"),[]),B(()=>import("./pixi-authoring-adapter-qbP0YW7g.js").then(I=>I.p),__vite__mapDeps([27,28,18,2,3,4,10,19,6,20,5,21,25,26,29,30,31,24,32])),B(()=>import("./pixi-live-write-target-coTAFFGW.js"),__vite__mapDeps([33,18,2,3,4,10,19,6,20,5,21,24,25,26,32])),B(()=>import("./canvas-entry-runtime-nWfnVKYb.js"),__vite__mapDeps([34,18,2,3,4,10,19,6,20,5,21,35]))]);if(!s()){a();return}const{createPhysics2DRegistry:k}=E,{createPhysicsAdapter2D:_}=v,{PixiAuthoringAdapter:T}=S,{createLiveCanvasWriteTarget:D}=y,N=_(u.physics2d??k()),L=new T(h,t,{pixi:await w.resolveCanvasPixiForEditor(),target:D({physics:N}),journal:ft(u.id),surface:Ri});i.push(L),o.push({worldId:u.id,kind:u.kind,adapter:Oe(L),...d})}else if(c.kind==="dom"){const h=Si(c.container,t);i.push(h),o.push({worldId:u.id,kind:u.kind,adapter:Oe(h),...d})}else zs(c,"installPlayRootAuthoring")}if(!s()){a();return}g.rootResources=i;const l=ds(Xe()?.config),p=new fs(o,void 0,l);Wn(p),t.shell.notifyIngestEdit()}function ft(t){return Kn(g.id,t)}function Ii(t){for(const e of g.rootResources)"dispose"in e&&typeof e.dispose=="function"&&e.dispose();g.rootResources=[],g.journalSession&&(t.shell.projectHistory?.expireSession(g.journalSession),g.journalSession="")}function xi(t){return!(t.defaultPrevented||bs(t.target))}let ve=null,be=null,Le=null,Ee=null,Se=null,J=Promise.resolve(),Be=null,Z=[],Ge=0;function yr(){const t=g.session?.game;if(!t)return{};const e=t.roots,n=g.presentation?.worldId??(e.length===1?e[0]?.id:void 0),r=t.loop.timeScale;return{...n!==void 0?{world:n}:{},...typeof r=="number"?{simSpeed:r}:{}}}function St(){const t=g.session?.game?.systemAdapters?.debug;if(t)try{const e=Vo(t.events(Ge),Ge);Ge=e.lastSeq;const n=yr();for(const r of e.entries)Z.push({...r,...n})}catch{}}es(t=>{eo(t),g.session&&Mi("Project assets changed — restart play to load the revised models or textures.")});function Ri(){return P().workspace.liveDocument.container()}function Ci(){const t=()=>{const e=P().workspace.liveDocument.container();if(!e)return;const n=typeof document<"u"?document.activeElement:null;n instanceof HTMLElement&&n!==e&&n.tagName==="BUTTON"&&n.blur(),e.hasAttribute("tabindex")||(e.tabIndex=-1);try{e.focus({preventScroll:!0})}catch{}hs("viewport")};t(),setTimeout(t,150),setTimeout(t,600)}Js(t=>Oi(t));function Oi(t){A={store:t,gameContainer:null},mi(ae);for(const e of je)e()}function ze(){return g.session!==null}function ke(){const t=g.session?.game;if(!t)return null;const e=Qe(t),n=e?.getRunTicksTarget()??null;return{getInputTarget:r=>e?.getVirtualInputTarget(r)??null,loop:t.loop,runTicks:n?n.runTicks.bind(n):null,runTicksSettled:e&&n?(r,s)=>Fo(e,r,s):null,random:Ts(t),determinismDeclared:g.determinismDeclared}}function tl(){const t=g.session?.game.defaultRoot.mounted;return t?.kind==="three"?It(t).scene:null}function nl(){const t=g.session?.game?.roots;return t?t.map(e=>{const n=e.mounted;let r=!1;if(n.kind==="three")r=js(It(n).scene);else if(n.kind==="canvas")try{r=n.substrate.name==="pixi"?Fs(n.substrate.root):n.substrate.name==="babylon"?(n.substrate.root.scenes??[]).some(s=>(s.rootNodes?.length??0)>0):!1}catch{r=!1}else r=$s(n.container);return{rootId:e.id,kind:n.kind,hasRenderableContent:r}}):[]}function ki(){return g.session?Dn(P().workspace.liveDocument.container()).canvas:null}function Di(t){return!t||t===g.id?P().workspace.liveDocument.container():G.find(e=>e.id===t)?.container??null}function rl(t){if(!t||t===g.id)return ki();const e=G.find(n=>n.id===t);return e?.session?Dn(e.container).canvas:null}function wr(){return Bt}function Ni(){return Ke}function ne(){return[g,...G].filter(t=>t.session)}const De=new Set;function vr(){const t=new Set(ne().map(e=>e.session.game.loop));for(const e of De)t.has(e)||De.delete(e);for(const e of t)Rs()?De.delete(e)&&e.start():e.liveness!=="stopped"&&(De.add(e),e.stop())}Cs(vr);function wn(){const t=ne(),e=vs();return t.find(n=>n.id===e)??t[0]??null}let Ye=null;function Fi(){Ye?.(),Ye=ps(()=>({projectName:Xe()?.config.name??null,instanceName:ne().length>1?wn()?.name??null:null})),Vn(()=>{const t=wn();return t?.session?{game:t.session.game,instanceId:t.id,recording:Es}:null})}function ji(){Ye?.(),Ye=null,Vn(null)}function sl(t,e,n){for(const r of ne())r.session?.resize(t,e,n)}let vn=Promise.resolve(),nt=null,Gt=null;function ol(){return nt}function $i(){const t=globalThis.crypto?.randomUUID?.()??`private-${Date.now()}`;return{mode:"private",id:t,roomKey:`private:${t}`,revision:null,participantId:Qr}}function bn(t,e=$i(),n,r){const s=r??null,o=vn.then(()=>(Jr(),Gi(t,e,n??null,s).finally(()=>{Xr()})));return vn=o.then(()=>{},()=>{}),o}async function Bi(t){const{autoLaunchIngest:e}=await B(async()=>{const{autoLaunchIngest:s}=await import("./mount-ingest-root-DHVNQKHi.js").then(o=>o.m);return{autoLaunchIngest:s}},__vite__mapDeps([36,18,2,3,4,10,19,6,20,5,21,37,38,39,26,40,41,42,43,7,8,44,45,31,30,46,47]));await e(t);const n=Ns();if(n)return n.play(),!0;const{isModuleModeActive:r}=await B(async()=>{const{isModuleModeActive:s}=await import("./module-mode-Bb9fFtEw.js");return{isModuleModeActive:s}},__vite__mapDeps([48,18,2,3,4,10,19,6,20,5,21,39,38,49,50,51,35,40,52,11,53,8,54,9,7,55,34,56,57,58,59,44,60,61,62]));return r()}function pt(t,e){return X(t),Wo(t,e,{isHidden:()=>typeof document<"u"&&document.hidden,editorUrl:typeof window<"u"?window.location.href:void 0})}async function Gi(t,e,n,r){if(!A){const d=R;if(X("waiting for the editor to bind Play"),await _i(),R!==d)throw new Error("Play start cancelled while waiting for the editor to bind.")}if(!A)throw new Error("Play mode failed to start: the editor shell is not bound.");if(X("waiting for the project bootstrap to settle"),await ts(),g.session&&ae(),Gt=r,await Bi(A.store)||await qs(A.store))return;const s=++R;nt=e,Bt=Date.now(),Ke=null;const{store:o}=A;Yi();const i=J.then(()=>Qs(n));if(J=i,await pt("starting the play log session",i),s!==R||(Z=[],Ge=0,M.setSink(d=>{let c;try{const h=g.session?.game?.systemAdapters.debug?.state("time");typeof h?.tick=="number"&&typeof h.simSeconds=="number"&&(c={tick:h.tick,simT:h.simSeconds})}catch{}Z.push({t:d.timestamp,level:d.level,msg:d.message,...d.source?{source:d.source}:{},...d.subsystem?{sub:d.subsystem}:{},...d.metadata?{meta:d.metadata}:{},...c??{},...yr()})}),Be=setInterval(()=>{if(St(),Z.length>0){const d=Z.splice(0);J=J.then(()=>Zn(d))}},200),ve=d=>{d.key==="Escape"&&xi(d)&&ae()},window.addEventListener("keydown",ve),X("opening the Game document"),await P().workspace.liveDocument.acquire(),s!==R))return;const a=P().workspace.liveDocument.container();if(!a){const d="Play mode failed to start: the game container is not mounted in the workspace.";throw M.error(d,"play-mode"),ae(),new Error(d)}const l=a.clientWidth,p=a.clientHeight;a.style.contain||(a.style.cssText+=Xn),Qn(a),Fn(a),ht(a),P().viewport.transition.begin(),o.shell.setPlayState("playing"),Ci(),M.log("Play mode started","play-mode"),P().viewport.transition.onSettled(()=>{s===R&&o.shell.playState==="playing"&&ns()});let u=null,f=null;try{const d=Xe();if(!d)throw new Error("No project open — open or create a project first");const c=await pt("fetching the project manifest",jn());we=Ae(c).map(L=>L.id);for(const L of we)Kt({rootId:L,mechanism:"host-mount",source:"declared",state:"waiting"});let h;$n();const{entries:E,mountId:v}=await pt("resolving the project's root entries",Yn(c,d.rootPath,{selectionOverride:r??void 0}));if(M.log(`Resolved manifest composition (${Ae(c).length} world${Ae(c).length===1?"":"s"}): `+Ae(c).map(L=>`${L.id} (${L.surface})`).join(", "),"play-mode"),s!==R)return;const S=a.clientWidth||l,y=a.clientHeight||p;ht(a,v),u=v,X("mounting the runtime roots");const{mountManifestRoots:w}=await B(async()=>{const{mountManifestRoots:L}=await import("./mount-manifest-cYykTsXQ.js");return{mountManifestRoots:L}},__vite__mapDeps([63,52,18,2,3,4,10,19,6,20,5,21,64,65,66,67,68,69,7,8,70,71,72,73,74,75,76,77,35,78,79,80,81,82,83,84,85,50,51,40,38,86,87,9,11,88,39,89,24,49,53,54,55,34,56,57,58,59,44,60,61,62,90,37,26,91,92,93,94,46,30,31,47,95,45,29,96,97,25,98,99,100,101,102,103,104,105,106,107,108,109,110,111,41,42,43,112,113]));if(h=await w({manifest:c,container:a,entries:E,width:S,height:y,seed:t,playtest:e}),f=h,s!==R){h.stop(),Te(h,v,"Cancelled instance");return}for(const L of Bn(d.rootPath))M.error(Gn(L),"play-mode");for(const L of we)Kt({rootId:L,mechanism:"host-mount",source:"declared",state:"ready"});if(er(h.game),g.session=h,g.id=v,g.journalSession=Kn(v,"").session,g.name=br(0),g.unregisterPerformanceSource?.(),g.unregisterPerformanceSource=zn({id:"workspace:game",label:"Game runtime",kind:"game",instanceId:v,profiler:h.game.profiler}),Ti(),g.determinismDeclared=c.determinism?.seededRandom===!0,c.configurations.some(L=>L.kind==="process")&&Qe(h.game)?.setRoomDeclared(!0),tt(),o.shell.setPlayEditRegime("ephemeral"),g.presentation=Xs(h.game.roots)??Bs(o,h.game.roots),X("installing play authoring for each root"),await Ai(o,h.game.roots,c,g.presentation?.worldId??null,()=>s===R),s!==R)return;X("binding the editor to the running game");const k=h.game.systemAdapters;Me(k,v),Nn(v),Fi(),g.unsubscribeSystemAdapters?.(),g.unsubscribeSystemAdapters=h.game.subscribeSystemAdapters?.(()=>{Un(h.game.systemAdapters,v)})??null,Ve(()=>Lt(v),v),Ve(()=>Lt(jt()));const _=Rn(k.physics);o.setEcsSyncTransform((L,I)=>{!_||rs(_,L)==="unresolved"||_.commit(L,{position:I.position.toArray(),rotation:I.quaternion.toArray(),scale:I.scale.toArray()})});const T=$o(),D=a.clientWidth,N=a.clientHeight;D>0&&N>0&&(D!==l||N!==p||T!==null)&&h.resize(D,N,T??void 0),P().viewport.transition.ready(()=>{const L=g.session?.game;if(!L)return null;for(const I of L.roots)if(I.mounted.kind==="three")return I.mounted.camera;return null})}catch(d){const c=`Play mode failed to start: ${d}`;if(M.error(c,"play-mode"),u!==null&&g.id!==u)if(f){try{f.stop()}catch(h){M.error(`Error stopping the failed play session: ${h}`,"play-mode")}Te(f,u,"Failed instance")}else rt(u,"Failed instance");throw s===R&&ae(),new Error(c)}}async function il(t,e){if(!A)throw new Error("Cannot mount an additional instance: play mode is not bound.");if(!g.session)throw new Error("Cannot mount an additional instance: no primary play session is running.");const n=R,r=Xe();if(!r)throw new Error("Cannot mount an additional instance: no project is open.");const s=await jn();$n();const{entries:o,mountId:i}=await Yn(s,r.rootPath,{selectionOverride:Gt??void 0});t.style.contain||(t.style.cssText+=Xn),Qn(t),Fn(t),ht(t,i);const{mountManifestRoots:a}=await B(async()=>{const{mountManifestRoots:d}=await import("./mount-manifest-cYykTsXQ.js");return{mountManifestRoots:d}},__vite__mapDeps([63,52,18,2,3,4,10,19,6,20,5,21,64,65,66,67,68,69,7,8,70,71,72,73,74,75,76,77,35,78,79,80,81,82,83,84,85,50,51,40,38,86,87,9,11,88,39,89,24,49,53,54,55,34,56,57,58,59,44,60,61,62,90,37,26,91,92,93,94,46,30,31,47,95,45,29,96,97,25,98,99,100,101,102,103,104,105,106,107,108,109,110,111,41,42,43,112,113])),l=await a({manifest:s,container:t,entries:o,width:t.clientWidth,height:t.clientHeight,playtest:nt});for(const d of Bn(r.rootPath))M.error(Gn(d),"play-mode");if(n!==R||!g.session){try{l.stop()}catch{}return Te(l,i,e?.trim()||"Cancelled instance"),i}er(l.game);const p=hr();p.id=i,p.name=e?.trim()||br(G.length+1),p.container=t,p.session=l,p.unregisterPerformanceSource=zn({id:`workspace:game:${i}`,label:`Game runtime (instance ${i})`,kind:"game",instanceId:i,profiler:l.game.profiler});const u=l.game.systemAdapters;Me(u,i),p.unsubscribeSystemAdapters=l.game.subscribeSystemAdapters?.(()=>{Un(l.game.systemAdapters,i)})??null,Ve(()=>Lt(i),i),G.push(p);const f=g.session.game.systemAdapters;return Me(f,g.id),tt(),i}function zi(){return G.map(t=>t.id)}function al(){const t=[];g.id&&t.push({id:g.id,name:g.name});for(const e of G)e.id&&t.push({id:e.id,name:e.name});return t}function Ui(t){return g.id===t?g.name:G.find(e=>e.id===t)?.name}function rt(t,e){t&&(Jn(t),Os(t,e))}function Te(t,e,n){t.stopComplete.then(()=>rt(e,n))}function Wi(t){const e=G.findIndex(s=>s.id===t);if(e<0)return;const[n]=G.splice(e,1);if(!n)return;n.unsubscribeSystemAdapters?.(),n.unsubscribeSystemAdapters=null;const r=n.session;try{r?.stop()}catch(s){M.error(`Error stopping additional instance ${n.id}: ${s}`,"play-mode")}n.unregisterPerformanceSource?.(),Me(null,n.id),r?Te(r,n.id,n.name):rt(n.id,n.name),n.container=null,n.session=null,Y===t&&(Y=null,$t()),tt()}function Vi(){for(const t of zi())Wi(t)}let ce=[];const _t=new Set;function zt(t){if(t===0){const e=Zr()?.getPlayerIdentity?.()?.name?.trim();if(e)return e}return`Instance ${t+1}`}function ll(){return ce.length===0?0:ce.length-1}function br(t){return ce[t]??zt(t)}function cl(t){return _t.add(t),()=>_t.delete(t)}function qi(){for(const t of _t)t()}function Hi(t){const e=Math.max(0,Math.floor(t));Ki(e===0?[]:Array.from({length:e+1},(n,r)=>zt(r)))}function Ki(t){const e=t.length<=1?[]:t.map((n,r)=>n?.trim()?n.trim():zt(r));e.length===ce.length&&e.every((n,r)=>n===ce[r])||(ce=e,qi())}function ae(){if(R++,Yr(),!A||(Ft("teardown"),ji(),Gt=null,Hs(A.store)))return;nt=null,Y=null,$t();const{store:t}=A;St(),Hi(0),Vi(),P().viewport.transition.end(),t.setEcsSyncTransform(null);const e=g.id,n=g.name||"Game instance";g.id="",g.unsubscribeSystemAdapters?.(),g.unsubscribeSystemAdapters=null,Me(null,e),g.presentation?.dispose(),g.presentation=null,Ii(t),Pi(),t.shell.setPlayEditRegime(null);const r=g.session;if(r)try{r.stop()}catch(s){M.error(`Error stopping play session: ${s}`,"play-mode")}finally{g.unregisterPerformanceSource?.(),g.unregisterPerformanceSource=null,g.session=null,g.determinismDeclared=!1,tt()}r?Te(r,e,n):rt(e,n);for(const s of we)ss(s);if(we=[],Ve(()=>!0),Jn(),g.resizeObserver?.disconnect(),g.resizeObserver=null,ve&&(window.removeEventListener("keydown",ve),ve=null),M.log("Play mode stopped","play-mode"),os(),Be&&(clearInterval(Be),Be=null),St(),M.setSink(null),Z.length>0){const s=Z.splice(0);J=J.then(()=>Zn(s))}J=J.then(()=>Zs()),Ji(),t.shell.setPlayState("stopped"),P().workspace.liveDocument.release(),Bt!==null&&Ke===null&&(Ke=Date.now())}function ul(){if(!(!g.session||!A)){for(const t of ne())t.session?.pause();A.store.shell.setPlayState("paused"),M.log("Play mode paused","play-mode")}}function dl(){if(!(!g.session||!A)){for(const t of ne())t.session?.resume();A.store.shell.setPlayState("playing"),M.log("Play mode resumed","play-mode")}}function fl(){if(g.session)for(const t of ne())t.session?.step()}function Yi(){is(),be=console.log,Le=console.info,Ee=console.warn,Se=console.error;const t=(e,n)=>{if(yt)return;const r=Ds();M.logStructured(e,ls(n),"game",void 0,r?{instanceId:r,instanceName:Ui(r)??`Instance ${r}`}:void 0)};console.log=(...e)=>{be?.apply(console,e),t("info",e)},console.info=(...e)=>{Le?.apply(console,e),t("info",e)},console.warn=(...e)=>{Ee?.apply(console,e),t("warn",e)},console.error=(...e)=>{Se?.apply(console,e),t("error",e)}}function Ji(){as(),be&&(console.log=be),Le&&(console.info=Le),Ee&&(console.warn=Ee),Se&&(console.error=Se),be=null,Le=null,Ee=null,Se=null}P().live.register({id:"play",priority:0,mounted:ze,playing:ze,stop:ae,instanceContainer:t=>Di(t),startedAt:wr,endedAt:Ni,restartRequired:mr,restart:()=>void bn(),remount:async t=>{try{return await bn(void 0,void 0,void 0,t),ze()?{ok:!0}:{ok:!1,error:"Play did not start: the remount was superseded before it finished booting."}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}});P().session.reportFacet(()=>({timeScale:ke()?.loop.timeScale??null,loopLiveness:ke()?.loop.liveness??null,restartRequired:mr(),seed:ke()?.random?.seed??null,deterministic:ke()?.determinismDeclared??!1}));const Lr=10,Xi=11,Er=12,Ut=13,Qi=14,Zi=15,Sr=17,Wt=18,Ln=2e3,W=[],Mt=new WeakMap,En=new WeakMap,_e=new WeakMap;let Tt={latencyMs:0,jitterMs:0,packetLoss:0};function Sn(t,e,n){const{latencyMs:r,jitterMs:s}=Tt,o=performance.now(),i=e==="in"?t.dueIn:t.dueOut;if(r<=0&&s<=0&&i<=o){n();return}const a=Math.max(i,o+r+Math.random()*s);e==="in"?t.dueIn=a:t.dueOut=a,setTimeout(n,a-o)}const Ue=new Map,ge=[];let _n=0;const Pt=new Set;let ee={start:0,msgsIn:0,msgsOut:0,bytesIn:0,bytesOut:0},he={msgsIn:0,msgsOut:0,bytesIn:0,bytesOut:0};function V(){for(const t of Pt)t()}function _r(t){const e=t-ee.start;e<1e3||(he=e<2e3?{...ee}:{msgsIn:0,msgsOut:0,bytesIn:0,bytesOut:0},ee={start:t,msgsIn:0,msgsOut:0,bytesIn:0,bytesOut:0})}let de=!1;const ea="networkProfilerAutostart";let Mn;function ta(t){const e=new Map,n=(r,s)=>{if(!r||typeof r!="object"||e.has(r))return;e.set(r,s);const o=r.constructor?.[Symbol.metadata];if(o){for(const i of Object.keys(o)){const a=/^\d+$/.test(i)?o[i]?.name:void 0;a&&n(r[a],[...s,a])}return}r.forEach?.((i,a)=>n(i,[...s,String(a)]))};return n(t,[]),e}function na(t,e,n){if(!de||e.length===0)return;const r=ta(t.serializer?.getState()),s=new Map;for(const o of e){const i=[...r.get(o.ref)??[],String(o.dynamicIndex??o.field)],a=i.slice(0,i.length>1?2:1).join(".");s.set(a,(s.get(a)??0)+1)}for(const[o,i]of s){let a=t.entities.get(o);a||(a={path:o,syncs:0,changes:0,patchBytesMin:n,patchBytesMax:n},t.entities.set(o,a)),a.syncs+=1,a.changes+=i,a.patchBytesMin=Math.min(a.patchBytesMin,n),a.patchBytesMax=Math.max(a.patchBytesMax,n)}}function F(t,e,n,r,s){if(!de)return;const o=Date.now();_r(o),e==="in"?(ee.msgsIn+=1,ee.bytesIn+=r):(ee.msgsOut+=1,ee.bytesOut+=r);let i=t.types.get(n);i||(i={type:n,countIn:0,countOut:0,bytesIn:0,bytesOut:0},t.types.set(n,i)),e==="in"?(i.countIn+=1,i.bytesIn+=r):(i.countOut+=1,i.bytesOut+=r),s!==void 0&&(i.last=s),_n+=1,ge.push({seq:_n,time:performance.now(),direction:e,type:n,size:r}),ge.length>Ln&&ge.splice(0,ge.length-Ln)}function Je(t,e){const n=t;return Q.stringCheck(n,e)?Q.string(n,e):String(Q.number(n,e))}function ra(t,e){const n=e[0],r={offset:1},s=e;try{if(n===Lr)Q.utf8Read(s,r,e[r.offset++]),Q.utf8Read(s,r,e[r.offset++])==="schema"&&!t.serializer&&(t.serializer=new xr,e.byteLength>r.offset&&t.serializer.handshake(e,r)),t.state="connected",t.joinedAt??=Date.now(),F(t,"in","join",e.byteLength);else if(n===Xi){const o=Q.number(s,r),i=Q.string(s,r);t.error=`${o}: ${i}`,t.state="error",F(t,"in","error",e.byteLength)}else if(n===Er)F(t,"in","leave",e.byteLength);else if(n===Qi)t.serializer?.setState(e,r),t.stateBytes=e.byteLength,F(t,"in","state",e.byteLength);else if(n===Zi){const o=t.serializer?.decoder;let i=[];o&&(o.triggerChanges=a=>i=a),t.serializer?.patch(e,r),na(t,i,e.byteLength),de&&(t.patches+=1,t.patchBytes+=e.byteLength),F(t,"in","patch",e.byteLength)}else if(n===Ut){const o=Je(e,r),i=e.byteLength>r.offset?An(e,{start:r.offset}):void 0;F(t,"in",o,e.byteLength,i)}else if(n===Sr)F(t,"in",Je(e,r),e.byteLength);else if(n===Wt){t.pingSentAt!==null&&(t.rttMs=Math.round(performance.now()-t.pingSentAt)),t.pingSentAt=null;const o=_e.get(t);_e.delete(t),o&&t.rttMs!==null&&o(t.rttMs),F(t,"in","ping",e.byteLength)}}catch(o){t.error||(t.error=`the editor could not read a frame (code ${n}): ${String(o)}`)}V()}function sa(t,e){const n=e instanceof Uint8Array?e:e instanceof ArrayBuffer?new Uint8Array(e):ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):null;if(!n||n.byteLength===0)return;const r=n[0],s={offset:1};try{if(r===Ut){const o=Je(n,s),i=n.byteLength>s.offset?An(n,{start:s.offset}):void 0;F(t,"out",o,n.byteLength,i)}else r===Sr?F(t,"out",Je(n,s),n.byteLength):r===Wt?(t.pingSentAt=performance.now(),F(t,"out","ping",n.byteLength)):r===Lr?F(t,"out","join",n.byteLength):r===Er&&F(t,"out","leave",n.byteLength)}catch{}V()}function oa(t){let e;try{e=new URL(t,location.href)}catch{return null}const n=e.searchParams.get("sessionId"),r=e.pathname.split("/").filter(Boolean);if(!n||r.length<2)return null;const s=r[r.length-1];return{processId:r[r.length-2],roomId:s,sessionId:n,endpoint:`${e.protocol}//${e.host}`}}function ia(t,e){const n=oa(e);if(!n)return;const r={...n,state:"connecting",joinedAt:null,closedAt:null,closeCode:null,error:null,serializer:null,pingSentAt:null,rttMs:null,stateBytes:0,patches:0,entities:new Map,patchBytes:0,types:new Map,socket:t,dueIn:0,dueOut:0,receive:null},s=ze()?wr():null,o=!W.some(a=>a.state==="connected"||a.state==="connecting");(s!==Mn||s===null&&o)&&(Mn=s,de=P().projectLocalState.read(ea)??!1),W.push(r),Mt.set(t,r),t.addEventListener("message",a=>{Sn(r,"in",()=>{a.data instanceof ArrayBuffer&&ra(r,new Uint8Array(a.data)),r.receive?.(a)})}),t.addEventListener("close",a=>{r.state="disconnected",r.closedAt=Date.now(),r.closeCode=a.code,V()}),t.addEventListener("error",()=>{r.state="error",r.error??="the socket reported an error",V()});const i=t.send.bind(t);t.send=a=>{sa(r,a),Sn(r,"out",()=>{t.readyState===t.OPEN&&i(a)})},V()}function aa(t,e){const n=typeof t=="string"?t:t instanceof URL?t.href:t.url;/\/matchmake\//.test(n)&&e.clone().json().then(r=>{const s=r.room??r;typeof s.roomId=="string"&&typeof s.name=="string"&&(Ue.set(s.roomId,s.name),V())}).catch(()=>{})}function pl(){const t=window;if(t.__volterNetworkObserver)return;t.__volterNetworkObserver=!0;const e=window.WebSocket;if(typeof e=="function"){const r=class extends e{constructor(s,o){super(s,o),ia(this,String(s))}set onmessage(s){const o=Mt.get(this);if(!o){super.onmessage=s;return}En.set(this,s),o.receive=s?i=>s.call(this,i):null}get onmessage(){return Mt.has(this)?En.get(this)??null:super.onmessage}};window.WebSocket=r}const n=window.fetch;typeof n=="function"&&(window.fetch=async(r,s)=>{const o=await n(r,s);return aa(r,o),o})}function Mr(t){if(typeof t=="string")return t;if(typeof t=="function")return"schema";if(t&&typeof t=="object"){const[e,n]=Object.entries(t)[0]??[];if(e)return`${e}<${Mr(n)}>`}return"unknown"}function la(t,e){let n=t,r=null,s=null;for(const o of e){if(n==null)return null;const i=n.constructor?.[Symbol.metadata];if(i&&typeof i[o]=="number")s=i[i[o]]?.type??null,r=s&&typeof s=="object"?Object.values(s)[0]:null,n=n[o];else{s=r,r=null;const a=n;n=a.get?a.get(String(o)):a.at?a.at(Number(o)):void 0}}return s===null?null:Mr(s)}function Tr(t){return`${t.endpoint.replace(/^ws/,"http")}/monitor/api`}async function Tn(t){const e=await fetch(t).catch(()=>null);return!e||!e.ok?null:await e.json().catch(()=>null)}async function oe(t,e,n,r){const s=j();if(!s)throw new Error("No room is observed.");const o=new URLSearchParams({roomId:r??s.roomId,method:t,args:JSON.stringify(e)}),i=await fetch(`${Tr(s)}/room/call?${o}`);if(i.status===404)throw new Error(`The room server serves no Monitor view, so ${n} has nowhere to go (its \`server\` configuration sets VOLTER_ROOM_MONITOR=1).`);if(!i.ok)throw new Error(`The room server refused ${n} (${i.status}).`)}function j(){for(let t=W.length-1;t>=0;t-=1)if(W[t].state!=="disconnected")return W[t];return W[W.length-1]??null}function ca(t){const e=t?.serializer?.getState();return e?.toJSON?e.toJSON():e}function Pn(){return _r(Date.now()),{msgsInPerSec:he.msgsIn,msgsOutPerSec:he.msgsOut,bytesInPerSec:he.bytesIn,bytesOutPerSec:he.bytesOut}}const ua={peers(){return W.filter(t=>t.state==="connected").map(t=>({id:t.sessionId,label:`${Ue.get(t.roomId)??t.roomId} (this client)`}))},networkId:()=>null,authority:()=>"server",editable:()=>!1,getConnectionState(){return j()?.state??"disconnected"},getRoomInfo(){const t=j();return t?{roomId:t.roomId,sessionId:t.sessionId,roomName:Ue.get(t.roomId)??""}:null},getReplicationStats(){const e=j()?.serializer?.decoder?.root?.refs,n=Pn();return{entities:e?.size??0,msgsInPerSec:n.msgsInPerSec,msgsOutPerSec:n.msgsOutPerSec}},subscribe(t){return Pt.add(t),()=>{Pt.delete(t)}},getStateSnapshot:()=>ca(j()),messageEvents(t=0){return ge.filter(e=>e.seq>t)},getRates:Pn,sendMessage(t,e){const n=j();if(!n||n.state!=="connected")throw new Error("No room is connected to send into.");const r=new Uint8Array(6+t.length*3);r[0]=Ut;const s={offset:1};Rr.string(r,t,s);const o=e===void 0?new Uint8Array(0):new Uint8Array(Ir(e)),i=new Uint8Array(s.offset+o.byteLength);i.set(r.subarray(0,s.offset)),i.set(o,s.offset),n.socket.send(i)},getConditioning:()=>({...Tt}),setConditioning(t){Tt={latencyMs:Math.max(0,t.latencyMs),jitterMs:Math.max(0,t.jitterMs),packetLoss:0},V()},getConditioningLimits:()=>({packetLoss:"A WebSocket is reliable and ordered: a lost packet is resent, so loss is not simulated here."}),ping(){const t=j();return!t||t.state!=="connected"?Promise.reject(new Error("No room is connected to ping.")):new Promise((e,n)=>{_e.set(t,e),setTimeout(()=>{_e.get(t)===e&&(_e.delete(t),n(new Error("The server did not answer the ping within 5 s.")))},5e3),t.socket.send(new Uint8Array([Wt]))})},async inspectServer(t){const e=j();if(!e)return null;const n=Tr(e),r=await Tn(`${n}/`);if(!r)return null;const s=t??e.roomId,o=await Tn(`${n}/room?roomId=${encodeURIComponent(s)}`),i=a=>{const l=Number(a);return Number.isFinite(l)?l:null};return{rooms:(r.rooms??[]).map(a=>({roomId:a.roomId,name:a.name,clients:a.clients,maxClients:i(a.maxClients),locked:a.locked===!0,elapsedMs:a.elapsedTime??0})),connections:r.connections??0,cpuPercent:typeof r.cpu=="number"&&Number.isFinite(r.cpu)?r.cpu:null,memory:r.memory?.usedMemMb!==void 0&&r.memory.totalMemMb!==void 0?{usedMb:r.memory.usedMemMb,totalMb:r.memory.totalMemMb}:null,room:o?{roomId:s,clients:(o.clients??[]).map(a=>({sessionId:a.sessionId,elapsedMs:a.elapsedTime})),stateBytes:o.stateSize??0,...o.state!==void 0?{state:o.state}:{}}:null}},disconnectClient:(t,e)=>oe("_forceClientDisconnect",[t],"the disconnect",e),editServerState:(t,e,n)=>oe("_editStateProperty",[t,e],"the state edit",n),deleteServerState:(t,e)=>oe("_deleteStateProperty",[t],"the state delete",e),sendToClient:(t,e,n,r)=>oe("_sendMessageToClient",[t,e,n],"the send",r),broadcast:(t,e,n)=>oe("broadcast",[t,e],"the broadcast",n),disposeRoom:t=>oe("disconnect",[],"the dispose",t),clearTraffic(){for(const t of W)t.types.clear(),t.entities.clear(),t.patches=0,t.patchBytes=0;V()},stateFieldType(t){return la(j()?.serializer?.getState(),t)},getTrafficByType(){const t=j();return t?[...t.types.values()].map(({type:e,countIn:n,countOut:r,bytesIn:s,bytesOut:o})=>({type:e,countIn:n,countOut:r,bytesIn:s,bytesOut:o})):[]},getTrafficByEntity(){const t=j();return t?[...t.entities.values()].map(({path:e,syncs:n,changes:r,patchBytesMin:s,patchBytesMax:o})=>({path:e,syncs:n,changes:r,patchBytesMin:s,patchBytesMax:o})).sort((e,n)=>n.syncs-e.syncs):[]},isRecording:()=>de,setRecording(t){de=t,V()},getServerConfig(){const t=j();if(!t)return null;const e=Ue.get(t.roomId);return e?{endpoint:t.endpoint,roomName:e}:{endpoint:t.endpoint}}};export{il as $,Di as A,rl as B,yi as C,ur as D,pi as E,$a as F,Lo as G,eo as H,tl as I,sr as J,ar as K,Wa as L,za as M,ea as N,Ua as O,Ba as P,Ga as Q,Xa as R,qa as S,Bo as T,Ha as U,sl as V,Qa as W,Ja as X,br as Y,nl as Z,el as _,ze as a,Wi as a0,Va as a1,jo as a2,Ka as a3,al as b,Ki as c,dr as d,bn as e,fl as f,ke as g,Ft as h,pl as i,ae as j,Ya as k,dl as l,ol as m,gr as n,Zs as o,ul as p,Zn as q,Fo as r,Hi as s,Qs as t,Ri as u,jt as v,cl as w,ll as x,Za as y,mr as z};
@@ -1 +1 @@
1
- import{a2 as A,a1 as x}from"./index-ClgrFOcX.js";import{c as y,B as C,O as I,W as O,C as S,Q as g,d as k,e as F}from"./output-DK8waum9.js";import"./index-nmcBqr7Y.js";import"./_commonjsHelpers-D6-XlEtG.js";import"./index-D_NuPfjr.js";import"./jsx-runtime-DPjLkJKQ.js";import"./index-CtzuWnCS.js";import"./index-CinJrH5C.js";import"./index-FUuS4qwW.js";import"./client-DNXj_opT.js";function V(a){let r=0,e=0,t=0;for(const n of a)for(let s=0;s<n.length;s++){const i=n[s]??0;r+=i*i,e=Math.max(e,Math.abs(i)),t++}return{rms:t>0?Math.sqrt(r/t):0,peak:e}}const u="opus",R=128e3;function z(a){const r=a.fps??30;if(!Number.isInteger(r)||r<1||r>60||60%r!==0)throw new Error("Video export FPS must be a positive divisor of 60.");if(!Number.isSafeInteger(a.frames)||a.frames<1)throw new Error("Video export frames must be a positive safe integer.");if(a.frames/r>300)throw new Error("Video export is limited to five minutes per file.");return r}async function N(a){if(!await y("vp9",{width:a.clientWidth,height:a.clientHeight}))throw new Error("This browser cannot encode VP9 video at the game resolution.")}async function G(a,r,e){const{buffer:t}=await a.render(a.startSeconds,a.startSeconds+r),n=t.length/t.sampleRate;if(Math.abs(n-r)>1/e)throw new Error(`Offline audio render returned ${n.toFixed(4)}s for a ${r.toFixed(4)}s export window (tolerance one frame, ${(1/e).toFixed(4)}s).`);if(!await F(u,{numberOfChannels:t.numberOfChannels,sampleRate:t.sampleRate}))throw new Error(`This browser cannot encode ${u} at ${t.sampleRate} Hz, ${t.numberOfChannels} channel(s).`);const s=[];for(let o=0;o<t.numberOfChannels;o++)s.push(t.getChannelData(o));const i=V(s);return{buffer:t,track:{codec:u,sampleRate:t.sampleRate,channels:t.numberOfChannels,durationSeconds:n,rms:i.rms,peak:i.peak}}}async function Q(a,r,e){const t=z(r),n=performance.now(),s=a.ownerDocument.createElement("canvas");if(s.width=a.clientWidth,s.height=a.clientHeight,s.width<1||s.height<1)throw new Error("Game surface has no exportable size.");const i=s.width,o=s.height,v=r.frames/t,m=e.audio?await G(e.audio,v,t):null;e.signal?.throwIfAborted(),e.assertActive();let c=null;const h=new C,f=new I({target:h,format:new O}),l=new S(s,{codec:"vp9",quality:new g({bitrate:3e6})});f.addVideoTrack(l,{frameRate:t}),m&&(c=new k({codec:u,quality:new g({bitrate:R})}),f.addAudioTrack(c));const E=x();let w=null;const p=()=>{w??=f.cancel()};e.signal?.addEventListener("abort",p,{once:!0});try{e.signal?.throwIfAborted(),await f.start(),c&&m&&(await c.add(m.buffer),c.close(),e.signal?.throwIfAborted());for(let d=0;d<r.frames;d++){if(e.signal?.throwIfAborted(),e.assertActive(),!a.isConnected)throw new Error("Game surface was removed during video export.");if(a.clientWidth!==i||a.clientHeight!==o)throw new Error("Game surface resized during video export.");if(d>0)for(let b=0;b<60/t;b++)e.step();if(await A(a,s,{size:{width:i,height:o},snapshots:E,canvasFrame:e.canvasFrame}),e.signal?.throwIfAborted(),e.assertActive(),a.clientWidth!==i||a.clientHeight!==o)throw new Error("Game surface resized during video export.");await l.add(d/t,1/t,{keyFrame:d%(t*2)===0})}if(e.assertActive(),e.signal?.throwIfAborted(),await f.finalize(),e.signal?.throwIfAborted(),e.assertActive(),!h.buffer)throw new Error("Video encoder produced no output.");return{blob:new Blob([h.buffer],{type:"video/webm"}),frames:r.frames,fps:t,durationMs:r.frames*1e3/t,wallMs:performance.now()-n,width:i,height:o,audio:m?.track??!1}}catch(d){throw w?await w:f.state!=="finalized"&&await f.cancel(),d}finally{e.signal?.removeEventListener("abort",p)}}export{N as assertGameplayVideoSupport,Q as exportGameplayVideo,z as validateGameplayExport};
1
+ import{a2 as A,a1 as x}from"./index-BfqJPhFO.js";import{c as y,B as C,O as I,W as O,C as S,Q as g,d as k,e as F}from"./output-DK8waum9.js";import"./index-nmcBqr7Y.js";import"./_commonjsHelpers-D6-XlEtG.js";import"./index-D_NuPfjr.js";import"./jsx-runtime-DPjLkJKQ.js";import"./index-CtzuWnCS.js";import"./index-CinJrH5C.js";import"./index-FUuS4qwW.js";import"./client-DNXj_opT.js";function V(a){let r=0,e=0,t=0;for(const n of a)for(let s=0;s<n.length;s++){const i=n[s]??0;r+=i*i,e=Math.max(e,Math.abs(i)),t++}return{rms:t>0?Math.sqrt(r/t):0,peak:e}}const u="opus",R=128e3;function z(a){const r=a.fps??30;if(!Number.isInteger(r)||r<1||r>60||60%r!==0)throw new Error("Video export FPS must be a positive divisor of 60.");if(!Number.isSafeInteger(a.frames)||a.frames<1)throw new Error("Video export frames must be a positive safe integer.");if(a.frames/r>300)throw new Error("Video export is limited to five minutes per file.");return r}async function N(a){if(!await y("vp9",{width:a.clientWidth,height:a.clientHeight}))throw new Error("This browser cannot encode VP9 video at the game resolution.")}async function G(a,r,e){const{buffer:t}=await a.render(a.startSeconds,a.startSeconds+r),n=t.length/t.sampleRate;if(Math.abs(n-r)>1/e)throw new Error(`Offline audio render returned ${n.toFixed(4)}s for a ${r.toFixed(4)}s export window (tolerance one frame, ${(1/e).toFixed(4)}s).`);if(!await F(u,{numberOfChannels:t.numberOfChannels,sampleRate:t.sampleRate}))throw new Error(`This browser cannot encode ${u} at ${t.sampleRate} Hz, ${t.numberOfChannels} channel(s).`);const s=[];for(let o=0;o<t.numberOfChannels;o++)s.push(t.getChannelData(o));const i=V(s);return{buffer:t,track:{codec:u,sampleRate:t.sampleRate,channels:t.numberOfChannels,durationSeconds:n,rms:i.rms,peak:i.peak}}}async function Q(a,r,e){const t=z(r),n=performance.now(),s=a.ownerDocument.createElement("canvas");if(s.width=a.clientWidth,s.height=a.clientHeight,s.width<1||s.height<1)throw new Error("Game surface has no exportable size.");const i=s.width,o=s.height,v=r.frames/t,m=e.audio?await G(e.audio,v,t):null;e.signal?.throwIfAborted(),e.assertActive();let c=null;const h=new C,f=new I({target:h,format:new O}),l=new S(s,{codec:"vp9",quality:new g({bitrate:3e6})});f.addVideoTrack(l,{frameRate:t}),m&&(c=new k({codec:u,quality:new g({bitrate:R})}),f.addAudioTrack(c));const E=x();let w=null;const p=()=>{w??=f.cancel()};e.signal?.addEventListener("abort",p,{once:!0});try{e.signal?.throwIfAborted(),await f.start(),c&&m&&(await c.add(m.buffer),c.close(),e.signal?.throwIfAborted());for(let d=0;d<r.frames;d++){if(e.signal?.throwIfAborted(),e.assertActive(),!a.isConnected)throw new Error("Game surface was removed during video export.");if(a.clientWidth!==i||a.clientHeight!==o)throw new Error("Game surface resized during video export.");if(d>0)for(let b=0;b<60/t;b++)e.step();if(await A(a,s,{size:{width:i,height:o},snapshots:E,canvasFrame:e.canvasFrame}),e.signal?.throwIfAborted(),e.assertActive(),a.clientWidth!==i||a.clientHeight!==o)throw new Error("Game surface resized during video export.");await l.add(d/t,1/t,{keyFrame:d%(t*2)===0})}if(e.assertActive(),e.signal?.throwIfAborted(),await f.finalize(),e.signal?.throwIfAborted(),e.assertActive(),!h.buffer)throw new Error("Video encoder produced no output.");return{blob:new Blob([h.buffer],{type:"video/webm"}),frames:r.frames,fps:t,durationMs:r.frames*1e3/t,wallMs:performance.now()-n,width:i,height:o,audio:m?.track??!1}}catch(d){throw w?await w:f.state!=="finalized"&&await f.cancel(),d}finally{e.signal?.removeEventListener("abort",p)}}export{N as assertGameplayVideoSupport,Q as exportGameplayVideo,z as validateGameplayExport};
@@ -1 +1 @@
1
- import{R as N,E as P}from"./rrweb-Cd2ifIRP.js";import{$ as C,a0 as L,a1 as F,a2 as O}from"./index-ClgrFOcX.js";import{B as U,O as $,W as B,C as D,Q as A,I,a as W,U as H,A as V,b as q}from"./output-DK8waum9.js";function x(e,r){const o=new URLSearchParams({replay:e,file:r});return`${C}/recording/replay-file?${o}`}async function T(e,r){const o=await fetch(x(e,r));if(!o.ok)throw new Error(`could not load replay ${r}: HTTP ${o.status}`);return o.text()}function z(e){return new Promise((r,o)=>{const s=new FileReader;s.onload=()=>r(String(s.result)),s.onerror=()=>o(s.error??new Error("could not read replay asset")),s.readAsDataURL(e)})}async function j(e){let r=await T(e,"events.json");const o=new Set(r.match(/https:\/\/replay-assets\.invalid\/\d{6}\.(?:png|jpg|webp|gif|svg)/g)??[]),s=await Promise.all([...o].map(async a=>{const i=a.split("/").at(-1),n=await fetch(x(e,`assets/${i}`));if(!n.ok)throw new Error(`could not load replay asset ${i}`);return[a,await z(await n.blob())]}));for(const[a,i]of s)r=r.replaceAll(a,i);const t=JSON.parse(r);if(!Array.isArray(t)||t.length===0)throw new Error("replay contains no DOM events");return t}function G(e,r,o){return Math.max(0,e.videoStartEpochMs+o-r[0].timestamp)}function _(e,r,o){const s=e.videoStartEpochMs+o;let t={rect:e.canvas,drawingWidth:e.canvas.drawingWidth,drawingHeight:e.canvas.drawingHeight};for(const a of r){if(a.timestamp>s)break;a.type===P.Custom&&a.data.tag==="volter-canvas-layout"&&a.data.payload&&typeof a.data.payload=="object"&&"rect"in a.data.payload&&"drawingWidth"in a.data.payload&&"drawingHeight"in a.data.payload&&(t=a.data.payload)}return t}async function J(e,r){await new Promise((o,s)=>{const t=()=>{clearTimeout(n),e.removeEventListener("loadeddata",a),e.removeEventListener("error",i)},a=()=>{t(),o()},i=()=>{t(),s(new Error("replay video failed to load"))},n=setTimeout(()=>{t(),s(new Error("replay video load timed out"))},15e3);e.readyState>=HTMLMediaElement.HAVE_CURRENT_DATA?a():(e.addEventListener("loadeddata",a,{once:!0}),e.addEventListener("error",i,{once:!0}))}),!(Math.abs(e.currentTime-r)<.001)&&await new Promise((o,s)=>{const t=()=>{clearTimeout(n),e.removeEventListener("seeked",a),e.removeEventListener("error",i)},a=()=>{t(),o()},i=()=>{t(),s(new Error("replay video seek failed"))},n=setTimeout(()=>{t(),s(new Error("replay video seek timed out"))},15e3);e.addEventListener("seeked",a,{once:!0}),e.addEventListener("error",i,{once:!0}),e.currentTime=r})}async function Q(e){e.fonts.size>0&&e.fonts.status!=="loaded"&&await Promise.race([e.fonts.ready.then(()=>{}),new Promise(r=>setTimeout(r,3e3))]),await Promise.all(Array.from(e.images,r=>r.decode().catch(()=>{})))}async function S(e,r){const[o,s]=await Promise.all([T(e,"manifest.json"),j(e)]),t=JSON.parse(o);if(t.status!=="complete"||t.format!=="canvas-dom"||t.version!==1||!t.capture||typeof t.capture.durationMs!="number")throw new Error("replay manifest is incomplete or unsupported");const a=document.createElement("div");a.setAttribute("data-volter-replay-block",""),Object.assign(a.style,{position:"fixed",left:"-100000px",top:"0",width:`${t.viewport.width}px`,height:`${t.viewport.height}px`,overflow:"hidden",pointerEvents:"none"});const i=document.createElement("div");a.append(i),document.body.append(a);const n=document.createElement("video");n.muted=!0,n.preload="auto",n.playsInline=!0,n.src=x(e,"video"),a.append(n);let w;try{w=new N(s,{root:i,showWarning:!1,showDebug:!1,mouseTail:!1,UNSAFE_replayCanvas:!0,insertStyleRules:["[data-volter-replay-video] { visibility: hidden !important; }"]});const f=w;return await r({manifest:t,async render(u){const h=Math.max(0,Math.min(u,t.capture.durationMs));await J(n,h/1e3),f.pause(G(t,s,h)),await Q(f.iframe.contentDocument);const y=f.getMirror().getNode(t.canvas.nodeId),p=f.getMirror().getNode(t.surfaceNodeId);if(!y||y.tagName!=="CANVAS")throw new Error("replay canvas placeholder is unavailable");if(!p||typeof p.getBoundingClientRect!="function")throw new Error("replay game surface is unavailable");const c=y,g=p;c.setAttribute("data-volter-root-surface","true");const E=_(t,s,h);c.width=E.drawingWidth,c.height=E.drawingHeight;const d=c.getContext("2d");if(!d)throw new Error("replay canvas has no 2D context");return d.drawImage(n,0,0,c.width,c.height),c.style.setProperty("visibility","visible","important"),g}})}finally{n.pause(),w?.destroy(),n.removeAttribute("src"),n.load(),a.remove()}}async function Z(e,r){return S(e,async({manifest:o,render:s})=>{const t=Math.max(0,Math.min(r,o.capture.durationMs)),a=await s(t),i=await L(a),n=a.getBoundingClientRect();return{...i,replayPath:e,positionMs:t,width:Math.max(1,Math.round(n.width)),height:Math.max(1,Math.round(n.height))}})}async function ee(e){const r=e.fps??30;if(!Number.isInteger(r)||r<1||r>60)throw new Error("replay export fps must be an integer from 1 to 60");return S(e.replayPath,async({manifest:o,render:s})=>{const t=e.startMs??0,a=e.endMs??o.capture.durationMs;if(!Number.isFinite(t)||!Number.isFinite(a)||t<0||a<=t||a>o.capture.durationMs||a-t>3e5)throw new Error("replay export requires a valid recorded interval of at most five minutes");const i=t/1e3,n=a/1e3,w=Math.ceil((n-i)*r),f=await s(t),u=document.createElement("canvas"),h=f.getBoundingClientRect();u.width=Math.max(1,Math.round(h.width)),u.height=Math.max(1,Math.round(h.height));const y={width:u.width,height:u.height},p=new U,c=new $({target:p,format:new B}),g=new D(u,{codec:"vp9",quality:new A({bitrate:3e6})});c.addVideoTrack(g,{frameRate:r});const E=new I({source:new H(x(e.replayPath,"video")),formats:[W]});try{const d=await E.getPrimaryAudioTrack();if(o.capture.audio&&!d)throw new Error("recorded audio track is missing");const M=d?new V({codec:"opus",quality:new A({bitrate:128e3})}):null;M&&c.addAudioTrack(M),await c.start();const R=async()=>{if(!(!M||!d)){for await(const l of new q(d).samples(i,n))try{const m=Math.max(0,Math.ceil((i-l.timestamp)*l.sampleRate)),v=Math.min(l.numberOfFrames,Math.ceil((n-l.timestamp)*l.sampleRate));if(v<=m)continue;const b=l.trim(m,v);try{b.setTimestamp(Math.max(0,b.timestamp-i)),await M.add(b)}finally{b.close()}}finally{l.close()}M.close()}},k=async()=>{const l=F();for(let m=0;m<w;m++){const v=m/r;await O(await s(t+v*1e3),u,{size:y,snapshots:l}),await g.add(v,Math.min(1/r,n-i-v),{keyFrame:m%(r*2)===0})}g.close()};if(await Promise.all([R(),k()]),await c.finalize(),!p.buffer)throw new Error("replay encoder produced no output");return{blob:new Blob([p.buffer],{type:"video/webm"}),frames:w,fps:r,durationMs:a-t,...y,audio:d!==null}}catch(d){throw c.state!=="finalized"&&await c.cancel(),d}finally{E.dispose()}})}export{Z as c,ee as e};
1
+ import{R as N,E as P}from"./rrweb-Cd2ifIRP.js";import{$ as C,a0 as L,a1 as F,a2 as O}from"./index-BfqJPhFO.js";import{B as U,O as $,W as B,C as D,Q as A,I,a as W,U as H,A as V,b as q}from"./output-DK8waum9.js";function x(e,r){const o=new URLSearchParams({replay:e,file:r});return`${C}/recording/replay-file?${o}`}async function T(e,r){const o=await fetch(x(e,r));if(!o.ok)throw new Error(`could not load replay ${r}: HTTP ${o.status}`);return o.text()}function z(e){return new Promise((r,o)=>{const s=new FileReader;s.onload=()=>r(String(s.result)),s.onerror=()=>o(s.error??new Error("could not read replay asset")),s.readAsDataURL(e)})}async function j(e){let r=await T(e,"events.json");const o=new Set(r.match(/https:\/\/replay-assets\.invalid\/\d{6}\.(?:png|jpg|webp|gif|svg)/g)??[]),s=await Promise.all([...o].map(async a=>{const i=a.split("/").at(-1),n=await fetch(x(e,`assets/${i}`));if(!n.ok)throw new Error(`could not load replay asset ${i}`);return[a,await z(await n.blob())]}));for(const[a,i]of s)r=r.replaceAll(a,i);const t=JSON.parse(r);if(!Array.isArray(t)||t.length===0)throw new Error("replay contains no DOM events");return t}function G(e,r,o){return Math.max(0,e.videoStartEpochMs+o-r[0].timestamp)}function _(e,r,o){const s=e.videoStartEpochMs+o;let t={rect:e.canvas,drawingWidth:e.canvas.drawingWidth,drawingHeight:e.canvas.drawingHeight};for(const a of r){if(a.timestamp>s)break;a.type===P.Custom&&a.data.tag==="volter-canvas-layout"&&a.data.payload&&typeof a.data.payload=="object"&&"rect"in a.data.payload&&"drawingWidth"in a.data.payload&&"drawingHeight"in a.data.payload&&(t=a.data.payload)}return t}async function J(e,r){await new Promise((o,s)=>{const t=()=>{clearTimeout(n),e.removeEventListener("loadeddata",a),e.removeEventListener("error",i)},a=()=>{t(),o()},i=()=>{t(),s(new Error("replay video failed to load"))},n=setTimeout(()=>{t(),s(new Error("replay video load timed out"))},15e3);e.readyState>=HTMLMediaElement.HAVE_CURRENT_DATA?a():(e.addEventListener("loadeddata",a,{once:!0}),e.addEventListener("error",i,{once:!0}))}),!(Math.abs(e.currentTime-r)<.001)&&await new Promise((o,s)=>{const t=()=>{clearTimeout(n),e.removeEventListener("seeked",a),e.removeEventListener("error",i)},a=()=>{t(),o()},i=()=>{t(),s(new Error("replay video seek failed"))},n=setTimeout(()=>{t(),s(new Error("replay video seek timed out"))},15e3);e.addEventListener("seeked",a,{once:!0}),e.addEventListener("error",i,{once:!0}),e.currentTime=r})}async function Q(e){e.fonts.size>0&&e.fonts.status!=="loaded"&&await Promise.race([e.fonts.ready.then(()=>{}),new Promise(r=>setTimeout(r,3e3))]),await Promise.all(Array.from(e.images,r=>r.decode().catch(()=>{})))}async function S(e,r){const[o,s]=await Promise.all([T(e,"manifest.json"),j(e)]),t=JSON.parse(o);if(t.status!=="complete"||t.format!=="canvas-dom"||t.version!==1||!t.capture||typeof t.capture.durationMs!="number")throw new Error("replay manifest is incomplete or unsupported");const a=document.createElement("div");a.setAttribute("data-volter-replay-block",""),Object.assign(a.style,{position:"fixed",left:"-100000px",top:"0",width:`${t.viewport.width}px`,height:`${t.viewport.height}px`,overflow:"hidden",pointerEvents:"none"});const i=document.createElement("div");a.append(i),document.body.append(a);const n=document.createElement("video");n.muted=!0,n.preload="auto",n.playsInline=!0,n.src=x(e,"video"),a.append(n);let w;try{w=new N(s,{root:i,showWarning:!1,showDebug:!1,mouseTail:!1,UNSAFE_replayCanvas:!0,insertStyleRules:["[data-volter-replay-video] { visibility: hidden !important; }"]});const f=w;return await r({manifest:t,async render(u){const h=Math.max(0,Math.min(u,t.capture.durationMs));await J(n,h/1e3),f.pause(G(t,s,h)),await Q(f.iframe.contentDocument);const y=f.getMirror().getNode(t.canvas.nodeId),p=f.getMirror().getNode(t.surfaceNodeId);if(!y||y.tagName!=="CANVAS")throw new Error("replay canvas placeholder is unavailable");if(!p||typeof p.getBoundingClientRect!="function")throw new Error("replay game surface is unavailable");const c=y,g=p;c.setAttribute("data-volter-root-surface","true");const E=_(t,s,h);c.width=E.drawingWidth,c.height=E.drawingHeight;const d=c.getContext("2d");if(!d)throw new Error("replay canvas has no 2D context");return d.drawImage(n,0,0,c.width,c.height),c.style.setProperty("visibility","visible","important"),g}})}finally{n.pause(),w?.destroy(),n.removeAttribute("src"),n.load(),a.remove()}}async function Z(e,r){return S(e,async({manifest:o,render:s})=>{const t=Math.max(0,Math.min(r,o.capture.durationMs)),a=await s(t),i=await L(a),n=a.getBoundingClientRect();return{...i,replayPath:e,positionMs:t,width:Math.max(1,Math.round(n.width)),height:Math.max(1,Math.round(n.height))}})}async function ee(e){const r=e.fps??30;if(!Number.isInteger(r)||r<1||r>60)throw new Error("replay export fps must be an integer from 1 to 60");return S(e.replayPath,async({manifest:o,render:s})=>{const t=e.startMs??0,a=e.endMs??o.capture.durationMs;if(!Number.isFinite(t)||!Number.isFinite(a)||t<0||a<=t||a>o.capture.durationMs||a-t>3e5)throw new Error("replay export requires a valid recorded interval of at most five minutes");const i=t/1e3,n=a/1e3,w=Math.ceil((n-i)*r),f=await s(t),u=document.createElement("canvas"),h=f.getBoundingClientRect();u.width=Math.max(1,Math.round(h.width)),u.height=Math.max(1,Math.round(h.height));const y={width:u.width,height:u.height},p=new U,c=new $({target:p,format:new B}),g=new D(u,{codec:"vp9",quality:new A({bitrate:3e6})});c.addVideoTrack(g,{frameRate:r});const E=new I({source:new H(x(e.replayPath,"video")),formats:[W]});try{const d=await E.getPrimaryAudioTrack();if(o.capture.audio&&!d)throw new Error("recorded audio track is missing");const M=d?new V({codec:"opus",quality:new A({bitrate:128e3})}):null;M&&c.addAudioTrack(M),await c.start();const R=async()=>{if(!(!M||!d)){for await(const l of new q(d).samples(i,n))try{const m=Math.max(0,Math.ceil((i-l.timestamp)*l.sampleRate)),v=Math.min(l.numberOfFrames,Math.ceil((n-l.timestamp)*l.sampleRate));if(v<=m)continue;const b=l.trim(m,v);try{b.setTimestamp(Math.max(0,b.timestamp-i)),await M.add(b)}finally{b.close()}}finally{l.close()}M.close()}},k=async()=>{const l=F();for(let m=0;m<w;m++){const v=m/r;await O(await s(t+v*1e3),u,{size:y,snapshots:l}),await g.add(v,Math.min(1/r,n-i-v),{keyFrame:m%(r*2)===0})}g.close()};if(await Promise.all([R(),k()]),await c.finalize(),!p.buffer)throw new Error("replay encoder produced no output");return{blob:new Blob([p.buffer],{type:"video/webm"}),frames:w,fps:r,durationMs:a-t,...y,audio:d!==null}}catch(d){throw c.state!=="finalized"&&await c.cancel(),d}finally{E.dispose()}})}export{Z as c,ee as e};