@volter/game-editor 0.5.113 → 0.5.114

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 +2162 -2162
  5. package/dist/assets/{AssetBudgetPanel-YOmIrgrb.js → AssetBudgetPanel-C2cPjuBg.js} +3 -3
  6. package/dist/assets/{AudioViewer-bTwqa-Sq.js → AudioViewer-Bpo_jpIi.js} +1 -1
  7. package/dist/assets/{CanvasBoardDocument-DH0GumqR.js → CanvasBoardDocument-DwBIeMZ4.js} +1 -1
  8. package/dist/assets/{CanvasSceneViewport-GSbXiEc2.js → CanvasSceneViewport-BNdmWk-Z.js} +1 -1
  9. package/dist/assets/{ColorInput-CM13COOy.js → ColorInput-BDfmeGV7.js} +1 -1
  10. package/dist/assets/{ColorPicker-EVo4ngxp.js → ColorPicker-CirredSr.js} +1 -1
  11. package/dist/assets/{EntityModelDocument-BTYbMslU.js → EntityModelDocument-CVSuhql6.js} +1 -1
  12. package/dist/assets/{EnvironmentAssetDocument-CxncdHY1.js → EnvironmentAssetDocument-zoSJqmVn.js} +1 -1
  13. package/dist/assets/{GameplaySessionTimeline-PDuA7cCk.js → GameplaySessionTimeline-CXuEu0EC.js} +1 -1
  14. package/dist/assets/{ImageViewer-Dr9tOsGR.js → ImageViewer-BlwxCH_J.js} +1 -1
  15. package/dist/assets/InspectorObjectPreview-BIP7icp4.js +1 -0
  16. package/dist/assets/{JsonAssetDocument-95S-d0FJ.js → JsonAssetDocument-Bca1OEvU.js} +1 -1
  17. package/dist/assets/{LiveModuleDocument-tqAYWVCZ.js → LiveModuleDocument-BKw3vGr0.js} +1 -1
  18. package/dist/assets/{LutAssetDocument-DOpqQnUe.js → LutAssetDocument-Cg-37y7Y.js} +1 -1
  19. package/dist/assets/{ModelAssetDocument-DrWymVJX.js → ModelAssetDocument-DMj74VoY.js} +1 -1
  20. package/dist/assets/{NonThreeAuthoringBootstrap-Gnetb5kf.js → NonThreeAuthoringBootstrap-CTZ5QGOi.js} +1 -1
  21. package/dist/assets/{Object3DDocumentToolbar-LEaER56N.js → Object3DDocumentToolbar-YqAXNX73.js} +1 -1
  22. package/dist/assets/Object3DDocumentViewport-BAFF8tXA.js +2 -0
  23. package/dist/assets/{Object3DPreview-CI9SLEn2.js → Object3DPreview-DhldNd5m.js} +1 -1
  24. package/dist/assets/{OnlineAssetDetail-C1_UGp0X.js → OnlineAssetDetail-ClT4eFxW.js} +1 -1
  25. package/dist/assets/{PlayBar-BqFW5mT2.js → PlayBar-Siahnvsw.js} +1 -1
  26. package/dist/assets/{QuarksAssetDocument-B1-XXOIo.js → QuarksAssetDocument-BCJCpXzv.js} +1 -1
  27. package/dist/assets/{ReactCanvasControls-BF1bVCnc.js → ReactCanvasControls-C2Dg7PAS.js} +1 -1
  28. package/dist/assets/{RootSelectionOverlay-BF32ngZd.js → RootSelectionOverlay-B76QTxXQ.js} +1 -1
  29. package/dist/assets/{ShaderAssetDocument-Dp1QXqID.js → ShaderAssetDocument-BC_bMDIb.js} +1 -1
  30. package/dist/assets/{ShadowEditor-4Db4i5w5.js → ShadowEditor-BmMIsUKh.js} +1 -1
  31. package/dist/assets/{SourceAssetViewer-BmlLDth6.js → SourceAssetViewer-Cq0O9fPd.js} +1 -1
  32. package/dist/assets/{StageHost-BQL5IEe5.js → StageHost-DL-rn1xw.js} +2 -2
  33. package/dist/assets/{StoryPreviewMount-wz2HTXNK.js → StoryPreviewMount-Bb6bAFFD.js} +1 -1
  34. package/dist/assets/{ThreeBoardDocument-DEAY51YS.js → ThreeBoardDocument-DVKtb195.js} +2 -2
  35. package/dist/assets/{ThreeIsolationSceneContent-BTsDcsEk.js → ThreeIsolationSceneContent-Cgn5gNZK.js} +1 -1
  36. package/dist/assets/{ToolObject3DPreview-DwuMA8jQ.js → ToolObject3DPreview-CC6zmX0_.js} +1 -1
  37. package/dist/assets/{Toolbar-D1TipTFF.js → Toolbar-CtuKETND.js} +1 -1
  38. package/dist/assets/{TransientHint-DzC7ZR7m.js → TransientHint-BznxmBhK.js} +1 -1
  39. package/dist/assets/{VideoViewer-Dh6AS4So.js → VideoViewer-Bf8CFBye.js} +1 -1
  40. package/dist/assets/{ViewportShadingMenu-B3YlrMIP.js → ViewportShadingMenu-CHI1Ybps.js} +1 -1
  41. package/dist/assets/{active-ingest-DyPN4pXx.js → active-ingest-CdkBLhUn.js} +2 -2
  42. package/dist/assets/{animation-clock-Cgc__YFh.js → animation-clock-iXNr3pAB.js} +1 -1
  43. package/dist/assets/{animation-mixers.service-gxCtRrOy.js → animation-mixers.service-44VFyY6S.js} +1 -1
  44. package/dist/assets/{animation-timeline.utility-DB9Ux44B.js → animation-timeline.utility-Dc7J3kL7.js} +1 -1
  45. package/dist/assets/{asset-budget-asset.menu-B00KTyex.js → asset-budget-asset.menu-2A17aYDp.js} +1 -1
  46. package/dist/assets/{asset-budget.action-DBNBL_EX.js → asset-budget.action-D5zTxlwK.js} +1 -1
  47. package/dist/assets/{asset-budget.document-BdNi2KSS.js → asset-budget.document-BnfZWG-Z.js} +1 -1
  48. package/dist/assets/{asset-budget.menu-B5ac_4XU.js → asset-budget.menu-B80Zj_Gc.js} +1 -1
  49. package/dist/assets/{asset-editor-persistence-BB9WAcxO.js → asset-editor-persistence-CDltpHCs.js} +1 -1
  50. package/dist/assets/{asset-loaders-BIr1M5-7.js → asset-loaders-CNaS8TZG.js} +1 -1
  51. package/dist/assets/{asset-preview-SYBnd0Vm.js → asset-preview-DJuOkxhj.js} +1 -1
  52. package/dist/assets/{audio-unlock.service-DzxNWnKh.js → audio-unlock.service-BrBhpJMC.js} +1 -1
  53. package/dist/assets/{audio.utility-B-NT_pSF.js → audio.utility-B4-eoTPZ.js} +1 -1
  54. package/dist/assets/autoplay.service-CFvofovm.js +1 -0
  55. package/dist/assets/{babylon-authoring-adapter-ClEvING-.js → babylon-authoring-adapter-vZdL2Gto.js} +1 -1
  56. package/dist/assets/{binding-resolver-DrkSEcWH.js → binding-resolver-OJ_J6yIE.js} +2 -2
  57. package/dist/assets/{blender-node-editor.document-BLudqWaR.js → blender-node-editor.document-BDczfFxt.js} +1 -1
  58. package/dist/assets/{blender-properties-tab-CgQrdCmF.js → blender-properties-tab-CjgK0Bbk.js} +1 -1
  59. package/dist/assets/{blender-runtime-host-DzGwnLBS.js → blender-runtime-host-Dlc9w0Zh.js} +1 -1
  60. package/dist/assets/{blender-runtime-skin-C2nxKTQ1.js → blender-runtime-skin-D1UM12LE.js} +1 -1
  61. package/dist/assets/{blender-runtime.document-DF4Kd_X3.js → blender-runtime.document-CCV5Y9OE.js} +1 -1
  62. package/dist/assets/{blender-screenshot.menu-CgmIjtZz.js → blender-screenshot.menu-C36rWtiC.js} +1 -1
  63. package/dist/assets/{blender-timeline.document-C4mTn6aP.js → blender-timeline.document-lk_PIJob.js} +1 -1
  64. package/dist/assets/{blender-uv-editor.document-CJAzjOUQ.js → blender-uv-editor.document-CTmIU4Kh.js} +1 -1
  65. package/dist/assets/{blender-version.status-D7gCX70i.js → blender-version.status-DJlu7qr4.js} +1 -1
  66. package/dist/assets/{blender.command-B6fKa6tA.js → blender.command-DzCCQQOZ.js} +1 -1
  67. package/dist/assets/{board-guides-CxjOETvX.js → board-guides-BlBRZmTQ.js} +1 -1
  68. package/dist/assets/{bridge.command-a-jcQB8T.js → bridge.command-ClY9S8Un.js} +3 -3
  69. package/dist/assets/{browserAll-BuXe7m07.js → browserAll-Mv9lBgrZ.js} +1 -1
  70. package/dist/assets/{build-player.document-BD0PnuJ8.js → build-player.document-Cy7MEpas.js} +1 -1
  71. package/dist/assets/{build-profiles.document-CVkrs6H4.js → build-profiles.document-WaCFbiLP.js} +1 -1
  72. package/dist/assets/{build-progress.status-FeI4UjwE.js → build-progress.status-DTcmGi_P.js} +1 -1
  73. package/dist/assets/{build-session-DgvoUFRy.js → build-session-DbpKkNJV.js} +1 -1
  74. package/dist/assets/{build.action-De0QZn5x.js → build.action-C2j5_dxu.js} +1 -1
  75. package/dist/assets/{build.command-Etx4MsuF.js → build.command-DioIRVgu.js} +1 -1
  76. package/dist/assets/{build.header-CrYpkM9P.js → build.header-BzewhRVE.js} +1 -1
  77. package/dist/assets/{build.menu-DblGKZpN.js → build.menu-BzXblcjm.js} +1 -1
  78. package/dist/assets/{build.service-CnNOfCLi.js → build.service-nY7pgo8P.js} +1 -1
  79. package/dist/assets/{camera-BfeEfKS0.js → camera-C4iahwRu.js} +1 -1
  80. package/dist/assets/{camera-runtime.inspector-Cz9u-_ud.js → camera-runtime.inspector-0hl6Lpc7.js} +1 -1
  81. package/dist/assets/{canvas-design-mount-Dw9d5RCT.js → canvas-design-mount-ZR59B_S-.js} +3 -3
  82. package/dist/assets/{canvas-entry-runtime-C2NiPlg5.js → canvas-entry-runtime-DfwjEnac.js} +2 -2
  83. package/dist/assets/{canvas-preview-frames-DgjyhrhI.js → canvas-preview-frames-BK9lbVhI.js} +1 -1
  84. package/dist/assets/{canvas-story-capture.service-DJNBPJ5i.js → canvas-story-capture.service-BB37SSiy.js} +2 -2
  85. package/dist/assets/{capability-coverage-DR7JrSFb.js → capability-coverage-BbGACSQ7.js} +1 -1
  86. package/dist/assets/{collaboration-presence-CANQ_L1j.js → collaboration-presence-Bsr8DNTC.js} +1 -1
  87. package/dist/assets/{collider-DfVDH8FN.js → collider-CNgw-tJm.js} +1 -1
  88. package/dist/assets/{component-board.service-CeMs1Lk8.js → component-board.service-ABJTCD9U.js} +2 -2
  89. package/dist/assets/{component-board.service-kbY79QZo.js → component-board.service-BkvLOF6E.js} +2 -2
  90. package/dist/assets/{component-board.service-DVoLrHrs.js → component-board.service-DrGTgtOW.js} +2 -2
  91. package/dist/assets/{component-contracts.service-MNL4lwbm.js → component-contracts.service-AJNTJQUd.js} +1 -1
  92. package/dist/assets/{component-instance-root-Cau6CbHE.js → component-instance-root-DSo9btvO.js} +1 -1
  93. package/dist/assets/{component-verbs.command-qIVRD_Xw.js → component-verbs.command-DAZikwtn.js} +1 -1
  94. package/dist/assets/{component-verbs.service-B5JxoJav.js → component-verbs.service-CbmTNwUC.js} +1 -1
  95. package/dist/assets/{config-RCXzlzsa.js → config-ByW2y5rs.js} +2 -2
  96. package/dist/assets/{configurations-IGbOtv8A.js → configurations-LzOt_ui9.js} +1 -1
  97. package/dist/assets/{connection.status-ByfpCgpC.js → connection.status-fh7qO4aP.js} +1 -1
  98. package/dist/assets/{constraints.inspector-uzln0fl-.js → constraints.inspector-BILU-OeN.js} +1 -1
  99. package/dist/assets/{content-bounds-D-AXJalq.js → content-bounds-kt7VKpcn.js} +1 -1
  100. package/dist/assets/{contract-system-adapters-DFS6S5jR.js → contract-system-adapters-Cozx6nCn.js} +1 -1
  101. package/dist/assets/{coverage.service-CVsV-Ujp.js → coverage.service-CswPRFnJ.js} +1 -1
  102. package/dist/assets/{create-runtime-SfhwBdX4.js → create-runtime-CNEjmtin.js} +1 -1
  103. package/dist/assets/{curve-o1Gq54K5.js → curve-BKb_W-u_.js} +1 -1
  104. package/dist/assets/{data-asset-BHGaqife.js → data-asset-C39Y1A_d.js} +1 -1
  105. package/dist/assets/{data-ref-BAsRympT.js → data-ref-tKY-R3JG.js} +1 -1
  106. package/dist/assets/{debug-bridge-CP_QGmkP.js → debug-bridge-CLBVU34P.js} +1 -1
  107. package/dist/assets/{debug-registry-CKJW2aaQ.js → debug-registry-PtCg-gAQ.js} +1 -1
  108. package/dist/assets/{deferred-ingest-play-NdjNkEVn.js → deferred-ingest-play-DlgkyiVk.js} +2 -2
  109. package/dist/assets/{design-time-canvas-mount-DkXsU3H1.js → design-time-canvas-mount-DlS15mlk.js} +2 -2
  110. package/dist/assets/{design-time-layers-BV3mP1Sf.js → design-time-layers-BSk9iy6A.js} +1 -1
  111. package/dist/assets/{design-time-mount.service-BrbX9-Z0.js → design-time-mount.service-bV28BtPG.js} +2 -2
  112. package/dist/assets/{design-time-mount.service-BFusXbnS.js → design-time-mount.service-yeuApmeU.js} +2 -2
  113. package/dist/assets/{design-time-react-mount-BYKVfWQS.js → design-time-react-mount-7EgUpZDW.js} +1 -1
  114. package/dist/assets/{document-preview-three-BOP4aWm7.js → document-preview-three-DcVcoC1y.js} +1 -1
  115. package/dist/assets/{dom-authoring-adapter-R0NT6Dgv.js → dom-authoring-adapter-Dnjvh9yG.js} +1 -1
  116. package/dist/assets/{draco3d-B28c7B_w.js → draco3d-3EapKinA.js} +1 -1
  117. package/dist/assets/{edit-mode-audio.service-D4hfjqDu.js → edit-mode-audio.service-ffiNgJwH.js} +1 -1
  118. package/dist/assets/{edit-mode-authoring-FKyNiefy.js → edit-mode-authoring-BEqEkXIT.js} +1 -1
  119. package/dist/assets/{edit-mode-networking.service-BixjLG2r.js → edit-mode-networking.service-9uQLb9Fc.js} +1 -1
  120. package/dist/assets/{editor-api-B8AYtjAH.js → editor-api-TexfN2js.js} +1 -1
  121. package/dist/assets/{editor-layers-L_zFs_uY.js → editor-layers-DB9_uFyw.js} +1 -1
  122. package/dist/assets/{editor-shell-store-DOiPmqow.js → editor-shell-store-DAFZw7de.js} +1 -1
  123. package/dist/assets/{entity-object-CvrkMcCz.js → entity-object-CG32Sh-D.js} +1 -1
  124. package/dist/assets/{extend-Kvra-g2p.js → extend-BJCYmdCg.js} +1 -1
  125. package/dist/assets/{fork-menu-BuRnpNg9.js → fork-menu-B0CAnsQ0.js} +1 -1
  126. package/dist/assets/{frame-debugger-store-Bz-SsB7V.js → frame-debugger-store-DRPBji06.js} +1 -1
  127. package/dist/assets/{game-contract-seams-gtPhkpZH.js → game-contract-seams-D3jp9kfH.js} +1 -1
  128. package/dist/assets/{game-css-scope-transform-BJ-6sqe3.js → game-css-scope-transform-CNq9C0a8.js} +1 -1
  129. package/dist/assets/{game-document.service-Dtsjp-QD.js → game-document.service-Ikp3u-8X.js} +1 -1
  130. package/dist/assets/{game-eval.command-Bx_q6yCj.js → game-eval.command-DR0dtfPa.js} +1 -1
  131. package/dist/assets/{game-module-access-C8FuQkAK.js → game-module-access-DceYIduW.js} +1 -1
  132. package/dist/assets/{game-network-BfrYV3Wu.js → game-network-DOCCFwtp.js} +3 -3
  133. package/dist/assets/{gameplay-export-CagiJo3l.js → gameplay-export-BfVqSEgT.js} +1 -1
  134. package/dist/assets/{gameplay-replay-BGDvgIWD.js → gameplay-replay-D9quLJQt.js} +1 -1
  135. package/dist/assets/{gameplay.command-C1gvtyuv.js → gameplay.command-CVuLo_kD.js} +1 -1
  136. package/dist/assets/{generation-jobs-B3vV9DA5.js → generation-jobs-dFYEPPwC.js} +1 -1
  137. package/dist/assets/{generation.service-CAQ3QEXE.js → generation.service-DtP2HZFd.js} +1 -1
  138. package/dist/assets/{generations-maNAZ6ie.js → generations-BqaARHQz.js} +1 -1
  139. package/dist/assets/{generations.status-BHOoDM64.js → generations.status-DpyocrDb.js} +1 -1
  140. package/dist/assets/{hierarchy-marks-BBOKHySh.js → hierarchy-marks-Ducimsnh.js} +1 -1
  141. package/dist/assets/{hosted-asset-materialization-1nbID23w.js → hosted-asset-materialization-CibGdw61.js} +1 -1
  142. package/dist/assets/{index-D7-TEN6k.js → index-4Vg6KHJs.js} +1 -1
  143. package/dist/assets/{index-DV2EMzou.js → index-BMshF0VP.js} +1 -1
  144. package/dist/assets/{index-BNk1xsv9.js → index-BaM5nplw.js} +1 -1
  145. package/dist/assets/{index-BUrCxsh5.js → index-CKoL9Z8h.js} +1 -1
  146. package/dist/assets/{index-DxZ4l0Lx.js → index-Cs_hnykK.js} +8 -8
  147. package/dist/assets/{index-CIQueasL.js → index-CyN2UjMe.js} +1 -1
  148. package/dist/assets/{index-CokH1Dgb.js → index-DMA-GnGs.js} +1 -1
  149. package/dist/assets/{index-y3CKXb3j.js → index-Df0th-r3.js} +1 -1
  150. package/dist/assets/{index-2-K3RgL5.js → index-M1-SoN0U.js} +2 -2
  151. package/dist/assets/{inference-diagnostics-5lf-ZIbs.js → inference-diagnostics-aOHTUQ5I.js} +1 -1
  152. package/dist/assets/{ingest-boot-viewport-D4jEOuoN.js → ingest-boot-viewport-J9SqqmBi.js} +1 -1
  153. package/dist/assets/{ingest-siblings-FkhDSlt8.js → ingest-siblings-DI-4N8EJ.js} +1 -1
  154. package/dist/assets/{ingest-source-persistence-Ci1cjdJ9.js → ingest-source-persistence-BlQ86Ezy.js} +1 -1
  155. package/dist/assets/{ingest.service-DCcj8m5Y.js → ingest.service-DGJl6Kg1.js} +1 -1
  156. package/dist/assets/{inspect-CR7QdMOn.js → inspect-CSzAyD3t.js} +1 -1
  157. package/dist/assets/instances.command-DCKGMDy5.js +1 -0
  158. package/dist/assets/{json-history-resource-C5b3fL6s.js → json-history-resource-C5lzztrI.js} +1 -1
  159. package/dist/assets/{layered-pick-BxRnQHJy.js → layered-pick-Da3YPGWE.js} +1 -1
  160. package/dist/assets/{light-DCa8P1uY.js → light-D9BNM9LO.js} +1 -1
  161. package/dist/assets/{live-project-verbs-De2cikPw.js → live-project-verbs-CeLmddwY.js} +1 -1
  162. package/dist/assets/{machine.document-ZHRCTuWw.js → machine.document-D9RIS2J1.js} +1 -1
  163. package/dist/assets/{machines.finder-_EknWXAa.js → machines.finder-B_-K7mbg.js} +1 -1
  164. package/dist/assets/{material-CKTGcoVC.js → material-Di4_5UR9.js} +1 -1
  165. package/dist/assets/{material-factory-Dqmsa3qq.js → material-factory-Cdk5ozUy.js} +1 -1
  166. package/dist/assets/{mesh-D7E7Tpno.js → mesh-B3l7POsp.js} +1 -1
  167. package/dist/assets/{model-asset-sections.service-BODa7-eZ.js → model-asset-sections.service-wBLLtK1P.js} +1 -1
  168. package/dist/assets/{model-inspection-C3HZSfTa.js → model-inspection-QwuuTlfj.js} +1 -1
  169. package/dist/assets/{model-thumbnail-DU5Hb25u.js → model-thumbnail-BXNwjwVQ.js} +1 -1
  170. package/dist/assets/{models.finder-DGHllLJN.js → models.finder-BlvEy8zN.js} +1 -1
  171. package/dist/assets/{module-mode-D94Fe5TK.js → module-mode-DJJCSruV.js} +2 -2
  172. package/dist/assets/{mount-canvas-ingest-root-C7z5voqs.js → mount-canvas-ingest-root-BKB4WIx_.js} +2 -2
  173. package/dist/assets/{mount-dom-ingest-root-DQe5ADSt.js → mount-dom-ingest-root-PRkBWUWu.js} +2 -2
  174. package/dist/assets/{mount-ingest-root-Cux7Vat0.js → mount-ingest-root-CQLOfg6j.js} +2 -2
  175. package/dist/assets/{mount-manifest-DA9vvNwK.js → mount-manifest-GP2eO4t9.js} +1 -1
  176. package/dist/assets/{mount-three-ingest-root-DdLSbSi_.js → mount-three-ingest-root-T3wn7mca.js} +1 -1
  177. package/dist/assets/{mounted-authoring-CdPS27uW.js → mounted-authoring-Db9gY4N3.js} +1 -1
  178. package/dist/assets/{mounted-story-viewport-source-smY_3Xvs.js → mounted-story-viewport-source-C9HGOm_J.js} +1 -1
  179. package/dist/assets/{native-debug-module-D3XVzf2G.js → native-debug-module-QRchsh2v.js} +1 -1
  180. package/dist/assets/{navigation-BL2K8g78.js → navigation-C-8TPzHJ.js} +1 -1
  181. package/dist/assets/{navmesh.menu-yn3UhjtF.js → navmesh.menu-D0aY0A-x.js} +1 -1
  182. package/dist/assets/{navmesh.service-Be0ucoLP.js → navmesh.service-CZ7uSgkz.js} +1 -1
  183. package/dist/assets/network-observer.service-CD9z9tBp.js +1 -0
  184. package/dist/assets/{network.utility-7WMTdKbC.js → network.utility-BOHNhfSD.js} +1 -1
  185. package/dist/assets/{object3d-document-session-registry-BOhbeWPh.js → object3d-document-session-registry-PE-4fjz1.js} +2 -2
  186. package/dist/assets/{oid-transform-D1XfG014.js → oid-transform-B32kPrkS.js} +1 -1
  187. package/dist/assets/{particles-Cry0sotq.js → particles-DkCd4wzc.js} +1 -1
  188. package/dist/assets/{pixi-authoring-adapter-D4r0NNmF.js → pixi-authoring-adapter-Cz6GKyRX.js} +1 -1
  189. package/dist/assets/{pixi-live-write-target-CBs8-AZJ.js → pixi-live-write-target-Dvo0ZrpJ.js} +1 -1
  190. package/dist/assets/{play.command-Dr0f3V-I.js → play.command-jRmgmt62.js} +2 -2
  191. package/dist/assets/{presentation-DZPpkAZH.js → presentation-BWLM0Zst.js} +1 -1
  192. package/dist/assets/{product-Ds7m0MXl.js → product-NPUDoYQp.js} +1 -1
  193. package/dist/assets/{profiler.action-hX-xAN1Q.js → profiler.action-BdEeMmlP.js} +1 -1
  194. package/dist/assets/{profiler.menu-DII7IA6d.js → profiler.menu-DmaIMEQp.js} +1 -1
  195. package/dist/assets/{profiler.utility-BaEdm9wI.js → profiler.utility-BqCXFtf4.js} +1 -1
  196. package/dist/assets/{project-authoring-session-0PLEfHVB.js → project-authoring-session-DWdfTjb4.js} +2 -2
  197. package/dist/assets/{properties-bone-constraints.inspector-bnTZA2Sx.js → properties-bone-constraints.inspector-Do18oyXm.js} +1 -1
  198. package/dist/assets/{properties-bone.inspector-Ba_BALxK.js → properties-bone.inspector-DHRW9Zdy.js} +1 -1
  199. package/dist/assets/{properties-collection.inspector-BB7SCk6k.js → properties-collection.inspector-B_ZqDhIB.js} +1 -1
  200. package/dist/assets/{properties-constraints.inspector-QvPC5CKU.js → properties-constraints.inspector-DGUezsPF.js} +1 -1
  201. package/dist/assets/{properties-data.inspector-C8DURz4h.js → properties-data.inspector-DW6_t8_e.js} +1 -1
  202. package/dist/assets/{properties-material.inspector-BevMJr27.js → properties-material.inspector-CjK7oKK4.js} +1 -1
  203. package/dist/assets/{properties-modifiers.inspector-Y5pMiksE.js → properties-modifiers.inspector-BzIR7FjM.js} +1 -1
  204. package/dist/assets/{properties-object.inspector-CQ42THXn.js → properties-object.inspector-3fsVkAFS.js} +1 -1
  205. package/dist/assets/{properties-output.inspector-Bt_7itt6.js → properties-output.inspector-D1zWlLWX.js} +1 -1
  206. package/dist/assets/{properties-particles.inspector-Bh8XwGWa.js → properties-particles.inspector-CwNWZhyR.js} +1 -1
  207. package/dist/assets/{properties-physics.inspector-C9Kg9opR.js → properties-physics.inspector-BnmFQq_i.js} +1 -1
  208. package/dist/assets/{properties-render.inspector-D0QyE0hB.js → properties-render.inspector-Di2qTS4q.js} +1 -1
  209. package/dist/assets/{properties-scene.inspector-1MvLgJS8.js → properties-scene.inspector-1UZaXfw2.js} +1 -1
  210. package/dist/assets/{properties-texture.inspector-DEavbeV5.js → properties-texture.inspector-BaV5U-Qu.js} +1 -1
  211. package/dist/assets/{properties-view-layer.inspector-CLgXfOvJ.js → properties-view-layer.inspector-DxW9C8im.js} +1 -1
  212. package/dist/assets/{properties-world.inspector-Czxm5_qb.js → properties-world.inspector-Cb8cuI2F.js} +1 -1
  213. package/dist/assets/{r3f-design-session-Ds-Lh4CE.js → r3f-design-session-kg4aFo9v.js} +2 -2
  214. package/dist/assets/{r3f-physics-binding-Ddy2AMqs.js → r3f-physics-binding-C37YJGMW.js} +1 -1
  215. package/dist/assets/{r3f-source-authoring-adapter-IyBCACL1.js → r3f-source-authoring-adapter-ZKBMZbYR.js} +1 -1
  216. package/dist/assets/{react-canvas-navigation-DJjAqkef.js → react-canvas-navigation-DgndsFAo.js} +1 -1
  217. package/dist/assets/{react-inspector.service-CSk2kWPq.js → react-inspector.service-9bE0o_8D.js} +1 -1
  218. package/dist/assets/{react-story-board-Bcx-zIef.js → react-story-board-CCITskgO.js} +1 -1
  219. package/dist/assets/{react-three-rapier.esm-1NxU3dq9.js → react-three-rapier.esm-CIOYSgKg.js} +1 -1
  220. package/dist/assets/{react-world-authoring-adapter-OePxORCc.js → react-world-authoring-adapter-DK4jMqyN.js} +1 -1
  221. package/dist/assets/{realm-services-DpinxOxM.js → realm-services-BAZP9e8H.js} +1 -1
  222. package/dist/assets/{reflection-probe-capture.inspector-C_6oDrHo.js → reflection-probe-capture.inspector-BOCEOfun.js} +1 -1
  223. package/dist/assets/{registry-BS9FkzwE.js → registry-PeJ-uX3W.js} +1 -1
  224. package/dist/assets/{relative-import-specifier-D6hnbTcT.js → relative-import-specifier-BfGfJFJZ.js} +1 -1
  225. package/dist/assets/{render-env-C1fESfcu.js → render-env-ChDPR7QW.js} +1 -1
  226. package/dist/assets/{render-features-DHKbJ7Fz.js → render-features-BIgyjcOC.js} +1 -1
  227. package/dist/assets/{render-settings-ClSYLEFT.js → render-settings-C7hqpFnK.js} +1 -1
  228. package/dist/assets/{resolve-three-Bbo0SWwc.js → resolve-three-Dpd-fg3k.js} +3 -3
  229. package/dist/assets/{root-seam-contract-XS-29MWj.js → root-seam-contract-Crgu32u5.js} +1 -1
  230. package/dist/assets/{run-selection-DLf4qvaj.js → run-selection-xpSMOXG0.js} +1 -1
  231. package/dist/assets/{scene-capture-L3kI0vHP.js → scene-capture-D1sFvwyj.js} +1 -1
  232. package/dist/assets/{scene-document.service-BghK8Rt9.js → scene-document.service-BM50fy1J.js} +2 -2
  233. package/dist/assets/{scene-framing-BWych0aQ.js → scene-framing-BX1UTrnD.js} +1 -1
  234. package/dist/assets/{seeded-random-Ce4p3AkI.js → seeded-random-C85bEVkS.js} +1 -1
  235. package/dist/assets/{setup-renderer-DxcHRzSg.js → setup-renderer-DcKuhISr.js} +1 -1
  236. package/dist/assets/{source-object3d-authoring-adapter-CUFQCDZj.js → source-object3d-authoring-adapter-h3b7vPiK.js} +1 -1
  237. package/dist/assets/{source-persistence-backend-BsZyLz63.js → source-persistence-backend-DgTsuLXb.js} +1 -1
  238. package/dist/assets/{stage-keyboard-Bfxkwdni.js → stage-keyboard-BI4HOf1S.js} +1 -1
  239. package/dist/assets/{stage-overlay-set-bbNN2SNO.js → stage-overlay-set-Cssqqj_A.js} +1 -1
  240. package/dist/assets/{stage-presence-markers-C8xYcF2L.js → stage-presence-markers-7odF6Jqg.js} +1 -1
  241. package/dist/assets/{stage-transform-tools-p5sisbub.js → stage-transform-tools-CtyYmuLT.js} +1 -1
  242. package/dist/assets/{standard-viewport-dressing-I7UKATya.js → standard-viewport-dressing-C0D_Lkzi.js} +1 -1
  243. package/dist/assets/{state-watch.action-CAqCjd3J.js → state-watch.action-BjfXq_IH.js} +1 -1
  244. package/dist/assets/{state-watch.menu-DWN-p-a3.js → state-watch.menu-BRJo7Z-c.js} +1 -1
  245. package/dist/assets/{state-watch.utility-CMGyVLnH.js → state-watch.utility-D_swl2pz.js} +1 -1
  246. package/dist/assets/{story-capture-BGhtcQBF.js → story-capture-CMY7BKUL.js} +1 -1
  247. package/dist/assets/{story-documents-DaK12Qjv.js → story-documents-BwW_Ypnc.js} +1 -1
  248. package/dist/assets/{story-documents.service-CMNLzj5f.js → story-documents.service-B6YGoAas.js} +1 -1
  249. package/dist/assets/{story-documents.service-fChFb24G.js → story-documents.service-DpNKV5ve.js} +1 -1
  250. package/dist/assets/{story-media-presence-2zp3uRLL.js → story-media-presence-DgTM3l4X.js} +1 -1
  251. package/dist/assets/{story-pixi-preview-hxfq6ofD.js → story-pixi-preview-anB4NVfT.js} +1 -1
  252. package/dist/assets/{story-presentation-C_FXa1VN.js → story-presentation-Cm5Vl6Oh.js} +1 -1
  253. package/dist/assets/{story-three-preview-uQ3ADzPv.js → story-three-preview-BOD7-hxP.js} +2 -2
  254. package/dist/assets/{studio-environment-B1C4moYZ.js → studio-environment-Bg-I7fM-.js} +1 -1
  255. package/dist/assets/{surface-state-BZNvmNKu.js → surface-state-DUwBtx3k.js} +1 -1
  256. package/dist/assets/{syntactic-prop-specs-BA6l20Yy.js → syntactic-prop-specs-Bmxu19np.js} +1 -1
  257. package/dist/assets/{team-playtest.service-C5Vi2OJZ.js → team-playtest.service-CGh7mX2E.js} +1 -1
  258. package/dist/assets/{three-oA8NOIIL.js → three-CWmJa1qe.js} +1 -1
  259. package/dist/assets/{three-authoring-adapter-BckRZAFC.js → three-authoring-adapter-CwQ2Hl3O.js} +1 -1
  260. package/dist/assets/three-authoring.service-CSdBG8i-.js +2 -0
  261. package/dist/assets/{three-ingest-runtime-DZKrRIHE.js → three-ingest-runtime-Drh7DqsE.js} +1 -1
  262. package/dist/assets/{three-integration-iaJQ46tu.js → three-integration-D9SLXYnU.js} +2 -2
  263. package/dist/assets/three-integration.service-W2S36XB9.js +1 -0
  264. package/dist/assets/{three-projection-core-BDAHFfdE.js → three-projection-core-BxrVlHmD.js} +1 -1
  265. package/dist/assets/{three-state-BV7x8kw3.js → three-state-kIB-8XUB.js} +1 -1
  266. package/dist/assets/{three-story-capture.service-CaUSNiDk.js → three-story-capture.service-C8l6znQN.js} +2 -2
  267. package/dist/assets/{three-story-model-B6IgeeuY.js → three-story-model-DzqvFyFn.js} +1 -1
  268. package/dist/assets/{three-viewport-presentation-CKn-D0y1.js → three-viewport-presentation-2yL9mtBn.js} +1 -1
  269. package/dist/assets/{transform-mode-request-APlKqsfP.js → transform-mode-request-CwuDcUbZ.js} +1 -1
  270. package/dist/assets/{transport-strip-C-sBBXum.js → transport-strip-BK2izTHN.js} +1 -1
  271. package/dist/assets/transport.header-BB3O8i1G.js +1 -0
  272. package/dist/assets/{tuples-vz7GNWYe.js → tuples-DBc-K60w.js} +1 -1
  273. package/dist/assets/{ui-board-document-C5xsL6QI.js → ui-board-document-DM7FjXkv.js} +2 -2
  274. package/dist/assets/{user-data-BWhINAlG.js → user-data-B0afWRON.js} +1 -1
  275. package/dist/assets/{utility-view-state-DUssk2Y5.js → utility-view-state-BqtZzIZO.js} +1 -1
  276. package/dist/assets/{viewport-door-D_nXAmUt.js → viewport-door-DXf2BTtM.js} +1 -1
  277. package/dist/assets/{viewport-root-presentation-DKZfgm-u.js → viewport-root-presentation-DMXg0y2c.js} +1 -1
  278. package/dist/assets/{viewport-surface-status-BK9OGt3f.js → viewport-surface-status-Cb9tNbMn.js} +1 -1
  279. package/dist/assets/{webworkerAll-Du9ligfF.js → webworkerAll-SNqnnw8n.js} +1 -1
  280. package/dist/assets/{workspace-arrangement-BgwQc-qT.js → workspace-arrangement-4Fa_8tpk.js} +1 -1
  281. package/dist/assets/{world-documents-DeHr136o.js → world-documents-D_jW5Rdo.js} +1 -1
  282. package/dist/assets/{world-root-stage-binding-BM10opvf.js → world-root-stage-binding-jICg_fta.js} +1 -1
  283. package/dist/assets/{xstate-animation-binding-B_oh3YqN.js → xstate-animation-binding-D99r_COR.js} +1 -1
  284. package/dist/assets/{xstate-animation-meta-DJXYGNX1.js → xstate-animation-meta-DKGLnaIK.js} +1 -1
  285. package/dist-node/cli.js +358 -91
  286. package/package.json +16 -16
  287. package/dist/assets/InspectorObjectPreview-CmjfAk0I.js +0 -1
  288. package/dist/assets/Object3DDocumentViewport-CgifoYVE.js +0 -2
  289. package/dist/assets/autoplay.service-BOi_pnfg.js +0 -1
  290. package/dist/assets/instances.command-BvUqb2mS.js +0 -1
  291. package/dist/assets/network-observer.service-BS91UFhk.js +0 -1
  292. package/dist/assets/three-authoring.service-K1UPw3op.js +0 -2
  293. package/dist/assets/three-integration.service-DYpZ_rFP.js +0 -1
  294. package/dist/assets/transport.header-CxVZN4ZW.js +0 -1
package/dist-node/cli.js CHANGED
@@ -102,6 +102,7 @@ var init_client = __esm({
102
102
  TRANSPORT_RETRY_DELAY_MS2 = 400;
103
103
  EditorClient2 = class {
104
104
  baseUrl;
105
+ fetchOverride;
105
106
  /**
106
107
  * The running game's debug plane — see {@link GameDebugDoor}. It rides the
107
108
  * SAME `/__editor/command` relay every other method here uses (relay cases
@@ -131,7 +132,7 @@ var init_client = __esm({
131
132
  );
132
133
  }
133
134
  const unknownOptions = Object.keys(opts ?? {}).filter(
134
- (key) => key !== "url" && key !== "onEnvelope" && key !== "transport"
135
+ (key) => key !== "url" && key !== "onEnvelope" && key !== "transport" && key !== "fetch"
135
136
  );
136
137
  if (unknownOptions.length > 0) {
137
138
  throw new Error(
@@ -139,6 +140,7 @@ var init_client = __esm({
139
140
  );
140
141
  }
141
142
  this.baseUrl = (opts?.url ?? DEFAULT_URL2).replace(/\/$/, "");
143
+ this.fetchOverride = opts?.fetch;
142
144
  this.onEnvelope = opts?.onEnvelope ?? null;
143
145
  this.transport = opts?.transport ?? null;
144
146
  this.game = {
@@ -187,7 +189,7 @@ var init_client = __esm({
187
189
  signal: AbortSignal.timeout(deadlineMs)
188
190
  };
189
191
  commandDispatcher = deadlineMs > UNDICI_DEFAULT_HEADERS_TIMEOUT_MS2 ? createDispatcher2(deadlineMs + 3e4) : void 0;
190
- res = await dispatchFetch2(url, init, commandDispatcher);
192
+ res = this.fetchOverride ? await this.fetchOverride(url, init) : await dispatchFetch2(url, init, commandDispatcher);
191
193
  break;
192
194
  } catch (error) {
193
195
  await commandDispatcher?.destroy?.();
@@ -202,7 +204,7 @@ var init_client = __esm({
202
204
  const { code, detail } = describeFetchFailure2(error);
203
205
  if (options?.retryTransport === true && !retried && RETRYABLE_TRANSPORT_CODES2.has(code)) {
204
206
  retried = true;
205
- await new Promise((resolve12) => setTimeout(resolve12, TRANSPORT_RETRY_DELAY_MS2));
207
+ await new Promise((resolve13) => setTimeout(resolve13, TRANSPORT_RETRY_DELAY_MS2));
206
208
  continue;
207
209
  }
208
210
  throw new EditorCommandError2(
@@ -1098,7 +1100,7 @@ var init_client = __esm({
1098
1100
  */
1099
1101
  async httpFetch(url, init, dispatcher) {
1100
1102
  try {
1101
- return await dispatchFetch2(url, init, dispatcher);
1103
+ return this.fetchOverride ? await this.fetchOverride(url, init) : await dispatchFetch2(url, init, dispatcher);
1102
1104
  } catch (error) {
1103
1105
  if (error?.name === "TimeoutError") throw error;
1104
1106
  const { code, detail } = describeFetchFailure2(error);
@@ -2012,8 +2014,8 @@ __export(blender_mcp_exports, {
2012
2014
  serveBlenderMcp: () => serveBlenderMcp
2013
2015
  });
2014
2016
  import { randomUUID } from "node:crypto";
2015
- import { mkdirSync as mkdirSync9, readFileSync as readFileSync10, writeFileSync as writeFileSync9 } from "node:fs";
2016
- import { dirname as dirname7, relative as relative6, sep as sep3 } from "node:path";
2017
+ import { mkdirSync as mkdirSync10, readFileSync as readFileSync12, writeFileSync as writeFileSync10 } from "node:fs";
2018
+ import { dirname as dirname8, relative as relative6, sep as sep3 } from "node:path";
2017
2019
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2018
2020
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2019
2021
  import {
@@ -2204,15 +2206,15 @@ var init_blender_mcp = __esm({
2204
2206
  const bytes = Buffer.from(await spooled.arrayBuffer());
2205
2207
  if (shipped === null) {
2206
2208
  try {
2207
- if (readFileSync10(entry.path).equals(bytes)) {
2209
+ if (readFileSync12(entry.path).equals(bytes)) {
2208
2210
  this.#seen.set(entry.path, stamp);
2209
2211
  continue;
2210
2212
  }
2211
2213
  } catch (error) {
2212
2214
  if (error.code !== "ENOENT") throw error;
2213
2215
  }
2214
- mkdirSync9(dirname7(entry.path), { recursive: true });
2215
- writeFileSync9(entry.path, bytes);
2216
+ mkdirSync10(dirname8(entry.path), { recursive: true });
2217
+ writeFileSync10(entry.path, bytes);
2216
2218
  } else {
2217
2219
  const query = new URLSearchParams({
2218
2220
  path: shipped,
@@ -2307,15 +2309,15 @@ var init_blender_mcp = __esm({
2307
2309
 
2308
2310
  // node/cli.ts
2309
2311
  import { parseArgs } from "node:util";
2310
- import { dirname as dirname8, resolve as resolve11 } from "node:path";
2311
- import { spawn as spawn3 } from "node:child_process";
2312
+ import { dirname as dirname9, resolve as resolve12 } from "node:path";
2313
+ import { spawn as spawn4 } from "node:child_process";
2312
2314
  import { fileURLToPath as fileURLToPath2 } from "node:url";
2313
2315
 
2314
2316
  // package.json
2315
2317
  var package_default = {
2316
2318
  name: "@volter/game-editor",
2317
2319
  author: "Volter AI, Inc.",
2318
- version: "0.5.113",
2320
+ version: "0.5.114",
2319
2321
  publishConfig: {
2320
2322
  access: "public"
2321
2323
  },
@@ -2364,22 +2366,22 @@ var package_default = {
2364
2366
  }
2365
2367
  },
2366
2368
  dependencies: {
2367
- "@volter/editor-core": "0.5.113",
2368
- "@volter/editor-game": "0.5.113",
2369
- "@volter/editor-react": "0.5.113",
2370
- "@volter/editor-threejs": "0.5.113",
2371
- "@volter/editor-xstate": "0.5.113",
2372
- "@volter/editor-blender": "0.1.53",
2373
- "@volter/dawproject": "0.5.113",
2374
- "@volter/editor-dawproject": "0.5.113",
2375
- "@volter/blender-engine": "0.1.51",
2376
- "@volter/editor-project": "0.5.113",
2377
- "@volter/editor-sdk": "0.5.113",
2378
- "@volter/editor-live": "0.5.113",
2379
- "@volter/game-live": "0.5.113",
2369
+ "@volter/editor-core": "0.5.114",
2370
+ "@volter/editor-game": "0.5.114",
2371
+ "@volter/editor-react": "0.5.114",
2372
+ "@volter/editor-threejs": "0.5.114",
2373
+ "@volter/editor-xstate": "0.5.114",
2374
+ "@volter/editor-blender": "0.1.54",
2375
+ "@volter/dawproject": "0.5.114",
2376
+ "@volter/editor-dawproject": "0.5.114",
2377
+ "@volter/blender-engine": "0.1.52",
2378
+ "@volter/editor-project": "0.5.114",
2379
+ "@volter/editor-sdk": "0.5.114",
2380
+ "@volter/editor-live": "0.5.114",
2381
+ "@volter/game-live": "0.5.114",
2380
2382
  "@modelcontextprotocol/sdk": "1.30.0",
2381
- "@volter/game-runtime": "0.5.113",
2382
- "@volter/threejs-runtime": "0.5.113",
2383
+ "@volter/game-runtime": "0.5.114",
2384
+ "@volter/threejs-runtime": "0.5.114",
2383
2385
  undici: "7.29.1",
2384
2386
  typescript: "5.9.3",
2385
2387
  "@colyseus/schema": "^4.0.14",
@@ -6598,7 +6600,7 @@ function killEditorSessionProcess(pid, signal = "SIGTERM") {
6598
6600
  async function waitForPidExit(pid, timeoutMs) {
6599
6601
  const deadline = Date.now() + timeoutMs;
6600
6602
  while (pidAlive(pid) && Date.now() < deadline) {
6601
- await new Promise((resolve12) => setTimeout(resolve12, 50));
6603
+ await new Promise((resolve13) => setTimeout(resolve13, 50));
6602
6604
  }
6603
6605
  return !pidAlive(pid);
6604
6606
  }
@@ -7468,7 +7470,105 @@ async function currentPageErrors(serverUrl) {
7468
7470
  }
7469
7471
  }
7470
7472
 
7471
- // ../editor-core/dist/server/chunk-GINHEWZT.js
7473
+ // ../editor-core/dist/server/chunk-T7N5AXLU.js
7474
+ var HOSTED_ATTACHMENT_PATH = "/__editor-hosted";
7475
+ var HOSTED_ATTACHMENT_FRAGMENT = "volter-editor-attach";
7476
+ var HOSTED_MESSAGE_BYTES = 32 * 1024 * 1024;
7477
+ var HOSTED_REQUEST_BYTES = 1024 * 1024;
7478
+ function isHostedRequest(value) {
7479
+ if (!value || typeof value !== "object") return false;
7480
+ const v = value;
7481
+ return v["type"] === "request" && typeof v["id"] === "string" && /^[a-zA-Z0-9-]{1,80}$/.test(v["id"]) && typeof v["path"] === "string" && /^\/__editor\/[a-zA-Z0-9_/?=&%.-]+$/.test(v["path"]) && !v["path"].includes("..") && (v["method"] === "GET" || v["method"] === "POST") && (v["body"] === void 0 || typeof v["body"] === "string" && new TextEncoder().encode(v["body"]).length <= HOSTED_REQUEST_BYTES);
7482
+ }
7483
+ function hostedSocketUrl(endpoint) {
7484
+ const url = new URL(endpoint);
7485
+ if (url.protocol !== "https:" && !(url.protocol === "http:" && ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname)))
7486
+ throw new Error("Hosted attachments require HTTPS (or local loopback HTTP).");
7487
+ url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
7488
+ return url.href;
7489
+ }
7490
+ async function connectHostedAttachment(attachment) {
7491
+ const socket = new WebSocket(hostedSocketUrl(attachment.endpoint));
7492
+ const pending = /* @__PURE__ */ new Map();
7493
+ let state = {};
7494
+ const ready = new Promise((resolve13, reject) => {
7495
+ const timer = setTimeout(() => {
7496
+ reject(new Error("Hosted attachment did not answer."));
7497
+ socket.close();
7498
+ }, 15e3);
7499
+ socket.addEventListener("open", () => socket.send(JSON.stringify({ type: "auth", role: "client", token: attachment.token })));
7500
+ socket.addEventListener("message", (event) => {
7501
+ try {
7502
+ const value = JSON.parse(String(event.data));
7503
+ if (value.type === "ready") {
7504
+ state = value.state ?? {};
7505
+ clearTimeout(timer);
7506
+ resolve13();
7507
+ } else if (value.type === "state") state = value.state ?? {};
7508
+ else if (value.type === "response") {
7509
+ const call = pending.get(value.id);
7510
+ if (!call) return;
7511
+ pending.delete(value.id);
7512
+ call.cleanup();
7513
+ if (value.error) call.reject(new Error(value.error));
7514
+ else call.resolve(new Response([204, 205, 304].includes(value.status) ? null : value.body, {
7515
+ status: value.status,
7516
+ headers: { "content-type": "application/json" }
7517
+ }));
7518
+ } else if (value.type === "error") {
7519
+ clearTimeout(timer);
7520
+ reject(new Error(value.error));
7521
+ socket.close();
7522
+ }
7523
+ } catch (error) {
7524
+ clearTimeout(timer);
7525
+ reject(error);
7526
+ socket.close();
7527
+ }
7528
+ });
7529
+ socket.addEventListener("close", () => {
7530
+ clearTimeout(timer);
7531
+ reject(new Error("Hosted attachment disconnected."));
7532
+ for (const call of pending.values()) {
7533
+ call.cleanup();
7534
+ call.reject(new Error("Hosted attachment disconnected; the request was not replayed."));
7535
+ }
7536
+ pending.clear();
7537
+ });
7538
+ socket.addEventListener("error", () => {
7539
+ clearTimeout(timer);
7540
+ reject(new Error("Hosted attachment connection failed."));
7541
+ });
7542
+ });
7543
+ await ready;
7544
+ const remoteFetch = async (input, init) => {
7545
+ const request = new Request(input, init);
7546
+ const url = new URL(request.url);
7547
+ const message = { type: "request", id: crypto.randomUUID(), path: url.pathname + url.search, method: request.method };
7548
+ if (request.body) message.body = await request.text();
7549
+ if (!isHostedRequest(message)) throw new Error("Hosted attachment only carries bounded editor HTTP requests.");
7550
+ request.signal.throwIfAborted();
7551
+ return await new Promise((resolve13, reject) => {
7552
+ const abort = () => {
7553
+ pending.delete(message.id);
7554
+ if (socket.readyState === WebSocket.OPEN) socket.send(JSON.stringify({ type: "cancel", id: message.id }));
7555
+ reject(new Error("Hosted request cancelled; any completed mutation is not undone."));
7556
+ };
7557
+ if (socket.readyState !== WebSocket.OPEN) {
7558
+ reject(new Error("Hosted attachment is disconnected."));
7559
+ return;
7560
+ }
7561
+ pending.set(message.id, { resolve: resolve13, reject, cleanup: () => request.signal.removeEventListener("abort", abort) });
7562
+ request.signal.addEventListener("abort", abort, { once: true });
7563
+ socket.send(JSON.stringify(message));
7564
+ });
7565
+ };
7566
+ return { fetch: remoteFetch, get state() {
7567
+ return state;
7568
+ }, close: () => socket.close() };
7569
+ }
7570
+
7571
+ // ../editor-core/dist/server/chunk-7GX6XNCW.js
7472
7572
  import { Agent, fetch as nodeFetch } from "undici";
7473
7573
  function createDispatcher(timeoutMs) {
7474
7574
  return new Agent({ headersTimeout: timeoutMs, bodyTimeout: timeoutMs });
@@ -7544,6 +7644,7 @@ var RETRYABLE_TRANSPORT_CODES = /* @__PURE__ */ new Set([
7544
7644
  var TRANSPORT_RETRY_DELAY_MS = 400;
7545
7645
  var EditorClient = class {
7546
7646
  baseUrl;
7647
+ fetchOverride;
7547
7648
  /**
7548
7649
  * The running game's debug plane — see {@link GameDebugDoor}. It rides the
7549
7650
  * SAME `/__editor/command` relay every other method here uses (relay cases
@@ -7573,7 +7674,7 @@ var EditorClient = class {
7573
7674
  );
7574
7675
  }
7575
7676
  const unknownOptions = Object.keys(opts ?? {}).filter(
7576
- (key) => key !== "url" && key !== "onEnvelope" && key !== "transport"
7677
+ (key) => key !== "url" && key !== "onEnvelope" && key !== "transport" && key !== "fetch"
7577
7678
  );
7578
7679
  if (unknownOptions.length > 0) {
7579
7680
  throw new Error(
@@ -7581,6 +7682,7 @@ var EditorClient = class {
7581
7682
  );
7582
7683
  }
7583
7684
  this.baseUrl = (opts?.url ?? DEFAULT_URL).replace(/\/$/, "");
7685
+ this.fetchOverride = opts?.fetch;
7584
7686
  this.onEnvelope = opts?.onEnvelope ?? null;
7585
7687
  this.transport = opts?.transport ?? null;
7586
7688
  this.game = {
@@ -7629,7 +7731,7 @@ var EditorClient = class {
7629
7731
  signal: AbortSignal.timeout(deadlineMs)
7630
7732
  };
7631
7733
  commandDispatcher = deadlineMs > UNDICI_DEFAULT_HEADERS_TIMEOUT_MS ? createDispatcher(deadlineMs + 3e4) : void 0;
7632
- res = await dispatchFetch(url, init, commandDispatcher);
7734
+ res = this.fetchOverride ? await this.fetchOverride(url, init) : await dispatchFetch(url, init, commandDispatcher);
7633
7735
  break;
7634
7736
  } catch (error) {
7635
7737
  await commandDispatcher?.destroy?.();
@@ -7644,7 +7746,7 @@ var EditorClient = class {
7644
7746
  const { code, detail } = describeFetchFailure(error);
7645
7747
  if (options?.retryTransport === true && !retried && RETRYABLE_TRANSPORT_CODES.has(code)) {
7646
7748
  retried = true;
7647
- await new Promise((resolve12) => setTimeout(resolve12, TRANSPORT_RETRY_DELAY_MS));
7749
+ await new Promise((resolve13) => setTimeout(resolve13, TRANSPORT_RETRY_DELAY_MS));
7648
7750
  continue;
7649
7751
  }
7650
7752
  throw new EditorCommandError(
@@ -8540,7 +8642,7 @@ var EditorClient = class {
8540
8642
  */
8541
8643
  async httpFetch(url, init, dispatcher) {
8542
8644
  try {
8543
- return await dispatchFetch(url, init, dispatcher);
8645
+ return this.fetchOverride ? await this.fetchOverride(url, init) : await dispatchFetch(url, init, dispatcher);
8544
8646
  } catch (error) {
8545
8647
  if (error?.name === "TimeoutError") throw error;
8546
8648
  const { code, detail } = describeFetchFailure(error);
@@ -8734,7 +8836,85 @@ function relayCommandTimeoutMs(type) {
8734
8836
  return isRelayCommandType(type) ? RELAY_COMMANDS[type].timeoutMs : DEFAULT_RELAY_COMMAND_TIMEOUT_MS;
8735
8837
  }
8736
8838
 
8737
- // ../editor-core/dist/server/launcher/control.js
8839
+ // ../editor-core/dist/server/chunk-TMIV3AST.js
8840
+ import { spawn as spawn3 } from "node:child_process";
8841
+ var OPENER_STDERR_CAP_BYTES = 2048;
8842
+ var OPENER_EXIT_WATCH_TIMEOUT_MS = 2e4;
8843
+ function spawnOpener(cmd, cmdArgs, fallback) {
8844
+ let child;
8845
+ try {
8846
+ child = spawn3(cmd, cmdArgs, { stdio: ["ignore", "ignore", "pipe"], detached: true });
8847
+ } catch (err) {
8848
+ console.error(`volter: auto-open via ${cmd} failed: ${err.message}`);
8849
+ fallback?.();
8850
+ return;
8851
+ }
8852
+ const stderrChunks = [];
8853
+ let stderrBytes = 0;
8854
+ child.stderr?.on("data", (chunk) => {
8855
+ if (stderrBytes >= OPENER_STDERR_CAP_BYTES) return;
8856
+ const remaining = OPENER_STDERR_CAP_BYTES - stderrBytes;
8857
+ const slice = chunk.length > remaining ? chunk.subarray(0, remaining) : chunk;
8858
+ stderrChunks.push(slice);
8859
+ stderrBytes += slice.length;
8860
+ });
8861
+ child.on("error", (err) => {
8862
+ console.error(`volter: auto-open via ${cmd} failed to launch: ${err.message}`);
8863
+ fallback?.();
8864
+ });
8865
+ child.on("exit", (code) => {
8866
+ if (code !== null && code !== 0) {
8867
+ const stderr = Buffer.concat(stderrChunks).toString("utf8").trim();
8868
+ console.error(`volter: auto-open via ${cmd} exited ${code}: ${stderr}`);
8869
+ fallback?.();
8870
+ }
8871
+ });
8872
+ child.unref();
8873
+ const pipeTimeout = setTimeout(() => {
8874
+ child.stderr?.destroy();
8875
+ }, OPENER_EXIT_WATCH_TIMEOUT_MS);
8876
+ pipeTimeout.unref();
8877
+ }
8878
+
8879
+ // ../editor-core/dist/server/chunk-VIML3FNI.js
8880
+ import { existsSync as existsSync7, readFileSync as readFileSync8 } from "node:fs";
8881
+ function isWSL() {
8882
+ if (process.platform !== "linux") return false;
8883
+ try {
8884
+ return readFileSync8("/proc/version", "utf8").toLowerCase().includes("microsoft");
8885
+ } catch {
8886
+ return false;
8887
+ }
8888
+ }
8889
+ function openBrowserUrl(browserUrl, options) {
8890
+ if (process.platform === "darwin") {
8891
+ spawnOpener("open", options?.background === true ? ["-g", browserUrl] : [browserUrl]);
8892
+ } else if (process.platform === "win32") {
8893
+ spawnOpener("cmd", ["/c", "start", "", browserUrl]);
8894
+ } else if (isWSL()) {
8895
+ const interop = process.env["WSL_INTEROP"];
8896
+ if (interop && !existsSync7(interop)) {
8897
+ console.error(
8898
+ `[volter-editor] cannot open a browser from this shell \u2014 the WSL interop socket (${interop}) is gone, so Windows executables cannot launch. Open ${browserUrl} from any regular terminal or browser instead.`
8899
+ );
8900
+ return;
8901
+ }
8902
+ spawnOpener(
8903
+ "explorer.exe",
8904
+ [browserUrl],
8905
+ () => spawnOpener("powershell.exe", ["-NoProfile", "-Command", `Start-Process '${browserUrl}'`])
8906
+ );
8907
+ } else {
8908
+ spawnOpener("xdg-open", [browserUrl]);
8909
+ }
8910
+ }
8911
+
8912
+ // ../editor-core/dist/server/chunk-2HZZ3DF7.js
8913
+ import { createHash as createHash4 } from "node:crypto";
8914
+ import { mkdirSync as mkdirSync7, readFileSync as readFileSync9, writeFileSync as writeFileSync7, rmSync as rmSync4, existsSync as existsSync8 } from "node:fs";
8915
+ import { homedir as homedir4 } from "node:os";
8916
+ import { dirname as dirname6, join as join9, resolve as resolve8 } from "node:path";
8917
+ import { LiveEditor, LiveTools } from "@volter/editor-live";
8738
8918
  import { connect, unconnectedBindings } from "@volter/editor-live";
8739
8919
  var NOISE = /* @__PURE__ */ new Set(["constructor", "then", "catch", "finally"]);
8740
8920
  var FUNCTION_NOISE = /* @__PURE__ */ new Set(["length", "name", "prototype", "arguments", "caller"]);
@@ -8837,14 +9017,14 @@ var TOOL_CONTRIBUTION_SUFFIXES = [
8837
9017
  ".service"
8838
9018
  ];
8839
9019
  var CONTROLLER_DISCONNECTED_MESSAGE = "The editor tab controlling this command disconnected before reporting a result.";
8840
- async function control(command, verb, argument, reason, scope) {
9020
+ async function control(command, verb, argument, reason, scope, attachment) {
8841
9021
  if (verb === "eval" && argument === "--list") {
8842
9022
  const unconnected = { ...unconnectedBindings(), session: { port: 0, projectRoot: process.cwd() } };
8843
9023
  console.log(formatSurface(command, { ...unconnected, ...scope?.(unconnected) }));
8844
9024
  return;
8845
9025
  }
8846
- const live = await connect();
8847
- const client = new EditorClient({ url: `http://127.0.0.1:${live.session.port}` });
9026
+ const live = attachment?.live ?? await connect();
9027
+ const client = attachment?.client ?? new EditorClient({ url: `http://127.0.0.1:${live.session.port}` });
8848
9028
  if (verb === "close") {
8849
9029
  const session = (await verifiedSessions(live.session.port)).find((s) => s.port === live.session.port && s.project === live.session.projectRoot && s.registered);
8850
9030
  if (!session?.pid) throw new Error("Cannot close a session without verified process ownership.");
@@ -8889,13 +9069,97 @@ async function control(command, verb, argument, reason, scope) {
8889
9069
  process.exitCode = 1;
8890
9070
  }
8891
9071
  }
9072
+ var HOSTED_USAGE = "hosted attach <https-url> | hosted status | hosted eval <JavaScript> | hosted screenshot <file.png> | hosted detach";
9073
+ function stateFile() {
9074
+ const key = createHash4("sha256").update(resolve8(process.cwd())).digest("hex");
9075
+ return join9(homedir4(), ".local", "state", "volter-editor", "hosted", `${key}.json`);
9076
+ }
9077
+ async function hostedControl(command, args) {
9078
+ const [verb, argument] = args;
9079
+ if (args.length > (verb === "attach" || verb === "eval" || verb === "screenshot" ? 2 : 1)) throw new Error(HOSTED_USAGE);
9080
+ const file = stateFile();
9081
+ if (verb === "attach") {
9082
+ if (!argument) throw new Error(HOSTED_USAGE);
9083
+ if (existsSync8(file)) throw new Error("This directory already has a hosted attachment. Use hosted status or hosted detach; attaching never opens a duplicate tab.");
9084
+ const page = new URL(argument);
9085
+ if (page.username || page.password || page.hash) throw new Error("Use the hosted page URL without credentials or a fragment.");
9086
+ hostedSocketUrl(page.href);
9087
+ const response = await fetch(new URL(HOSTED_ATTACHMENT_PATH, page), {
9088
+ method: "POST",
9089
+ headers: { "content-type": "application/json" },
9090
+ body: JSON.stringify({ page: page.href }),
9091
+ signal: AbortSignal.timeout(15e3),
9092
+ redirect: "error"
9093
+ });
9094
+ if (!response.ok) throw new Error(`Hosted attachment refused (${response.status}): ${(await response.text()).slice(0, 500)}`);
9095
+ const created = await response.json();
9096
+ if (created.page !== page.href || new URL(created.endpoint).origin !== page.origin || !/^[a-f0-9]{64}$/.test(created.clientToken) || !/^[a-f0-9]{64}$/.test(created.workerToken)) throw new Error("Invalid hosted attachment response.");
9097
+ const common = { id: created.id, endpoint: created.endpoint, page: created.page, expiresAt: created.expiresAt };
9098
+ mkdirSync7(dirname6(file), { recursive: true, mode: 448 });
9099
+ writeFileSync7(file, JSON.stringify({ ...common, token: created.clientToken }), { mode: 384, flag: "wx" });
9100
+ page.hash = new URLSearchParams({ [HOSTED_ATTACHMENT_FRAGMENT]: JSON.stringify({ ...common, token: created.workerToken }) }).toString();
9101
+ openBrowserUrl(page.href, { background: true });
9102
+ console.log(`Opening hosted editor: ${created.page}
9103
+ Use ${command} hosted status from this directory. Attachment expires ${new Date(created.expiresAt).toISOString()}.`);
9104
+ return;
9105
+ }
9106
+ if (!["status", "eval", "screenshot", "detach"].includes(verb ?? "")) throw new Error(HOSTED_USAGE);
9107
+ let attachment;
9108
+ try {
9109
+ attachment = JSON.parse(readFileSync9(file, "utf8"));
9110
+ } catch {
9111
+ throw new Error(`No hosted attachment in this directory. Run ${command} hosted attach <https-url>.`);
9112
+ }
9113
+ if (verb === "detach") {
9114
+ const socket = new WebSocket(hostedSocketUrl(attachment.endpoint));
9115
+ await new Promise((done) => {
9116
+ const timer = setTimeout(() => {
9117
+ socket.close();
9118
+ done();
9119
+ }, 5e3);
9120
+ socket.addEventListener("open", () => socket.send(JSON.stringify({ type: "auth", role: "client", token: attachment.token })));
9121
+ socket.addEventListener("message", (event) => {
9122
+ if (JSON.parse(String(event.data)).type === "ready") socket.send(JSON.stringify({ type: "revoke" }));
9123
+ });
9124
+ socket.addEventListener("close", () => {
9125
+ clearTimeout(timer);
9126
+ done();
9127
+ });
9128
+ socket.addEventListener("error", () => {
9129
+ clearTimeout(timer);
9130
+ done();
9131
+ });
9132
+ });
9133
+ rmSync4(file);
9134
+ console.log("Hosted attachment removed. The browser document is preserved.");
9135
+ return;
9136
+ }
9137
+ const remote = await connectHostedAttachment(attachment);
9138
+ try {
9139
+ if (verb === "status" && remote.state["phase"] !== "ready") {
9140
+ console.log(JSON.stringify(remote.state, null, 2));
9141
+ return;
9142
+ }
9143
+ const client = new EditorClient({ url: "http://127.0.0.1", fetch: remote.fetch });
9144
+ const live = { editor: new LiveEditor(client), tools: new LiveTools(client), session: { port: 0, projectRoot: attachment.page } };
9145
+ if (verb === "screenshot") {
9146
+ if (!argument?.endsWith(".png")) throw new Error("hosted screenshot requires an output .png path.");
9147
+ const shot = await live.editor.screenshot();
9148
+ if (shot.mimeType !== "image/png") throw new Error("Editor did not return a PNG viewport.");
9149
+ writeFileSync7(resolve8(argument), Buffer.from(shot.base64, "base64"));
9150
+ console.log(resolve8(argument));
9151
+ } else await control(command, verb, argument, void 0, void 0, { live, client });
9152
+ } finally {
9153
+ remote.close();
9154
+ }
9155
+ }
8892
9156
 
8893
9157
  // ../editor-core/dist/server/launcher/session-verbs.js
8894
- import { existsSync as existsSync7, mkdirSync as mkdirSync7, readFileSync as readFileSync8, statSync as statSync4, writeFileSync as writeFileSync7 } from "node:fs";
8895
- import { basename as basename3, dirname as dirname6, join as join23, resolve as resolve23 } from "node:path";
9158
+ import { existsSync as existsSync9, mkdirSync as mkdirSync8, readFileSync as readFileSync10, statSync as statSync4, writeFileSync as writeFileSync8 } from "node:fs";
9159
+ import { basename as basename3, dirname as dirname7, join as join23, resolve as resolve23 } from "node:path";
8896
9160
  import { setTimeout as delay2 } from "node:timers/promises";
8897
9161
  import { resolveSession } from "@volter/editor-live";
8898
- import { isAbsolute as isAbsolute4, join as join9, relative as relative5, resolve as resolve8 } from "node:path";
9162
+ import { isAbsolute as isAbsolute4, join as join10, relative as relative5, resolve as resolve9 } from "node:path";
8899
9163
  var DEFAULT_RESTART_TIMINGS = {
8900
9164
  reachableBudgetMs: 15e3,
8901
9165
  probeIntervalMs: 250,
@@ -9046,9 +9310,9 @@ function classifyScreenshotTarget(target) {
9046
9310
  }
9047
9311
  function resolveModelTarget(target, options) {
9048
9312
  const { cwd, projectRoot, exists } = options;
9049
- const candidates = [resolve8(cwd, target)];
9313
+ const candidates = [resolve9(cwd, target)];
9050
9314
  if (target.startsWith("/") && projectRoot) {
9051
- candidates.push(join9(projectRoot, target), join9(projectRoot, "public", target));
9315
+ candidates.push(join10(projectRoot, target), join10(projectRoot, "public", target));
9052
9316
  }
9053
9317
  const file = candidates.find((candidate) => exists(candidate));
9054
9318
  if (file === void 0) {
@@ -9278,7 +9542,7 @@ async function screenshot(target, options) {
9278
9542
  const resolved = resolveModelTarget(classified.path, {
9279
9543
  cwd: process.cwd(),
9280
9544
  projectRoot: session.projectRoot,
9281
- exists: (path) => existsSync7(path) && statSync4(path).isFile()
9545
+ exists: (path) => existsSync9(path) && statSync4(path).isFile()
9282
9546
  });
9283
9547
  if ("error" in resolved) throw new Error(resolved.error);
9284
9548
  await assertUnambiguousTarget(session.client, classified.path, resolved.file);
@@ -9288,7 +9552,7 @@ async function screenshot(target, options) {
9288
9552
  return moduleLook(session.client, session.projectRoot, classified.path, flags);
9289
9553
  case "entity": {
9290
9554
  const asFile = resolve23(process.cwd(), classified.entityId);
9291
- if (existsSync7(asFile) && statSync4(asFile).isFile()) await assertUnambiguousTarget(session.client, classified.entityId, asFile);
9555
+ if (existsSync9(asFile) && statSync4(asFile).isFile()) await assertUnambiguousTarget(session.client, classified.entityId, asFile);
9292
9556
  const resolved = resolveEntityTarget(classified.entityId, await liveEntityRows(session.client));
9293
9557
  if ("error" in resolved) throw new Error(resolved.error);
9294
9558
  return assetLabLook(session.client, { entityId: resolved.entityId }, flags, screenshotPath(session.projectRoot, resolved.entityId), "scene");
@@ -9308,8 +9572,8 @@ async function sessionLook(client, projectRoot) {
9308
9572
  capture2 = await client.captureGame({ refreshStarvedFrame: true });
9309
9573
  loopRecoveryFrame = true;
9310
9574
  }
9311
- mkdirSync7(dirname6(outPath), { recursive: true });
9312
- writeFileSync7(outPath, Buffer.from(capture2.base64, "base64"));
9575
+ mkdirSync8(dirname7(outPath), { recursive: true });
9576
+ writeFileSync8(outPath, Buffer.from(capture2.base64, "base64"));
9313
9577
  console.log(outPath);
9314
9578
  if (capture2.flatness?.degenerate === true && capture2.flatness.warning !== void 0) console.error(`warning \u2014 ${capture2.flatness.warning}`);
9315
9579
  if (loopRecoveryFrame || capture2.loopRecoveryFrame === true) {
@@ -9320,8 +9584,8 @@ async function sessionLook(client, projectRoot) {
9320
9584
  return;
9321
9585
  }
9322
9586
  const capture = await client.captureActiveDocument();
9323
- mkdirSync7(dirname6(outPath), { recursive: true });
9324
- writeFileSync7(outPath, Buffer.from(capture.base64, "base64"));
9587
+ mkdirSync8(dirname7(outPath), { recursive: true });
9588
+ writeFileSync8(outPath, Buffer.from(capture.base64, "base64"));
9325
9589
  console.log(outPath);
9326
9590
  console.error(`${capture.document.title} (${capture.document.kind}${capture.document.sourcePath ? `, ${capture.document.sourcePath}` : ""}) \u2014 ${capture.source}`);
9327
9591
  }
@@ -9342,10 +9606,10 @@ async function assetLabLook(client, source, flags, outputDirectory, defaultStage
9342
9606
  ...flags.width === void 0 ? {} : { width: flags.width },
9343
9607
  ...flags.height === void 0 ? {} : { height: flags.height }
9344
9608
  };
9345
- mkdirSync7(outputDirectory, { recursive: true });
9609
+ mkdirSync8(outputDirectory, { recursive: true });
9346
9610
  if (flags.compare !== void 0) {
9347
9611
  if (flags.shots !== void 0) throw new Error("--compare cannot be combined with --shots");
9348
- const refBytes = readFileSync8(resolve23(flags.compare));
9612
+ const refBytes = readFileSync10(resolve23(flags.compare));
9349
9613
  const maxRefBytes = 32 * 1024 * 1024;
9350
9614
  if (refBytes.byteLength > maxRefBytes) throw new Error(`--compare reference GLB must be ${maxRefBytes / 1024 / 1024} MiB or less.`);
9351
9615
  const capture2 = await client.captureAssetComparePreview(source, refBytes.toString("base64"), dimensions);
@@ -9353,7 +9617,7 @@ async function assetLabLook(client, source, flags, outputDirectory, defaultStage
9353
9617
  for (const view of capture2.views) {
9354
9618
  iou[view.view] = view.iou;
9355
9619
  for (const [suffix, image] of [["overlay", view.overlay], ["asset", view.asset], ["ref", view.ref]]) {
9356
- writeFileSync7(join23(outputDirectory, `compare-${view.view}-${suffix}.png`), Buffer.from(image.base64, "base64"));
9620
+ writeFileSync8(join23(outputDirectory, `compare-${view.view}-${suffix}.png`), Buffer.from(image.base64, "base64"));
9357
9621
  }
9358
9622
  }
9359
9623
  console.log(JSON.stringify({ compare: { iou } }));
@@ -9373,18 +9637,18 @@ async function assetLabLook(client, source, flags, outputDirectory, defaultStage
9373
9637
  const warnings = new Map((capture2.warnings ?? []).map((warning) => [warning.label, warning]));
9374
9638
  for (const image of capture2.shots) {
9375
9639
  const file = join23(outputDirectory, `${image.label}.png`);
9376
- writeFileSync7(file, Buffer.from(image.base64, "base64"));
9640
+ writeFileSync8(file, Buffer.from(image.base64, "base64"));
9377
9641
  const warning = warnings.get(image.label);
9378
9642
  if (warning) console.warn(`WARNING ${file}: ${warning.message}`);
9379
9643
  }
9380
- writeFileSync7(join23(outputDirectory, "contact-sheet.png"), Buffer.from(capture2.contactSheet.base64, "base64"));
9644
+ writeFileSync8(join23(outputDirectory, "contact-sheet.png"), Buffer.from(capture2.contactSheet.base64, "base64"));
9381
9645
  const empty = capture2.warnings?.length ?? 0;
9382
9646
  console.log(`Shot set '${flags.shots}' preview (${capture2.shots.length} shots${empty > 0 ? `, ${empty} EMPTY \u2014 see the warnings above` : ""}) written to ${outputDirectory}`);
9383
9647
  return;
9384
9648
  }
9385
9649
  const capture = await client.captureAssetPreview(source, { ...dimensions, ...defaultStage === void 0 ? {} : { stage: defaultStage } });
9386
- for (const image of capture.views) writeFileSync7(join23(outputDirectory, `${image.view}.png`), Buffer.from(image.base64, "base64"));
9387
- writeFileSync7(join23(outputDirectory, "contact-sheet.png"), Buffer.from(capture.contactSheet.base64, "base64"));
9650
+ for (const image of capture.views) writeFileSync8(join23(outputDirectory, `${image.view}.png`), Buffer.from(image.base64, "base64"));
9651
+ writeFileSync8(join23(outputDirectory, "contact-sheet.png"), Buffer.from(capture.contactSheet.base64, "base64"));
9388
9652
  console.log(`${join23(outputDirectory, "contact-sheet.png")} \u2190 every view on one sheet`);
9389
9653
  console.log(` per-view frames beside it: ${capture.views.map((image) => `${image.view}.png`).join(" ")}`);
9390
9654
  if (capture.orientation && capture.orientation.yawDegrees !== 0) {
@@ -9443,21 +9707,21 @@ async function moduleLook(client, projectRoot, modulePath, flags) {
9443
9707
 
9444
9708
  // node/capabilities.ts
9445
9709
  import { execFileSync as execFileSync5 } from "node:child_process";
9446
- import { existsSync as existsSync8 } from "node:fs";
9447
- import { join as join10, resolve as resolve9 } from "node:path";
9710
+ import { existsSync as existsSync10 } from "node:fs";
9711
+ import { join as join11, resolve as resolve10 } from "node:path";
9448
9712
  import { findProjectRootFrom } from "@volter/editor-live";
9449
9713
  var CAPABILITY_OPTIONS = {
9450
9714
  project: { type: "string" },
9451
9715
  "dry-run": { type: "boolean" },
9452
9716
  json: { type: "boolean" }
9453
9717
  };
9454
- var catalogDir = join10(productRoot, "catalog");
9718
+ var catalogDir = join11(productRoot, "catalog");
9455
9719
  function runCapabilityCommand(verb, ids, options) {
9456
9720
  const dryRun = options["dry-run"] === true;
9457
9721
  const json = options.json === true;
9458
9722
  const log = console.log;
9459
9723
  const emit = (value) => log(JSON.stringify(value, null, 2));
9460
- const projectDir = findProjectRootFrom(resolve9(options.project ?? process.cwd()));
9724
+ const projectDir = findProjectRootFrom(resolve10(options.project ?? process.cwd()));
9461
9725
  const catalog = readCatalog(catalogDir);
9462
9726
  if (verb === "add" && ids.length === 0) {
9463
9727
  const installed = new Set(projectDir ? readCatalogStatus(projectDir, catalogDir).installed : []);
@@ -9528,7 +9792,7 @@ Use \`git diff\` to see your changes, then port what you want from the new versi
9528
9792
  resolveDependencySpec: (name, spec) => checkoutPackageSpec(name, monoRoot) ?? spec,
9529
9793
  installDependencies: (dependencyNames) => {
9530
9794
  if (usesRuntimeImage(projectDir)) {
9531
- const missing = dependencyNames.filter((name) => !existsSync8(join10(projectDir, "node_modules", ...name.split("/"), "package.json")));
9795
+ const missing = dependencyNames.filter((name) => !existsSync10(join11(projectDir, "node_modules", ...name.split("/"), "package.json")));
9532
9796
  if (missing.length > 0) throw new Error(`The runtime image lacks ${missing.join(", ")}; this capability needs a game that installs its own dependencies.`);
9533
9797
  return;
9534
9798
  }
@@ -9569,24 +9833,24 @@ ${report.writtenFiles.map((path) => ` ${path}`).join("\n")}`);
9569
9833
  import { execFileSync as execFileSync6 } from "node:child_process";
9570
9834
  import {
9571
9835
  createWriteStream as createWriteStream2,
9572
- existsSync as existsSync9,
9573
- mkdirSync as mkdirSync8,
9574
- readFileSync as readFileSync9,
9836
+ existsSync as existsSync11,
9837
+ mkdirSync as mkdirSync9,
9838
+ readFileSync as readFileSync11,
9575
9839
  renameSync as renameSync3,
9576
- rmSync as rmSync4,
9577
- writeFileSync as writeFileSync8
9840
+ rmSync as rmSync5,
9841
+ writeFileSync as writeFileSync9
9578
9842
  } from "node:fs";
9579
- import { homedir as homedir4 } from "node:os";
9580
- import { isAbsolute as isAbsolute5, join as join11, resolve as resolve10 } from "node:path";
9843
+ import { homedir as homedir5 } from "node:os";
9844
+ import { isAbsolute as isAbsolute5, join as join12, resolve as resolve11 } from "node:path";
9581
9845
  var WORKBENCH_LOCATOR_PATH2 = ".volter/workbench.json";
9582
9846
  var RELEASE_RECORD2 = "BUILD.json";
9583
- var SOURCES_LAUNCHER2 = join11("scripts", "code-server.sh");
9847
+ var SOURCES_LAUNCHER2 = join12("scripts", "code-server.sh");
9584
9848
  var OVERLAY_RECORD2 = ".volter-overlay.json";
9585
9849
  function writeWorkbenchDeclaration2(projectRoot, workbenchDir) {
9586
- mkdirSync8(join11(projectRoot, ".volter"), { recursive: true });
9587
- writeFileSync8(
9588
- join11(projectRoot, WORKBENCH_LOCATOR_PATH2),
9589
- `${JSON.stringify({ workbench: resolve10(workbenchDir) }, null, 2)}
9850
+ mkdirSync9(join12(projectRoot, ".volter"), { recursive: true });
9851
+ writeFileSync9(
9852
+ join12(projectRoot, WORKBENCH_LOCATOR_PATH2),
9853
+ `${JSON.stringify({ workbench: resolve11(workbenchDir) }, null, 2)}
9590
9854
  `
9591
9855
  );
9592
9856
  }
@@ -9594,8 +9858,8 @@ function machinePlatform2() {
9594
9858
  return `${process.platform}-${process.arch}`;
9595
9859
  }
9596
9860
  function resolveWorkbench2(dir, expectedProduct) {
9597
- const root = resolve10(dir);
9598
- const resolved = existsSync9(join11(root, RELEASE_RECORD2)) ? resolveRelease2(root) : existsSync9(join11(root, SOURCES_LAUNCHER2)) ? resolveSources2(root) : null;
9861
+ const root = resolve11(dir);
9862
+ const resolved = existsSync11(join12(root, RELEASE_RECORD2)) ? resolveRelease2(root) : existsSync11(join12(root, SOURCES_LAUNCHER2)) ? resolveSources2(root) : null;
9599
9863
  if (resolved === null) {
9600
9864
  throw new Error(
9601
9865
  `${root} is neither a Code-OSS release nor a fork checkout: it carries no ${RELEASE_RECORD2} (the record scripts/workbench/build-release.mjs writes beside its tarball) and no ${SOURCES_LAUNCHER2}. Name the directory the release was extracted into, or the fork checkout itself.`
@@ -9611,11 +9875,11 @@ function resolveWorkbench2(dir, expectedProduct) {
9611
9875
  return resolved;
9612
9876
  }
9613
9877
  function resolveRelease2(dir) {
9614
- const record = join11(dir, RELEASE_RECORD2);
9878
+ const record = join12(dir, RELEASE_RECORD2);
9615
9879
  const cut = `node scripts/workbench/build-release.mjs --product <id> --platform ${machinePlatform2()} --checkout <fork dir> --out ${dir}`;
9616
9880
  let parsed;
9617
9881
  try {
9618
- parsed = JSON.parse(readFileSync9(record, "utf8"));
9882
+ parsed = JSON.parse(readFileSync11(record, "utf8"));
9619
9883
  } catch (error) {
9620
9884
  throw new Error(`${record} could not be read: ${String(error)}`);
9621
9885
  }
@@ -9639,13 +9903,13 @@ function resolveRelease2(dir) {
9639
9903
  node scripts/workbench/build-release.mjs --product ${product} --platform ${machine} --checkout <fork dir>`
9640
9904
  );
9641
9905
  }
9642
- const packageRoot = join11(dir, target);
9643
- const serverBinPath = join11(packageRoot, serverBin);
9644
- if (!existsSync9(serverBinPath)) {
9906
+ const packageRoot = join12(dir, target);
9907
+ const serverBinPath = join12(packageRoot, serverBin);
9908
+ if (!existsSync11(serverBinPath)) {
9645
9909
  const tarball = typeof parsed["tarball"] === "string" ? parsed["tarball"] : `${target}-<commit>.tar.gz`;
9646
9910
  throw new Error(
9647
9911
  `${dir} records ${target}, but ${serverBinPath} is not there \u2014 the tarball has not been extracted beside ${RELEASE_RECORD2}. Run:
9648
- tar -xzf ${join11(dir, tarball)} -C ${dir}`
9912
+ tar -xzf ${join12(dir, tarball)} -C ${dir}`
9649
9913
  );
9650
9914
  }
9651
9915
  return { kind: "release", dir, commit, product, serverBin: serverBinPath, cwd: packageRoot };
@@ -9659,8 +9923,8 @@ function resolveSources2(dir) {
9659
9923
  `${dir} carries ${SOURCES_LAUNCHER2}, so it reads as a Code-OSS fork checkout, but \`git rev-parse HEAD\` there failed (${error instanceof Error ? error.message : String(error)}). A checkout's commit is the only record of which fork this workbench is.`
9660
9924
  );
9661
9925
  }
9662
- const marker = join11(dir, OVERLAY_RECORD2);
9663
- if (!existsSync9(marker)) {
9926
+ const marker = join12(dir, OVERLAY_RECORD2);
9927
+ if (!existsSync11(marker)) {
9664
9928
  throw new Error(
9665
9929
  `${dir} is a Code-OSS checkout with no volter overlay: ${OVERLAY_RECORD2} is not there, so nothing of the editor is compiled into it and the workbench would come up as plain Code-OSS. Overlay and compile it:
9666
9930
  node scripts/workbench/dev.mjs --checkout ${dir} --product <model-editor|game-editor>`
@@ -9668,7 +9932,7 @@ function resolveSources2(dir) {
9668
9932
  }
9669
9933
  let product;
9670
9934
  try {
9671
- product = JSON.parse(readFileSync9(marker, "utf8"))["product"];
9935
+ product = JSON.parse(readFileSync11(marker, "utf8"))["product"];
9672
9936
  } catch (error) {
9673
9937
  throw new Error(`${marker} could not be read: ${String(error)}`);
9674
9938
  }
@@ -9682,11 +9946,11 @@ function resolveSources2(dir) {
9682
9946
  dir,
9683
9947
  commit,
9684
9948
  product,
9685
- serverBin: join11(dir, SOURCES_LAUNCHER2),
9949
+ serverBin: join12(dir, SOURCES_LAUNCHER2),
9686
9950
  cwd: dir
9687
9951
  };
9688
9952
  }
9689
- var WORKBENCH_CACHE_ROOT2 = join11(homedir4(), ".volter", "workbenches");
9953
+ var WORKBENCH_CACHE_ROOT2 = join12(homedir5(), ".volter", "workbenches");
9690
9954
 
9691
9955
  // node/cli.ts
9692
9956
  var PRODUCT3 = { packageName: package_default.name, id: "game-editor", displayName: package_default.volter.product.displayName, command: Object.keys(package_default.bin)[0] };
@@ -9730,15 +9994,18 @@ try {
9730
9994
  volter-game-editor eval <JavaScript> | --list # { editor, game, page, tools, session } in scope
9731
9995
  volter-game-editor play | stop | restart
9732
9996
  volter-game-editor ${SCREENSHOT_USAGE}
9997
+ volter-game-editor ${HOSTED_USAGE}
9733
9998
  volter-game-editor sessions | project | projects
9734
9999
  volter-game-editor open <path>
9735
10000
  volter-game-editor add [id...] | remove <id...> | outdated [--project <path>] [--dry-run] [--json]
9736
10001
  volter-game-editor blender-mcp # stdio MCP transport to Blender in the editor`);
10002
+ } else if (verb === "hosted") {
10003
+ await hostedControl(PRODUCT3.command, positionals.slice(1));
9737
10004
  } else if (verb === "blender-mcp") {
9738
10005
  if (positionals.length !== 1) throw new Error("Usage: volter-game-editor blender-mcp");
9739
- let project = resolve11(process.cwd());
10006
+ let project = resolve12(process.cwd());
9740
10007
  while (!hasManifest(project)) {
9741
- const parent = dirname8(project);
10008
+ const parent = dirname9(project);
9742
10009
  if (parent === project) throw new Error("Run volter-game-editor blender-mcp inside a game project.");
9743
10010
  project = parent;
9744
10011
  }
@@ -9751,7 +10018,7 @@ try {
9751
10018
  } catch {
9752
10019
  }
9753
10020
  await new Promise((done, fail2) => {
9754
- const child = spawn3(process.execPath, [fileURLToPath2(import.meta.url), "edit", project], {
10021
+ const child = spawn4(process.execPath, [fileURLToPath2(import.meta.url), "edit", project], {
9755
10022
  cwd: project,
9756
10023
  stdio: ["ignore", 2, 2],
9757
10024
  env: process.env
@@ -9802,14 +10069,14 @@ try {
9802
10069
  if (!isScaffoldAddition(value)) throw new Error(`--with must name additions from: ${SCAFFOLD_ADDITIONS.join(", ")} \u2014 got "${value}"`);
9803
10070
  additions.push(value);
9804
10071
  }
9805
- if (values.workbench) resolveWorkbench2(resolve11(values.workbench), PRODUCT3.id);
10072
+ if (values.workbench) resolveWorkbench2(resolve12(values.workbench), PRODUCT3.id);
9806
10073
  await createGameProject({
9807
10074
  name: folder.split(/[\\/]/).at(-1),
9808
- targetDir: resolve11(folder),
10075
+ targetDir: resolve12(folder),
9809
10076
  additions,
9810
10077
  ...values.template === void 0 ? {} : { template: values.template }
9811
10078
  });
9812
- if (values.workbench) writeWorkbenchDeclaration2(resolve11(folder), resolve11(values.workbench));
10079
+ if (values.workbench) writeWorkbenchDeclaration2(resolve12(folder), resolve12(values.workbench));
9813
10080
  }
9814
10081
  await launch(folder, PRODUCT3, {
9815
10082
  ...values.workbench ? { workbench: values.workbench } : {},