@volter/game-editor 0.5.112 → 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 (299) 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 +2148 -2148
  5. package/dist/assets/{AssetBudgetPanel-CS7ZI_fl.js → AssetBudgetPanel-C2cPjuBg.js} +3 -3
  6. package/dist/assets/{AudioViewer-CY9_Kan-.js → AudioViewer-Bpo_jpIi.js} +1 -1
  7. package/dist/assets/{CanvasBoardDocument-BjZoTK6D.js → CanvasBoardDocument-DwBIeMZ4.js} +1 -1
  8. package/dist/assets/{CanvasSceneViewport-DeR3_1AA.js → CanvasSceneViewport-BNdmWk-Z.js} +1 -1
  9. package/dist/assets/{ColorInput-cUgzv-Yb.js → ColorInput-BDfmeGV7.js} +1 -1
  10. package/dist/assets/{ColorPicker-t_gPuWp3.js → ColorPicker-CirredSr.js} +1 -1
  11. package/dist/assets/{EntityModelDocument-DD20VRB1.js → EntityModelDocument-CVSuhql6.js} +1 -1
  12. package/dist/assets/{EnvironmentAssetDocument-DPP31WlD.js → EnvironmentAssetDocument-zoSJqmVn.js} +1 -1
  13. package/dist/assets/{GameplaySessionTimeline-B7GUZ-hT.js → GameplaySessionTimeline-CXuEu0EC.js} +1 -1
  14. package/dist/assets/{ImageViewer-DoGiU35U.js → ImageViewer-BlwxCH_J.js} +1 -1
  15. package/dist/assets/InspectorObjectPreview-BIP7icp4.js +1 -0
  16. package/dist/assets/{JsonAssetDocument-D60ZsaMt.js → JsonAssetDocument-Bca1OEvU.js} +1 -1
  17. package/dist/assets/{LiveModuleDocument-DgATfffN.js → LiveModuleDocument-BKw3vGr0.js} +1 -1
  18. package/dist/assets/{LutAssetDocument-TqkOwza4.js → LutAssetDocument-Cg-37y7Y.js} +1 -1
  19. package/dist/assets/{ModelAssetDocument-CQYaSgxx.js → ModelAssetDocument-DMj74VoY.js} +1 -1
  20. package/dist/assets/{NonThreeAuthoringBootstrap-C_-L79eQ.js → NonThreeAuthoringBootstrap-CTZ5QGOi.js} +1 -1
  21. package/dist/assets/{Object3DDocumentToolbar-qIMDecnO.js → Object3DDocumentToolbar-YqAXNX73.js} +1 -1
  22. package/dist/assets/Object3DDocumentViewport-BAFF8tXA.js +2 -0
  23. package/dist/assets/{Object3DPreview-CZgMSJQY.js → Object3DPreview-DhldNd5m.js} +1 -1
  24. package/dist/assets/{OnlineAssetDetail-ZHJxugJF.js → OnlineAssetDetail-ClT4eFxW.js} +1 -1
  25. package/dist/assets/{PlayBar-DHlWPuDt.js → PlayBar-Siahnvsw.js} +1 -1
  26. package/dist/assets/{QuarksAssetDocument-DYhJk658.js → QuarksAssetDocument-BCJCpXzv.js} +1 -1
  27. package/dist/assets/{ReactCanvasControls-Ce-agzJD.js → ReactCanvasControls-C2Dg7PAS.js} +1 -1
  28. package/dist/assets/{RootSelectionOverlay-D3xZf8h-.js → RootSelectionOverlay-B76QTxXQ.js} +1 -1
  29. package/dist/assets/{ShaderAssetDocument-DEs2FP13.js → ShaderAssetDocument-BC_bMDIb.js} +1 -1
  30. package/dist/assets/{ShadowEditor-DlOYuGTo.js → ShadowEditor-BmMIsUKh.js} +1 -1
  31. package/dist/assets/{SourceAssetViewer-Du1oHWvc.js → SourceAssetViewer-Cq0O9fPd.js} +1 -1
  32. package/dist/assets/{StageHost-CUd0YsCX.js → StageHost-DL-rn1xw.js} +2 -2
  33. package/dist/assets/{StoryPreviewMount-DP-ZfmY0.js → StoryPreviewMount-Bb6bAFFD.js} +1 -1
  34. package/dist/assets/{ThreeBoardDocument-9PCg7zJ6.js → ThreeBoardDocument-DVKtb195.js} +2 -2
  35. package/dist/assets/{ThreeIsolationSceneContent-B-SvHGhu.js → ThreeIsolationSceneContent-Cgn5gNZK.js} +1 -1
  36. package/dist/assets/{ToolObject3DPreview-C34aT5oQ.js → ToolObject3DPreview-CC6zmX0_.js} +1 -1
  37. package/dist/assets/{Toolbar-BpZsr2pY.js → Toolbar-CtuKETND.js} +1 -1
  38. package/dist/assets/{TransientHint-CUErZ8FD.js → TransientHint-BznxmBhK.js} +1 -1
  39. package/dist/assets/{VideoViewer-DzzNCYKb.js → VideoViewer-Bf8CFBye.js} +1 -1
  40. package/dist/assets/{ViewportShadingMenu-X3qf9Hi-.js → ViewportShadingMenu-CHI1Ybps.js} +1 -1
  41. package/dist/assets/{active-ingest-DF5-9w3C.js → active-ingest-CdkBLhUn.js} +2 -2
  42. package/dist/assets/{animation-clock-BKPEWto9.js → animation-clock-iXNr3pAB.js} +1 -1
  43. package/dist/assets/{animation-mixers.service-CVTFDk6U.js → animation-mixers.service-44VFyY6S.js} +1 -1
  44. package/dist/assets/{animation-timeline.utility-YBGv194P.js → animation-timeline.utility-Dc7J3kL7.js} +1 -1
  45. package/dist/assets/{asset-budget-asset.menu-CczhHlQi.js → asset-budget-asset.menu-2A17aYDp.js} +1 -1
  46. package/dist/assets/{asset-budget.action-CSVqpVst.js → asset-budget.action-D5zTxlwK.js} +1 -1
  47. package/dist/assets/{asset-budget.document-IGdh6nQk.js → asset-budget.document-BnfZWG-Z.js} +1 -1
  48. package/dist/assets/{asset-budget.menu-kCjwqAsZ.js → asset-budget.menu-B80Zj_Gc.js} +1 -1
  49. package/dist/assets/{asset-editor-persistence-Ci4EpN5C.js → asset-editor-persistence-CDltpHCs.js} +1 -1
  50. package/dist/assets/{asset-loaders-C6ObO9GN.js → asset-loaders-CNaS8TZG.js} +1 -1
  51. package/dist/assets/{asset-preview-OCdcmead.js → asset-preview-DJuOkxhj.js} +1 -1
  52. package/dist/assets/{audio-unlock.service-BuHPJHzd.js → audio-unlock.service-BrBhpJMC.js} +1 -1
  53. package/dist/assets/{audio.utility-BnRaN02j.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-2CpWwj18.js → babylon-authoring-adapter-vZdL2Gto.js} +1 -1
  56. package/dist/assets/{binding-resolver-sJUPnlmt.js → binding-resolver-OJ_J6yIE.js} +2 -2
  57. package/dist/assets/blender-emscripten-engine-CRz1C2s0.js +2 -0
  58. package/dist/assets/{blender-node-editor.document-BzxU2yPF.js → blender-node-editor.document-BDczfFxt.js} +1 -1
  59. package/dist/assets/{blender-properties-tab-DqwlnB4h.js → blender-properties-tab-CjgK0Bbk.js} +1 -1
  60. package/dist/assets/{blender-runtime-host-FT4zUerb.js → blender-runtime-host-Dlc9w0Zh.js} +2 -2
  61. package/dist/assets/{blender-runtime-skin-B9EzZYzy.js → blender-runtime-skin-D1UM12LE.js} +1 -1
  62. package/dist/assets/{blender-runtime.document-DGyaIS95.js → blender-runtime.document-CCV5Y9OE.js} +1 -1
  63. package/dist/assets/{blender-screenshot.menu-CFSAUaXM.js → blender-screenshot.menu-C36rWtiC.js} +1 -1
  64. package/dist/assets/{blender-timeline.document-BRwMmxud.js → blender-timeline.document-lk_PIJob.js} +1 -1
  65. package/dist/assets/{blender-uv-editor.document-DC6azebM.js → blender-uv-editor.document-CTmIU4Kh.js} +1 -1
  66. package/dist/assets/{blender-version.status-B_XeE25m.js → blender-version.status-DJlu7qr4.js} +1 -1
  67. package/dist/assets/{blender-wali-engine-BI5dGBuY.js → blender-wali-engine-BmVwcYs-.js} +1 -1
  68. package/dist/assets/{blender.command-B6Xsvgk-.js → blender.command-DzCCQQOZ.js} +1 -1
  69. package/dist/assets/{board-guides-DeE34w2f.js → board-guides-BlBRZmTQ.js} +1 -1
  70. package/dist/assets/{bridge.command-D1fDSd-y.js → bridge.command-ClY9S8Un.js} +3 -3
  71. package/dist/assets/{browserAll-CkIz4Usm.js → browserAll-Mv9lBgrZ.js} +1 -1
  72. package/dist/assets/{build-player.document-mhapyzFw.js → build-player.document-Cy7MEpas.js} +1 -1
  73. package/dist/assets/{build-profiles.document-C9tqgW2N.js → build-profiles.document-WaCFbiLP.js} +1 -1
  74. package/dist/assets/{build-progress.status-B-6wgBYl.js → build-progress.status-DTcmGi_P.js} +1 -1
  75. package/dist/assets/{build-session-zss_dsN6.js → build-session-DbpKkNJV.js} +1 -1
  76. package/dist/assets/{build.action-kn5_JNp6.js → build.action-C2j5_dxu.js} +1 -1
  77. package/dist/assets/{build.command-B-kLNXtL.js → build.command-DioIRVgu.js} +1 -1
  78. package/dist/assets/{build.header-z4kVTqas.js → build.header-BzewhRVE.js} +1 -1
  79. package/dist/assets/{build.menu-CAHSlu8I.js → build.menu-BzXblcjm.js} +1 -1
  80. package/dist/assets/{build.service-D78ycPY6.js → build.service-nY7pgo8P.js} +1 -1
  81. package/dist/assets/{camera-BFXEOyzN.js → camera-C4iahwRu.js} +1 -1
  82. package/dist/assets/{camera-runtime.inspector-vDtwgr9q.js → camera-runtime.inspector-0hl6Lpc7.js} +1 -1
  83. package/dist/assets/{canvas-design-mount-pYTxi6Tf.js → canvas-design-mount-ZR59B_S-.js} +3 -3
  84. package/dist/assets/{canvas-entry-runtime-BQ96Hfic.js → canvas-entry-runtime-DfwjEnac.js} +2 -2
  85. package/dist/assets/{canvas-preview-frames-DbRCTACs.js → canvas-preview-frames-BK9lbVhI.js} +1 -1
  86. package/dist/assets/{canvas-story-capture.service-DcUFRvDV.js → canvas-story-capture.service-BB37SSiy.js} +2 -2
  87. package/dist/assets/{capability-coverage-CIZYoMxx.js → capability-coverage-BbGACSQ7.js} +1 -1
  88. package/dist/assets/{collaboration-presence-DjXNSi22.js → collaboration-presence-Bsr8DNTC.js} +1 -1
  89. package/dist/assets/{collider-9ZEPrzF2.js → collider-CNgw-tJm.js} +1 -1
  90. package/dist/assets/{component-board.service-CaSa-D7M.js → component-board.service-ABJTCD9U.js} +2 -2
  91. package/dist/assets/{component-board.service-B1OgIIgM.js → component-board.service-BkvLOF6E.js} +2 -2
  92. package/dist/assets/{component-board.service-Bro2VYuK.js → component-board.service-DrGTgtOW.js} +2 -2
  93. package/dist/assets/{component-contracts.service-C3HArGNL.js → component-contracts.service-AJNTJQUd.js} +1 -1
  94. package/dist/assets/{component-instance-root-CSxVbFxZ.js → component-instance-root-DSo9btvO.js} +1 -1
  95. package/dist/assets/{component-verbs.command-OLMgi8Wm.js → component-verbs.command-DAZikwtn.js} +1 -1
  96. package/dist/assets/{component-verbs.service-D0v3hXfp.js → component-verbs.service-CbmTNwUC.js} +1 -1
  97. package/dist/assets/{config-DrdlIQsH.js → config-ByW2y5rs.js} +2 -2
  98. package/dist/assets/{configurations-Jl5IODND.js → configurations-LzOt_ui9.js} +1 -1
  99. package/dist/assets/{connection.status-ykEJcQf4.js → connection.status-fh7qO4aP.js} +1 -1
  100. package/dist/assets/{constraints.inspector-DgjEYgnn.js → constraints.inspector-BILU-OeN.js} +1 -1
  101. package/dist/assets/{content-bounds-Bu-Q6apF.js → content-bounds-kt7VKpcn.js} +1 -1
  102. package/dist/assets/{contract-system-adapters-B6eqb9n_.js → contract-system-adapters-Cozx6nCn.js} +1 -1
  103. package/dist/assets/{coverage.service-CxeNaEHo.js → coverage.service-CswPRFnJ.js} +1 -1
  104. package/dist/assets/{create-runtime-CsLlOfpz.js → create-runtime-CNEjmtin.js} +1 -1
  105. package/dist/assets/{curve-BokfkJEd.js → curve-BKb_W-u_.js} +1 -1
  106. package/dist/assets/{data-asset-DFywc4eI.js → data-asset-C39Y1A_d.js} +1 -1
  107. package/dist/assets/{data-ref-C28YL2QH.js → data-ref-tKY-R3JG.js} +1 -1
  108. package/dist/assets/{debug-bridge-Clli9FXl.js → debug-bridge-CLBVU34P.js} +1 -1
  109. package/dist/assets/{debug-registry-qBwZnzAK.js → debug-registry-PtCg-gAQ.js} +1 -1
  110. package/dist/assets/{deferred-ingest-play-5TJ3EX3-.js → deferred-ingest-play-DlgkyiVk.js} +2 -2
  111. package/dist/assets/{design-time-canvas-mount-C-Sgmncv.js → design-time-canvas-mount-DlS15mlk.js} +2 -2
  112. package/dist/assets/{design-time-layers-3WbCfh8m.js → design-time-layers-BSk9iy6A.js} +1 -1
  113. package/dist/assets/{design-time-mount.service-BRSrgijn.js → design-time-mount.service-bV28BtPG.js} +2 -2
  114. package/dist/assets/{design-time-mount.service-Cqnd96xc.js → design-time-mount.service-yeuApmeU.js} +2 -2
  115. package/dist/assets/{design-time-react-mount-tfrs7iak.js → design-time-react-mount-7EgUpZDW.js} +1 -1
  116. package/dist/assets/{document-preview-three-Db6R6gQi.js → document-preview-three-DcVcoC1y.js} +1 -1
  117. package/dist/assets/{dom-authoring-adapter-DZzbuOO3.js → dom-authoring-adapter-Dnjvh9yG.js} +1 -1
  118. package/dist/assets/{draco3d-Czugbe_O.js → draco3d-3EapKinA.js} +1 -1
  119. package/dist/assets/{edit-mode-audio.service-BeqIdnXi.js → edit-mode-audio.service-ffiNgJwH.js} +1 -1
  120. package/dist/assets/{edit-mode-authoring-9JCc-tmi.js → edit-mode-authoring-BEqEkXIT.js} +1 -1
  121. package/dist/assets/{edit-mode-networking.service-Ce7-Dimc.js → edit-mode-networking.service-9uQLb9Fc.js} +1 -1
  122. package/dist/assets/{editor-api-DJHTUJU8.js → editor-api-TexfN2js.js} +1 -1
  123. package/dist/assets/{editor-layers-G1sSDqkZ.js → editor-layers-DB9_uFyw.js} +1 -1
  124. package/dist/assets/{editor-shell-store-COqthmhH.js → editor-shell-store-DAFZw7de.js} +1 -1
  125. package/dist/assets/{entity-object-NNBB_27h.js → entity-object-CG32Sh-D.js} +1 -1
  126. package/dist/assets/{extend-D1vXQ0I3.js → extend-BJCYmdCg.js} +1 -1
  127. package/dist/assets/{fork-menu-Cmvt4hG1.js → fork-menu-B0CAnsQ0.js} +1 -1
  128. package/dist/assets/{frame-debugger-store-BKPuWqqo.js → frame-debugger-store-DRPBji06.js} +1 -1
  129. package/dist/assets/{game-contract-seams-hCeLHp_F.js → game-contract-seams-D3jp9kfH.js} +1 -1
  130. package/dist/assets/{game-css-scope-transform-D5ZBSyAS.js → game-css-scope-transform-CNq9C0a8.js} +1 -1
  131. package/dist/assets/{game-document.service-CtaIz0B3.js → game-document.service-Ikp3u-8X.js} +1 -1
  132. package/dist/assets/{game-eval.command-BwnCBWgL.js → game-eval.command-DR0dtfPa.js} +1 -1
  133. package/dist/assets/{game-module-access-BaoHzqz9.js → game-module-access-DceYIduW.js} +1 -1
  134. package/dist/assets/{game-network-Wrv2_SU7.js → game-network-DOCCFwtp.js} +3 -3
  135. package/dist/assets/{gameplay-export-DJszZP0E.js → gameplay-export-BfVqSEgT.js} +1 -1
  136. package/dist/assets/{gameplay-replay-C2RzNnue.js → gameplay-replay-D9quLJQt.js} +1 -1
  137. package/dist/assets/{gameplay.command-DAYIk5M8.js → gameplay.command-CVuLo_kD.js} +1 -1
  138. package/dist/assets/{generation-jobs-DfQDSsoI.js → generation-jobs-dFYEPPwC.js} +1 -1
  139. package/dist/assets/{generation.service-D5QfoQ-i.js → generation.service-DtP2HZFd.js} +1 -1
  140. package/dist/assets/{generations-DEibFD1b.js → generations-BqaARHQz.js} +1 -1
  141. package/dist/assets/{generations.status-BK-TCO78.js → generations.status-DpyocrDb.js} +1 -1
  142. package/dist/assets/{hierarchy-marks-h4VpO3kJ.js → hierarchy-marks-Ducimsnh.js} +1 -1
  143. package/dist/assets/{hosted-asset-materialization-DBuwc0IQ.js → hosted-asset-materialization-CibGdw61.js} +1 -1
  144. package/dist/assets/{index-DM2Q_NCo.js → index-4Vg6KHJs.js} +1 -1
  145. package/dist/assets/{index-ND4SO5al.js → index-BMshF0VP.js} +1 -1
  146. package/dist/assets/{index-BTWJgxhy.js → index-BaM5nplw.js} +1 -1
  147. package/dist/assets/{index-DrdQBy-G.js → index-CKoL9Z8h.js} +1 -1
  148. package/dist/assets/{index-BtHKXtaM.js → index-Cs_hnykK.js} +8 -8
  149. package/dist/assets/{index-MT_--_xJ.js → index-CyN2UjMe.js} +1 -1
  150. package/dist/assets/{index-DE_7syhj.js → index-DMA-GnGs.js} +1 -1
  151. package/dist/assets/{index-gAgw9-nn.js → index-Df0th-r3.js} +1 -1
  152. package/dist/assets/{index-Csfe5jM_.js → index-M1-SoN0U.js} +2 -2
  153. package/dist/assets/{inference-diagnostics-BQL1PsrA.js → inference-diagnostics-aOHTUQ5I.js} +1 -1
  154. package/dist/assets/{ingest-boot-viewport-PiZJrSff.js → ingest-boot-viewport-J9SqqmBi.js} +1 -1
  155. package/dist/assets/{ingest-siblings-CBFovixA.js → ingest-siblings-DI-4N8EJ.js} +1 -1
  156. package/dist/assets/{ingest-source-persistence-PtmAk0XP.js → ingest-source-persistence-BlQ86Ezy.js} +1 -1
  157. package/dist/assets/{ingest.service-Dj7vHa0S.js → ingest.service-DGJl6Kg1.js} +1 -1
  158. package/dist/assets/{inspect-5CiZi9Fe.js → inspect-CSzAyD3t.js} +1 -1
  159. package/dist/assets/instances.command-DCKGMDy5.js +1 -0
  160. package/dist/assets/{json-history-resource-DVZTZBEI.js → json-history-resource-C5lzztrI.js} +1 -1
  161. package/dist/assets/{layered-pick-D16c7649.js → layered-pick-Da3YPGWE.js} +1 -1
  162. package/dist/assets/{light-RLn_u9nj.js → light-D9BNM9LO.js} +1 -1
  163. package/dist/assets/{live-project-verbs-DAqM2TEV.js → live-project-verbs-CeLmddwY.js} +1 -1
  164. package/dist/assets/{machine.document-1Pyec5Pa.js → machine.document-D9RIS2J1.js} +1 -1
  165. package/dist/assets/{machines.finder-AR1csJ4o.js → machines.finder-B_-K7mbg.js} +1 -1
  166. package/dist/assets/{material-CbAhx7b0.js → material-Di4_5UR9.js} +1 -1
  167. package/dist/assets/{material-factory-_2cVLgWp.js → material-factory-Cdk5ozUy.js} +1 -1
  168. package/dist/assets/{mesh-BsIfE30r.js → mesh-B3l7POsp.js} +1 -1
  169. package/dist/assets/{model-asset-sections.service-y4vzx4AO.js → model-asset-sections.service-wBLLtK1P.js} +1 -1
  170. package/dist/assets/{model-inspection-CF65KROh.js → model-inspection-QwuuTlfj.js} +1 -1
  171. package/dist/assets/{model-thumbnail-DrTWM9U2.js → model-thumbnail-BXNwjwVQ.js} +1 -1
  172. package/dist/assets/{models.finder-BcSV8mtS.js → models.finder-BlvEy8zN.js} +1 -1
  173. package/dist/assets/{module-mode-_u8oyIyA.js → module-mode-DJJCSruV.js} +2 -2
  174. package/dist/assets/{mount-canvas-ingest-root-C_aM-VbZ.js → mount-canvas-ingest-root-BKB4WIx_.js} +2 -2
  175. package/dist/assets/{mount-dom-ingest-root-CgUdURHO.js → mount-dom-ingest-root-PRkBWUWu.js} +2 -2
  176. package/dist/assets/{mount-ingest-root-eVQIQKsK.js → mount-ingest-root-CQLOfg6j.js} +2 -2
  177. package/dist/assets/{mount-manifest-CX_NmRV8.js → mount-manifest-GP2eO4t9.js} +1 -1
  178. package/dist/assets/{mount-three-ingest-root-DAiKCFQL.js → mount-three-ingest-root-T3wn7mca.js} +1 -1
  179. package/dist/assets/{mounted-authoring-BS6EFeEC.js → mounted-authoring-Db9gY4N3.js} +1 -1
  180. package/dist/assets/{mounted-story-viewport-source-DyODLBUp.js → mounted-story-viewport-source-C9HGOm_J.js} +1 -1
  181. package/dist/assets/{native-debug-module-n6JKSj78.js → native-debug-module-QRchsh2v.js} +1 -1
  182. package/dist/assets/{navigation-CTPtBc3X.js → navigation-C-8TPzHJ.js} +1 -1
  183. package/dist/assets/{navmesh.menu-B9usrrET.js → navmesh.menu-D0aY0A-x.js} +1 -1
  184. package/dist/assets/{navmesh.service-CFVngRKP.js → navmesh.service-CZ7uSgkz.js} +1 -1
  185. package/dist/assets/network-observer.service-CD9z9tBp.js +1 -0
  186. package/dist/assets/{network.utility-CEVHCC-T.js → network.utility-BOHNhfSD.js} +1 -1
  187. package/dist/assets/{object3d-document-session-registry-BD9lZKTC.js → object3d-document-session-registry-PE-4fjz1.js} +2 -2
  188. package/dist/assets/{oid-transform-ChoYb7se.js → oid-transform-B32kPrkS.js} +1 -1
  189. package/dist/assets/{particles-D1k_uYOX.js → particles-DkCd4wzc.js} +1 -1
  190. package/dist/assets/{pixi-authoring-adapter-Bcr97UEH.js → pixi-authoring-adapter-Cz6GKyRX.js} +1 -1
  191. package/dist/assets/{pixi-live-write-target-C4pMf1zd.js → pixi-live-write-target-Dvo0ZrpJ.js} +1 -1
  192. package/dist/assets/{play.command-CBDjMxJA.js → play.command-jRmgmt62.js} +2 -2
  193. package/dist/assets/{presentation-B__NA0OV.js → presentation-BWLM0Zst.js} +1 -1
  194. package/dist/assets/{product-DqjQLeDp.js → product-NPUDoYQp.js} +1 -1
  195. package/dist/assets/{profiler.action-Bn_bRMzI.js → profiler.action-BdEeMmlP.js} +1 -1
  196. package/dist/assets/{profiler.menu-D32ofOXP.js → profiler.menu-DmaIMEQp.js} +1 -1
  197. package/dist/assets/{profiler.utility-CcVo_nj3.js → profiler.utility-BqCXFtf4.js} +1 -1
  198. package/dist/assets/{project-authoring-session-Ii_9aeKq.js → project-authoring-session-DWdfTjb4.js} +2 -2
  199. package/dist/assets/{properties-bone-constraints.inspector-BwLwy_UY.js → properties-bone-constraints.inspector-Do18oyXm.js} +1 -1
  200. package/dist/assets/{properties-bone.inspector-CBEwOhSA.js → properties-bone.inspector-DHRW9Zdy.js} +1 -1
  201. package/dist/assets/{properties-collection.inspector-Wahf0FZg.js → properties-collection.inspector-B_ZqDhIB.js} +1 -1
  202. package/dist/assets/{properties-constraints.inspector-DqMhNk_O.js → properties-constraints.inspector-DGUezsPF.js} +1 -1
  203. package/dist/assets/{properties-data.inspector-NVNCDhx-.js → properties-data.inspector-DW6_t8_e.js} +1 -1
  204. package/dist/assets/{properties-material.inspector-JfwRrUdy.js → properties-material.inspector-CjK7oKK4.js} +1 -1
  205. package/dist/assets/{properties-modifiers.inspector-Tk3IilPm.js → properties-modifiers.inspector-BzIR7FjM.js} +1 -1
  206. package/dist/assets/{properties-object.inspector-Cw4CUuAF.js → properties-object.inspector-3fsVkAFS.js} +1 -1
  207. package/dist/assets/{properties-output.inspector-C_wjNYov.js → properties-output.inspector-D1zWlLWX.js} +1 -1
  208. package/dist/assets/{properties-particles.inspector-Buo2ZpHN.js → properties-particles.inspector-CwNWZhyR.js} +1 -1
  209. package/dist/assets/{properties-physics.inspector-ByZi8Or5.js → properties-physics.inspector-BnmFQq_i.js} +1 -1
  210. package/dist/assets/{properties-render.inspector-BDfZbd_W.js → properties-render.inspector-Di2qTS4q.js} +1 -1
  211. package/dist/assets/{properties-scene.inspector-BPxDKg8t.js → properties-scene.inspector-1UZaXfw2.js} +1 -1
  212. package/dist/assets/{properties-texture.inspector-CZinkXCt.js → properties-texture.inspector-BaV5U-Qu.js} +1 -1
  213. package/dist/assets/{properties-view-layer.inspector-edNGGTIE.js → properties-view-layer.inspector-DxW9C8im.js} +1 -1
  214. package/dist/assets/{properties-world.inspector-tybDOQ6m.js → properties-world.inspector-Cb8cuI2F.js} +1 -1
  215. package/dist/assets/{r3f-design-session-DWqMahmm.js → r3f-design-session-kg4aFo9v.js} +2 -2
  216. package/dist/assets/{r3f-physics-binding-DJWWVb2L.js → r3f-physics-binding-C37YJGMW.js} +1 -1
  217. package/dist/assets/{r3f-source-authoring-adapter-DvsbKTqD.js → r3f-source-authoring-adapter-ZKBMZbYR.js} +1 -1
  218. package/dist/assets/{react-canvas-navigation-Ci7wZxOU.js → react-canvas-navigation-DgndsFAo.js} +1 -1
  219. package/dist/assets/{react-inspector.service-vd4Nv39L.js → react-inspector.service-9bE0o_8D.js} +1 -1
  220. package/dist/assets/{react-story-board-D5JuJe6T.js → react-story-board-CCITskgO.js} +1 -1
  221. package/dist/assets/{react-three-rapier.esm-C07hrtTz.js → react-three-rapier.esm-CIOYSgKg.js} +1 -1
  222. package/dist/assets/{react-world-authoring-adapter--B_eNa53.js → react-world-authoring-adapter-DK4jMqyN.js} +1 -1
  223. package/dist/assets/{realm-services-BufVaH0e.js → realm-services-BAZP9e8H.js} +1 -1
  224. package/dist/assets/{reflection-probe-capture.inspector-CrcJgFmm.js → reflection-probe-capture.inspector-BOCEOfun.js} +1 -1
  225. package/dist/assets/{registry-n6zpDtMt.js → registry-PeJ-uX3W.js} +1 -1
  226. package/dist/assets/{relative-import-specifier-DeO_c8Rd.js → relative-import-specifier-BfGfJFJZ.js} +1 -1
  227. package/dist/assets/{render-env-DPBJB_Zs.js → render-env-ChDPR7QW.js} +1 -1
  228. package/dist/assets/{render-features-OSq2gvE-.js → render-features-BIgyjcOC.js} +1 -1
  229. package/dist/assets/{render-settings-DI6s6dkY.js → render-settings-C7hqpFnK.js} +1 -1
  230. package/dist/assets/{resolve-three-aaZ0_3_R.js → resolve-three-Dpd-fg3k.js} +3 -3
  231. package/dist/assets/{root-seam-contract-DetyPFnV.js → root-seam-contract-Crgu32u5.js} +1 -1
  232. package/dist/assets/{run-selection-Du9C46du.js → run-selection-xpSMOXG0.js} +1 -1
  233. package/dist/assets/{scene-capture-R9tSJXya.js → scene-capture-D1sFvwyj.js} +1 -1
  234. package/dist/assets/{scene-document.service-DOepV8nF.js → scene-document.service-BM50fy1J.js} +2 -2
  235. package/dist/assets/{scene-framing-DF5fdjup.js → scene-framing-BX1UTrnD.js} +1 -1
  236. package/dist/assets/{seeded-random-ClUBbE4z.js → seeded-random-C85bEVkS.js} +1 -1
  237. package/dist/assets/{setup-renderer-e3Gw3GCt.js → setup-renderer-DcKuhISr.js} +1 -1
  238. package/dist/assets/{source-object3d-authoring-adapter-C-ZF3osD.js → source-object3d-authoring-adapter-h3b7vPiK.js} +1 -1
  239. package/dist/assets/{source-persistence-backend-CgzJz-Nd.js → source-persistence-backend-DgTsuLXb.js} +1 -1
  240. package/dist/assets/{stage-keyboard-BeVDWo3u.js → stage-keyboard-BI4HOf1S.js} +1 -1
  241. package/dist/assets/{stage-overlay-set-CN_VJVOD.js → stage-overlay-set-Cssqqj_A.js} +1 -1
  242. package/dist/assets/{stage-presence-markers-D3YOz3QD.js → stage-presence-markers-7odF6Jqg.js} +1 -1
  243. package/dist/assets/{stage-transform-tools-i3abixoE.js → stage-transform-tools-CtyYmuLT.js} +1 -1
  244. package/dist/assets/{standard-viewport-dressing-g7JaXFSz.js → standard-viewport-dressing-C0D_Lkzi.js} +1 -1
  245. package/dist/assets/{state-watch.action-CMNQTE_k.js → state-watch.action-BjfXq_IH.js} +1 -1
  246. package/dist/assets/{state-watch.menu-mDeNuWPA.js → state-watch.menu-BRJo7Z-c.js} +1 -1
  247. package/dist/assets/{state-watch.utility-D3ffYxH0.js → state-watch.utility-D_swl2pz.js} +1 -1
  248. package/dist/assets/{story-capture-A7ucdmi7.js → story-capture-CMY7BKUL.js} +1 -1
  249. package/dist/assets/{story-documents-CpHqzA2E.js → story-documents-BwW_Ypnc.js} +1 -1
  250. package/dist/assets/{story-documents.service-DUzmFkmA.js → story-documents.service-B6YGoAas.js} +1 -1
  251. package/dist/assets/{story-documents.service-Bx3MD6eL.js → story-documents.service-DpNKV5ve.js} +1 -1
  252. package/dist/assets/{story-media-presence-C95sCmez.js → story-media-presence-DgTM3l4X.js} +1 -1
  253. package/dist/assets/{story-pixi-preview-DbFtKMCD.js → story-pixi-preview-anB4NVfT.js} +1 -1
  254. package/dist/assets/{story-presentation-DYqHAZtU.js → story-presentation-Cm5Vl6Oh.js} +1 -1
  255. package/dist/assets/{story-three-preview-CjX3xQGB.js → story-three-preview-BOD7-hxP.js} +2 -2
  256. package/dist/assets/{studio-environment-CGs1x_nY.js → studio-environment-Bg-I7fM-.js} +1 -1
  257. package/dist/assets/{surface-state-JGVYDKMD.js → surface-state-DUwBtx3k.js} +1 -1
  258. package/dist/assets/{syntactic-prop-specs-BdiNUmPv.js → syntactic-prop-specs-Bmxu19np.js} +1 -1
  259. package/dist/assets/{team-playtest.service-DInVIyoo.js → team-playtest.service-CGh7mX2E.js} +1 -1
  260. package/dist/assets/{three-CJS1cirl.js → three-CWmJa1qe.js} +1 -1
  261. package/dist/assets/{three-authoring-adapter-ByfM7SyY.js → three-authoring-adapter-CwQ2Hl3O.js} +1 -1
  262. package/dist/assets/three-authoring.service-CSdBG8i-.js +2 -0
  263. package/dist/assets/{three-ingest-runtime-DVG3znKA.js → three-ingest-runtime-Drh7DqsE.js} +1 -1
  264. package/dist/assets/{three-integration-DJnFy0Cl.js → three-integration-D9SLXYnU.js} +2 -2
  265. package/dist/assets/three-integration.service-W2S36XB9.js +1 -0
  266. package/dist/assets/{three-projection-core-CMkmMelq.js → three-projection-core-BxrVlHmD.js} +1 -1
  267. package/dist/assets/{three-state-DmHIPM-S.js → three-state-kIB-8XUB.js} +1 -1
  268. package/dist/assets/{three-story-capture.service-CZuvnzF1.js → three-story-capture.service-C8l6znQN.js} +2 -2
  269. package/dist/assets/{three-story-model-pj_bgW6q.js → three-story-model-DzqvFyFn.js} +1 -1
  270. package/dist/assets/{three-viewport-presentation-CpAAmxco.js → three-viewport-presentation-2yL9mtBn.js} +1 -1
  271. package/dist/assets/{transform-mode-request-BfzK1zvK.js → transform-mode-request-CwuDcUbZ.js} +1 -1
  272. package/dist/assets/{transport-strip-BwiOBZmO.js → transport-strip-BK2izTHN.js} +1 -1
  273. package/dist/assets/transport.header-BB3O8i1G.js +1 -0
  274. package/dist/assets/{tuples-BC2McJBb.js → tuples-DBc-K60w.js} +1 -1
  275. package/dist/assets/{ui-board-document-BJ1Jg2vO.js → ui-board-document-DM7FjXkv.js} +2 -2
  276. package/dist/assets/{user-data-Bs7kEKQL.js → user-data-B0afWRON.js} +1 -1
  277. package/dist/assets/{utility-view-state-DTBJVdax.js → utility-view-state-BqtZzIZO.js} +1 -1
  278. package/dist/assets/{viewport-door-BUBAxV2L.js → viewport-door-DXf2BTtM.js} +1 -1
  279. package/dist/assets/{viewport-root-presentation-BXafmwmW.js → viewport-root-presentation-DMXg0y2c.js} +1 -1
  280. package/dist/assets/{viewport-surface-status-BwUnSN5n.js → viewport-surface-status-Cb9tNbMn.js} +1 -1
  281. package/dist/assets/{webworkerAll-CHyvX6z5.js → webworkerAll-SNqnnw8n.js} +1 -1
  282. package/dist/assets/worker-BXLmYZTK.js +2 -0
  283. package/dist/assets/{workspace-arrangement-BvzC4AGK.js → workspace-arrangement-4Fa_8tpk.js} +1 -1
  284. package/dist/assets/{world-documents-DJBVXKeD.js → world-documents-D_jW5Rdo.js} +1 -1
  285. package/dist/assets/{world-root-stage-binding-BTcrTX0_.js → world-root-stage-binding-jICg_fta.js} +1 -1
  286. package/dist/assets/{xstate-animation-binding-LT8ofYof.js → xstate-animation-binding-D99r_COR.js} +1 -1
  287. package/dist/assets/{xstate-animation-meta-D22igH0b.js → xstate-animation-meta-DKGLnaIK.js} +1 -1
  288. package/dist-node/cli.js +367 -102
  289. package/package.json +16 -16
  290. package/dist/assets/InspectorObjectPreview-BQlnDG4E.js +0 -1
  291. package/dist/assets/Object3DDocumentViewport-DrDZRf2L.js +0 -2
  292. package/dist/assets/autoplay.service-CQlRBjxq.js +0 -1
  293. package/dist/assets/blender-emscripten-engine-DLuEIFE4.js +0 -2
  294. package/dist/assets/instances.command-CUn5hmvz.js +0 -1
  295. package/dist/assets/network-observer.service-B6NW-U1D.js +0 -1
  296. package/dist/assets/three-authoring.service-DVwuHTMg.js +0 -2
  297. package/dist/assets/three-integration.service-CJGC8wFY.js +0 -1
  298. package/dist/assets/transport.header-DvOge8Mb.js +0 -1
  299. package/dist/assets/worker-CQkYvnTL.js +0 -2
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);
@@ -1212,13 +1214,11 @@ var init_BUNDLE = __esm({
1212
1214
  "../blender-engine/wasm/BUNDLE.json"() {
1213
1215
  BUNDLE_default = {
1214
1216
  blender: "5.2.0 LTS",
1215
- source: "1b2547991d6841a6ea4c1394b8d648086b9af6c9",
1216
- reviewedSource: "1b2547991d6841a6ea4c1394b8d648086b9af6c9",
1217
+ source: "e5d7eec67572dfc7c73f8f4d3f601d03442546f9",
1218
+ reviewedSource: "e5d7eec67572dfc7c73f8f4d3f601d03442546f9",
1217
1219
  upstream: "fbe6228777e7d9afefcd61a413844e790ae75db7",
1218
1220
  sourceRepository: "https://github.com/volter-ai/blender",
1219
- sourceRecipe: "https://github.com/volter-ai/blender/blob/1b2547991d6841a6ea4c1394b8d648086b9af6c9/build_files/emscripten/RELEASE.md",
1220
- sourceRelease: "https://github.com/volter-ai/blender/releases/tag/blender-5.2.0-wasm.4",
1221
- verification: "https://github.com/volter-ai/blender/releases/download/blender-5.2.0-wasm.4/VERIFICATION.json",
1221
+ sourceRecipe: "https://github.com/volter-ai/blender/blob/e5d7eec67572dfc7c73f8f4d3f601d03442546f9/build_files/emscripten/RELEASE.md",
1222
1222
  factoryEngine: "BLENDER_EEVEE",
1223
1223
  files: {
1224
1224
  "blender_browser.js": "raw",
@@ -1231,8 +1231,8 @@ var init_BUNDLE = __esm({
1231
1231
  sha256: "0c63c29e7d4b1ba1fce4e94057778b0757767b25ea4f6f01d329e99351568f30"
1232
1232
  },
1233
1233
  "blender_browser.wasm": {
1234
- bytes: 86318165,
1235
- sha256: "722b181cec94f1bdf2f088e0ae92f04ffa5a79c267bf5b04af7260c16e34eb0f"
1234
+ bytes: 86317655,
1235
+ sha256: "0ba94ac8388de893bcec4da70516aea69128addaa490ef27f17ca06262ee6546"
1236
1236
  },
1237
1237
  "blender_browser.data": {
1238
1238
  bytes: 52698568,
@@ -1245,8 +1245,8 @@ var init_BUNDLE = __esm({
1245
1245
  sha256: "0c63c29e7d4b1ba1fce4e94057778b0757767b25ea4f6f01d329e99351568f30"
1246
1246
  },
1247
1247
  "blender_browser.wasm.br": {
1248
- bytes: 18597884,
1249
- sha256: "55ef6f9d63a4c8afa7e7aec4388d1f8c462f5294fcbba8bfbbabe5c41a13f8f9"
1248
+ bytes: 18596913,
1249
+ sha256: "64af23954e1911ffcb879f69a9e8c9bbd83b5531939b586228f44fcea8211e3b"
1250
1250
  },
1251
1251
  "blender_browser.data.br": {
1252
1252
  bytes: 8056563,
@@ -1257,10 +1257,10 @@ var init_BUNDLE = __esm({
1257
1257
  sha256: "4085e9336266cf66f061d4d5c962a5929cc96d5732c746b5c13ea05cd104a75b"
1258
1258
  }
1259
1259
  },
1260
- note: "Official Blender v5.2.0 plus our headless wasm changes and our existing export/session integration. Dependencies are rebuilt from pinned official sources. No third-party Blender port commits or build scripts are inputs. PROXY_TO_PTHREAD, WasmFS, 512 MiB initial / 4 GiB maximum memory, twelve-worker pool. Build information is disabled. The source release includes the exact source tree, materialized startup.blend, dependency archives, pure Python wheels, and notices.",
1260
+ note: "Unreleased Stoneguard candidate. Clean source build at the named commit; Release -O3 objects and -O2 link, Emscripten 6.0.5. Focused geometry regression matches shipped engine across original, vertex edit and subdivision-level edit. Full historical battery is absent from current editor checkout; no full-battery claim.",
1261
1261
  callTrampoline: "CPython 3.13.13 is compiled with PY_CALL_TRAMPOLINE for Blender CPython slot arity casts. This applies to CPython dispatch, not arbitrary indirect calls.",
1262
1262
  engineIds: "The existing session registers Python render engines under CYCLES, BLENDER_EEVEE and BLENDER_WORKBENCH; the headless build permits built-in IDs to be shadowed.",
1263
- exportDoor: "The source-owned bpy_web_export.cc exports Principled physical inputs, normal images, eight named UV layers and evaluated corner normals, and takes graph_materials/graph_images/graph_generated (a graph-drawn shader mix reduced to the one Principled BSDF it reaches, graph images at the door revisions with every UDIM tile, orco for deformed meshes whose graph reads Generated coordinates). A frame can defer its changed meshes and pictures (defer) for the caller to pull one at a time (export_mesh, export_image), each call freeing the previous one's columns and a picture it decoded; an undo step keeps the revisions when Blender kept the depsgraph (session_undo); Blender's CPU subdivision descriptor is released once a mesh is read; the memory door reports malloc in-use and free. Datablock revisions are keyed by session_uid. writefile.cc writes one copy of the document per save in the browser build.",
1263
+ exportDoor: "The source-owned bpy_web_export.cc exports Principled physical inputs, normal images, eight named UV layers and evaluated corner normals, and takes graph_materials/graph_images/graph_generated (a graph-drawn shader mix reduced to the one Principled BSDF it reaches, graph images at the door revisions with every UDIM tile, orco for deformed meshes whose graph reads Generated coordinates). A frame can defer its changed meshes and pictures (defer) for the caller to pull one at a time (export_mesh, export_image), each call freeing the previous one's columns and a picture it decoded; an undo step keeps the revisions when Blender kept the depsgraph (session_undo); Blender's CPU subdivision descriptor is released once a mesh is read; the memory door reports malloc in-use and free. Datablock revisions are keyed by session_uid. writefile.cc writes one copy of the document per save in the browser build. CPU evaluators adopt stencil tables without cloning; browser subdivision descriptors are released immediately after CPU tessellation/deformation.",
1264
1264
  preloadedPayload: "releasePreloadedFileData releases the JS preload buffer after session ready. The measured working payload exclusions are retained."
1265
1265
  };
1266
1266
  }
@@ -2014,8 +2014,8 @@ __export(blender_mcp_exports, {
2014
2014
  serveBlenderMcp: () => serveBlenderMcp
2015
2015
  });
2016
2016
  import { randomUUID } from "node:crypto";
2017
- import { mkdirSync as mkdirSync9, readFileSync as readFileSync10, writeFileSync as writeFileSync9 } from "node:fs";
2018
- 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";
2019
2019
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2020
2020
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2021
2021
  import {
@@ -2206,15 +2206,15 @@ var init_blender_mcp = __esm({
2206
2206
  const bytes = Buffer.from(await spooled.arrayBuffer());
2207
2207
  if (shipped === null) {
2208
2208
  try {
2209
- if (readFileSync10(entry.path).equals(bytes)) {
2209
+ if (readFileSync12(entry.path).equals(bytes)) {
2210
2210
  this.#seen.set(entry.path, stamp);
2211
2211
  continue;
2212
2212
  }
2213
2213
  } catch (error) {
2214
2214
  if (error.code !== "ENOENT") throw error;
2215
2215
  }
2216
- mkdirSync9(dirname7(entry.path), { recursive: true });
2217
- writeFileSync9(entry.path, bytes);
2216
+ mkdirSync10(dirname8(entry.path), { recursive: true });
2217
+ writeFileSync10(entry.path, bytes);
2218
2218
  } else {
2219
2219
  const query = new URLSearchParams({
2220
2220
  path: shipped,
@@ -2309,15 +2309,15 @@ var init_blender_mcp = __esm({
2309
2309
 
2310
2310
  // node/cli.ts
2311
2311
  import { parseArgs } from "node:util";
2312
- import { dirname as dirname8, resolve as resolve11 } from "node:path";
2313
- 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";
2314
2314
  import { fileURLToPath as fileURLToPath2 } from "node:url";
2315
2315
 
2316
2316
  // package.json
2317
2317
  var package_default = {
2318
2318
  name: "@volter/game-editor",
2319
2319
  author: "Volter AI, Inc.",
2320
- version: "0.5.112",
2320
+ version: "0.5.114",
2321
2321
  publishConfig: {
2322
2322
  access: "public"
2323
2323
  },
@@ -2366,22 +2366,22 @@ var package_default = {
2366
2366
  }
2367
2367
  },
2368
2368
  dependencies: {
2369
- "@volter/editor-core": "0.5.112",
2370
- "@volter/editor-game": "0.5.112",
2371
- "@volter/editor-react": "0.5.112",
2372
- "@volter/editor-threejs": "0.5.112",
2373
- "@volter/editor-xstate": "0.5.112",
2374
- "@volter/editor-blender": "0.1.52",
2375
- "@volter/dawproject": "0.5.112",
2376
- "@volter/editor-dawproject": "0.5.112",
2377
- "@volter/blender-engine": "0.1.50",
2378
- "@volter/editor-project": "0.5.112",
2379
- "@volter/editor-sdk": "0.5.112",
2380
- "@volter/editor-live": "0.5.112",
2381
- "@volter/game-live": "0.5.112",
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",
2382
2382
  "@modelcontextprotocol/sdk": "1.30.0",
2383
- "@volter/game-runtime": "0.5.112",
2384
- "@volter/threejs-runtime": "0.5.112",
2383
+ "@volter/game-runtime": "0.5.114",
2384
+ "@volter/threejs-runtime": "0.5.114",
2385
2385
  undici: "7.29.1",
2386
2386
  typescript: "5.9.3",
2387
2387
  "@colyseus/schema": "^4.0.14",
@@ -6600,7 +6600,7 @@ function killEditorSessionProcess(pid, signal = "SIGTERM") {
6600
6600
  async function waitForPidExit(pid, timeoutMs) {
6601
6601
  const deadline = Date.now() + timeoutMs;
6602
6602
  while (pidAlive(pid) && Date.now() < deadline) {
6603
- await new Promise((resolve12) => setTimeout(resolve12, 50));
6603
+ await new Promise((resolve13) => setTimeout(resolve13, 50));
6604
6604
  }
6605
6605
  return !pidAlive(pid);
6606
6606
  }
@@ -7470,7 +7470,105 @@ async function currentPageErrors(serverUrl) {
7470
7470
  }
7471
7471
  }
7472
7472
 
7473
- // ../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
7474
7572
  import { Agent, fetch as nodeFetch } from "undici";
7475
7573
  function createDispatcher(timeoutMs) {
7476
7574
  return new Agent({ headersTimeout: timeoutMs, bodyTimeout: timeoutMs });
@@ -7546,6 +7644,7 @@ var RETRYABLE_TRANSPORT_CODES = /* @__PURE__ */ new Set([
7546
7644
  var TRANSPORT_RETRY_DELAY_MS = 400;
7547
7645
  var EditorClient = class {
7548
7646
  baseUrl;
7647
+ fetchOverride;
7549
7648
  /**
7550
7649
  * The running game's debug plane — see {@link GameDebugDoor}. It rides the
7551
7650
  * SAME `/__editor/command` relay every other method here uses (relay cases
@@ -7575,7 +7674,7 @@ var EditorClient = class {
7575
7674
  );
7576
7675
  }
7577
7676
  const unknownOptions = Object.keys(opts ?? {}).filter(
7578
- (key) => key !== "url" && key !== "onEnvelope" && key !== "transport"
7677
+ (key) => key !== "url" && key !== "onEnvelope" && key !== "transport" && key !== "fetch"
7579
7678
  );
7580
7679
  if (unknownOptions.length > 0) {
7581
7680
  throw new Error(
@@ -7583,6 +7682,7 @@ var EditorClient = class {
7583
7682
  );
7584
7683
  }
7585
7684
  this.baseUrl = (opts?.url ?? DEFAULT_URL).replace(/\/$/, "");
7685
+ this.fetchOverride = opts?.fetch;
7586
7686
  this.onEnvelope = opts?.onEnvelope ?? null;
7587
7687
  this.transport = opts?.transport ?? null;
7588
7688
  this.game = {
@@ -7631,7 +7731,7 @@ var EditorClient = class {
7631
7731
  signal: AbortSignal.timeout(deadlineMs)
7632
7732
  };
7633
7733
  commandDispatcher = deadlineMs > UNDICI_DEFAULT_HEADERS_TIMEOUT_MS ? createDispatcher(deadlineMs + 3e4) : void 0;
7634
- res = await dispatchFetch(url, init, commandDispatcher);
7734
+ res = this.fetchOverride ? await this.fetchOverride(url, init) : await dispatchFetch(url, init, commandDispatcher);
7635
7735
  break;
7636
7736
  } catch (error) {
7637
7737
  await commandDispatcher?.destroy?.();
@@ -7646,7 +7746,7 @@ var EditorClient = class {
7646
7746
  const { code, detail } = describeFetchFailure(error);
7647
7747
  if (options?.retryTransport === true && !retried && RETRYABLE_TRANSPORT_CODES.has(code)) {
7648
7748
  retried = true;
7649
- await new Promise((resolve12) => setTimeout(resolve12, TRANSPORT_RETRY_DELAY_MS));
7749
+ await new Promise((resolve13) => setTimeout(resolve13, TRANSPORT_RETRY_DELAY_MS));
7650
7750
  continue;
7651
7751
  }
7652
7752
  throw new EditorCommandError(
@@ -8542,7 +8642,7 @@ var EditorClient = class {
8542
8642
  */
8543
8643
  async httpFetch(url, init, dispatcher) {
8544
8644
  try {
8545
- return await dispatchFetch(url, init, dispatcher);
8645
+ return this.fetchOverride ? await this.fetchOverride(url, init) : await dispatchFetch(url, init, dispatcher);
8546
8646
  } catch (error) {
8547
8647
  if (error?.name === "TimeoutError") throw error;
8548
8648
  const { code, detail } = describeFetchFailure(error);
@@ -8736,7 +8836,85 @@ function relayCommandTimeoutMs(type) {
8736
8836
  return isRelayCommandType(type) ? RELAY_COMMANDS[type].timeoutMs : DEFAULT_RELAY_COMMAND_TIMEOUT_MS;
8737
8837
  }
8738
8838
 
8739
- // ../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";
8740
8918
  import { connect, unconnectedBindings } from "@volter/editor-live";
8741
8919
  var NOISE = /* @__PURE__ */ new Set(["constructor", "then", "catch", "finally"]);
8742
8920
  var FUNCTION_NOISE = /* @__PURE__ */ new Set(["length", "name", "prototype", "arguments", "caller"]);
@@ -8839,14 +9017,14 @@ var TOOL_CONTRIBUTION_SUFFIXES = [
8839
9017
  ".service"
8840
9018
  ];
8841
9019
  var CONTROLLER_DISCONNECTED_MESSAGE = "The editor tab controlling this command disconnected before reporting a result.";
8842
- async function control(command, verb, argument, reason, scope) {
9020
+ async function control(command, verb, argument, reason, scope, attachment) {
8843
9021
  if (verb === "eval" && argument === "--list") {
8844
9022
  const unconnected = { ...unconnectedBindings(), session: { port: 0, projectRoot: process.cwd() } };
8845
9023
  console.log(formatSurface(command, { ...unconnected, ...scope?.(unconnected) }));
8846
9024
  return;
8847
9025
  }
8848
- const live = await connect();
8849
- 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}` });
8850
9028
  if (verb === "close") {
8851
9029
  const session = (await verifiedSessions(live.session.port)).find((s) => s.port === live.session.port && s.project === live.session.projectRoot && s.registered);
8852
9030
  if (!session?.pid) throw new Error("Cannot close a session without verified process ownership.");
@@ -8891,13 +9069,97 @@ async function control(command, verb, argument, reason, scope) {
8891
9069
  process.exitCode = 1;
8892
9070
  }
8893
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
+ }
8894
9156
 
8895
9157
  // ../editor-core/dist/server/launcher/session-verbs.js
8896
- import { existsSync as existsSync7, mkdirSync as mkdirSync7, readFileSync as readFileSync8, statSync as statSync4, writeFileSync as writeFileSync7 } from "node:fs";
8897
- 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";
8898
9160
  import { setTimeout as delay2 } from "node:timers/promises";
8899
9161
  import { resolveSession } from "@volter/editor-live";
8900
- 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";
8901
9163
  var DEFAULT_RESTART_TIMINGS = {
8902
9164
  reachableBudgetMs: 15e3,
8903
9165
  probeIntervalMs: 250,
@@ -9048,9 +9310,9 @@ function classifyScreenshotTarget(target) {
9048
9310
  }
9049
9311
  function resolveModelTarget(target, options) {
9050
9312
  const { cwd, projectRoot, exists } = options;
9051
- const candidates = [resolve8(cwd, target)];
9313
+ const candidates = [resolve9(cwd, target)];
9052
9314
  if (target.startsWith("/") && projectRoot) {
9053
- candidates.push(join9(projectRoot, target), join9(projectRoot, "public", target));
9315
+ candidates.push(join10(projectRoot, target), join10(projectRoot, "public", target));
9054
9316
  }
9055
9317
  const file = candidates.find((candidate) => exists(candidate));
9056
9318
  if (file === void 0) {
@@ -9280,7 +9542,7 @@ async function screenshot(target, options) {
9280
9542
  const resolved = resolveModelTarget(classified.path, {
9281
9543
  cwd: process.cwd(),
9282
9544
  projectRoot: session.projectRoot,
9283
- exists: (path) => existsSync7(path) && statSync4(path).isFile()
9545
+ exists: (path) => existsSync9(path) && statSync4(path).isFile()
9284
9546
  });
9285
9547
  if ("error" in resolved) throw new Error(resolved.error);
9286
9548
  await assertUnambiguousTarget(session.client, classified.path, resolved.file);
@@ -9290,7 +9552,7 @@ async function screenshot(target, options) {
9290
9552
  return moduleLook(session.client, session.projectRoot, classified.path, flags);
9291
9553
  case "entity": {
9292
9554
  const asFile = resolve23(process.cwd(), classified.entityId);
9293
- 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);
9294
9556
  const resolved = resolveEntityTarget(classified.entityId, await liveEntityRows(session.client));
9295
9557
  if ("error" in resolved) throw new Error(resolved.error);
9296
9558
  return assetLabLook(session.client, { entityId: resolved.entityId }, flags, screenshotPath(session.projectRoot, resolved.entityId), "scene");
@@ -9310,8 +9572,8 @@ async function sessionLook(client, projectRoot) {
9310
9572
  capture2 = await client.captureGame({ refreshStarvedFrame: true });
9311
9573
  loopRecoveryFrame = true;
9312
9574
  }
9313
- mkdirSync7(dirname6(outPath), { recursive: true });
9314
- writeFileSync7(outPath, Buffer.from(capture2.base64, "base64"));
9575
+ mkdirSync8(dirname7(outPath), { recursive: true });
9576
+ writeFileSync8(outPath, Buffer.from(capture2.base64, "base64"));
9315
9577
  console.log(outPath);
9316
9578
  if (capture2.flatness?.degenerate === true && capture2.flatness.warning !== void 0) console.error(`warning \u2014 ${capture2.flatness.warning}`);
9317
9579
  if (loopRecoveryFrame || capture2.loopRecoveryFrame === true) {
@@ -9322,8 +9584,8 @@ async function sessionLook(client, projectRoot) {
9322
9584
  return;
9323
9585
  }
9324
9586
  const capture = await client.captureActiveDocument();
9325
- mkdirSync7(dirname6(outPath), { recursive: true });
9326
- writeFileSync7(outPath, Buffer.from(capture.base64, "base64"));
9587
+ mkdirSync8(dirname7(outPath), { recursive: true });
9588
+ writeFileSync8(outPath, Buffer.from(capture.base64, "base64"));
9327
9589
  console.log(outPath);
9328
9590
  console.error(`${capture.document.title} (${capture.document.kind}${capture.document.sourcePath ? `, ${capture.document.sourcePath}` : ""}) \u2014 ${capture.source}`);
9329
9591
  }
@@ -9344,10 +9606,10 @@ async function assetLabLook(client, source, flags, outputDirectory, defaultStage
9344
9606
  ...flags.width === void 0 ? {} : { width: flags.width },
9345
9607
  ...flags.height === void 0 ? {} : { height: flags.height }
9346
9608
  };
9347
- mkdirSync7(outputDirectory, { recursive: true });
9609
+ mkdirSync8(outputDirectory, { recursive: true });
9348
9610
  if (flags.compare !== void 0) {
9349
9611
  if (flags.shots !== void 0) throw new Error("--compare cannot be combined with --shots");
9350
- const refBytes = readFileSync8(resolve23(flags.compare));
9612
+ const refBytes = readFileSync10(resolve23(flags.compare));
9351
9613
  const maxRefBytes = 32 * 1024 * 1024;
9352
9614
  if (refBytes.byteLength > maxRefBytes) throw new Error(`--compare reference GLB must be ${maxRefBytes / 1024 / 1024} MiB or less.`);
9353
9615
  const capture2 = await client.captureAssetComparePreview(source, refBytes.toString("base64"), dimensions);
@@ -9355,7 +9617,7 @@ async function assetLabLook(client, source, flags, outputDirectory, defaultStage
9355
9617
  for (const view of capture2.views) {
9356
9618
  iou[view.view] = view.iou;
9357
9619
  for (const [suffix, image] of [["overlay", view.overlay], ["asset", view.asset], ["ref", view.ref]]) {
9358
- 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"));
9359
9621
  }
9360
9622
  }
9361
9623
  console.log(JSON.stringify({ compare: { iou } }));
@@ -9375,18 +9637,18 @@ async function assetLabLook(client, source, flags, outputDirectory, defaultStage
9375
9637
  const warnings = new Map((capture2.warnings ?? []).map((warning) => [warning.label, warning]));
9376
9638
  for (const image of capture2.shots) {
9377
9639
  const file = join23(outputDirectory, `${image.label}.png`);
9378
- writeFileSync7(file, Buffer.from(image.base64, "base64"));
9640
+ writeFileSync8(file, Buffer.from(image.base64, "base64"));
9379
9641
  const warning = warnings.get(image.label);
9380
9642
  if (warning) console.warn(`WARNING ${file}: ${warning.message}`);
9381
9643
  }
9382
- 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"));
9383
9645
  const empty = capture2.warnings?.length ?? 0;
9384
9646
  console.log(`Shot set '${flags.shots}' preview (${capture2.shots.length} shots${empty > 0 ? `, ${empty} EMPTY \u2014 see the warnings above` : ""}) written to ${outputDirectory}`);
9385
9647
  return;
9386
9648
  }
9387
9649
  const capture = await client.captureAssetPreview(source, { ...dimensions, ...defaultStage === void 0 ? {} : { stage: defaultStage } });
9388
- for (const image of capture.views) writeFileSync7(join23(outputDirectory, `${image.view}.png`), Buffer.from(image.base64, "base64"));
9389
- 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"));
9390
9652
  console.log(`${join23(outputDirectory, "contact-sheet.png")} \u2190 every view on one sheet`);
9391
9653
  console.log(` per-view frames beside it: ${capture.views.map((image) => `${image.view}.png`).join(" ")}`);
9392
9654
  if (capture.orientation && capture.orientation.yawDegrees !== 0) {
@@ -9445,21 +9707,21 @@ async function moduleLook(client, projectRoot, modulePath, flags) {
9445
9707
 
9446
9708
  // node/capabilities.ts
9447
9709
  import { execFileSync as execFileSync5 } from "node:child_process";
9448
- import { existsSync as existsSync8 } from "node:fs";
9449
- 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";
9450
9712
  import { findProjectRootFrom } from "@volter/editor-live";
9451
9713
  var CAPABILITY_OPTIONS = {
9452
9714
  project: { type: "string" },
9453
9715
  "dry-run": { type: "boolean" },
9454
9716
  json: { type: "boolean" }
9455
9717
  };
9456
- var catalogDir = join10(productRoot, "catalog");
9718
+ var catalogDir = join11(productRoot, "catalog");
9457
9719
  function runCapabilityCommand(verb, ids, options) {
9458
9720
  const dryRun = options["dry-run"] === true;
9459
9721
  const json = options.json === true;
9460
9722
  const log = console.log;
9461
9723
  const emit = (value) => log(JSON.stringify(value, null, 2));
9462
- const projectDir = findProjectRootFrom(resolve9(options.project ?? process.cwd()));
9724
+ const projectDir = findProjectRootFrom(resolve10(options.project ?? process.cwd()));
9463
9725
  const catalog = readCatalog(catalogDir);
9464
9726
  if (verb === "add" && ids.length === 0) {
9465
9727
  const installed = new Set(projectDir ? readCatalogStatus(projectDir, catalogDir).installed : []);
@@ -9530,7 +9792,7 @@ Use \`git diff\` to see your changes, then port what you want from the new versi
9530
9792
  resolveDependencySpec: (name, spec) => checkoutPackageSpec(name, monoRoot) ?? spec,
9531
9793
  installDependencies: (dependencyNames) => {
9532
9794
  if (usesRuntimeImage(projectDir)) {
9533
- 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")));
9534
9796
  if (missing.length > 0) throw new Error(`The runtime image lacks ${missing.join(", ")}; this capability needs a game that installs its own dependencies.`);
9535
9797
  return;
9536
9798
  }
@@ -9571,24 +9833,24 @@ ${report.writtenFiles.map((path) => ` ${path}`).join("\n")}`);
9571
9833
  import { execFileSync as execFileSync6 } from "node:child_process";
9572
9834
  import {
9573
9835
  createWriteStream as createWriteStream2,
9574
- existsSync as existsSync9,
9575
- mkdirSync as mkdirSync8,
9576
- readFileSync as readFileSync9,
9836
+ existsSync as existsSync11,
9837
+ mkdirSync as mkdirSync9,
9838
+ readFileSync as readFileSync11,
9577
9839
  renameSync as renameSync3,
9578
- rmSync as rmSync4,
9579
- writeFileSync as writeFileSync8
9840
+ rmSync as rmSync5,
9841
+ writeFileSync as writeFileSync9
9580
9842
  } from "node:fs";
9581
- import { homedir as homedir4 } from "node:os";
9582
- 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";
9583
9845
  var WORKBENCH_LOCATOR_PATH2 = ".volter/workbench.json";
9584
9846
  var RELEASE_RECORD2 = "BUILD.json";
9585
- var SOURCES_LAUNCHER2 = join11("scripts", "code-server.sh");
9847
+ var SOURCES_LAUNCHER2 = join12("scripts", "code-server.sh");
9586
9848
  var OVERLAY_RECORD2 = ".volter-overlay.json";
9587
9849
  function writeWorkbenchDeclaration2(projectRoot, workbenchDir) {
9588
- mkdirSync8(join11(projectRoot, ".volter"), { recursive: true });
9589
- writeFileSync8(
9590
- join11(projectRoot, WORKBENCH_LOCATOR_PATH2),
9591
- `${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)}
9592
9854
  `
9593
9855
  );
9594
9856
  }
@@ -9596,8 +9858,8 @@ function machinePlatform2() {
9596
9858
  return `${process.platform}-${process.arch}`;
9597
9859
  }
9598
9860
  function resolveWorkbench2(dir, expectedProduct) {
9599
- const root = resolve10(dir);
9600
- 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;
9601
9863
  if (resolved === null) {
9602
9864
  throw new Error(
9603
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.`
@@ -9613,11 +9875,11 @@ function resolveWorkbench2(dir, expectedProduct) {
9613
9875
  return resolved;
9614
9876
  }
9615
9877
  function resolveRelease2(dir) {
9616
- const record = join11(dir, RELEASE_RECORD2);
9878
+ const record = join12(dir, RELEASE_RECORD2);
9617
9879
  const cut = `node scripts/workbench/build-release.mjs --product <id> --platform ${machinePlatform2()} --checkout <fork dir> --out ${dir}`;
9618
9880
  let parsed;
9619
9881
  try {
9620
- parsed = JSON.parse(readFileSync9(record, "utf8"));
9882
+ parsed = JSON.parse(readFileSync11(record, "utf8"));
9621
9883
  } catch (error) {
9622
9884
  throw new Error(`${record} could not be read: ${String(error)}`);
9623
9885
  }
@@ -9641,13 +9903,13 @@ function resolveRelease2(dir) {
9641
9903
  node scripts/workbench/build-release.mjs --product ${product} --platform ${machine} --checkout <fork dir>`
9642
9904
  );
9643
9905
  }
9644
- const packageRoot = join11(dir, target);
9645
- const serverBinPath = join11(packageRoot, serverBin);
9646
- if (!existsSync9(serverBinPath)) {
9906
+ const packageRoot = join12(dir, target);
9907
+ const serverBinPath = join12(packageRoot, serverBin);
9908
+ if (!existsSync11(serverBinPath)) {
9647
9909
  const tarball = typeof parsed["tarball"] === "string" ? parsed["tarball"] : `${target}-<commit>.tar.gz`;
9648
9910
  throw new Error(
9649
9911
  `${dir} records ${target}, but ${serverBinPath} is not there \u2014 the tarball has not been extracted beside ${RELEASE_RECORD2}. Run:
9650
- tar -xzf ${join11(dir, tarball)} -C ${dir}`
9912
+ tar -xzf ${join12(dir, tarball)} -C ${dir}`
9651
9913
  );
9652
9914
  }
9653
9915
  return { kind: "release", dir, commit, product, serverBin: serverBinPath, cwd: packageRoot };
@@ -9661,8 +9923,8 @@ function resolveSources2(dir) {
9661
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.`
9662
9924
  );
9663
9925
  }
9664
- const marker = join11(dir, OVERLAY_RECORD2);
9665
- if (!existsSync9(marker)) {
9926
+ const marker = join12(dir, OVERLAY_RECORD2);
9927
+ if (!existsSync11(marker)) {
9666
9928
  throw new Error(
9667
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:
9668
9930
  node scripts/workbench/dev.mjs --checkout ${dir} --product <model-editor|game-editor>`
@@ -9670,7 +9932,7 @@ function resolveSources2(dir) {
9670
9932
  }
9671
9933
  let product;
9672
9934
  try {
9673
- product = JSON.parse(readFileSync9(marker, "utf8"))["product"];
9935
+ product = JSON.parse(readFileSync11(marker, "utf8"))["product"];
9674
9936
  } catch (error) {
9675
9937
  throw new Error(`${marker} could not be read: ${String(error)}`);
9676
9938
  }
@@ -9684,11 +9946,11 @@ function resolveSources2(dir) {
9684
9946
  dir,
9685
9947
  commit,
9686
9948
  product,
9687
- serverBin: join11(dir, SOURCES_LAUNCHER2),
9949
+ serverBin: join12(dir, SOURCES_LAUNCHER2),
9688
9950
  cwd: dir
9689
9951
  };
9690
9952
  }
9691
- var WORKBENCH_CACHE_ROOT2 = join11(homedir4(), ".volter", "workbenches");
9953
+ var WORKBENCH_CACHE_ROOT2 = join12(homedir5(), ".volter", "workbenches");
9692
9954
 
9693
9955
  // node/cli.ts
9694
9956
  var PRODUCT3 = { packageName: package_default.name, id: "game-editor", displayName: package_default.volter.product.displayName, command: Object.keys(package_default.bin)[0] };
@@ -9732,15 +9994,18 @@ try {
9732
9994
  volter-game-editor eval <JavaScript> | --list # { editor, game, page, tools, session } in scope
9733
9995
  volter-game-editor play | stop | restart
9734
9996
  volter-game-editor ${SCREENSHOT_USAGE}
9997
+ volter-game-editor ${HOSTED_USAGE}
9735
9998
  volter-game-editor sessions | project | projects
9736
9999
  volter-game-editor open <path>
9737
10000
  volter-game-editor add [id...] | remove <id...> | outdated [--project <path>] [--dry-run] [--json]
9738
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));
9739
10004
  } else if (verb === "blender-mcp") {
9740
10005
  if (positionals.length !== 1) throw new Error("Usage: volter-game-editor blender-mcp");
9741
- let project = resolve11(process.cwd());
10006
+ let project = resolve12(process.cwd());
9742
10007
  while (!hasManifest(project)) {
9743
- const parent = dirname8(project);
10008
+ const parent = dirname9(project);
9744
10009
  if (parent === project) throw new Error("Run volter-game-editor blender-mcp inside a game project.");
9745
10010
  project = parent;
9746
10011
  }
@@ -9753,7 +10018,7 @@ try {
9753
10018
  } catch {
9754
10019
  }
9755
10020
  await new Promise((done, fail2) => {
9756
- const child = spawn3(process.execPath, [fileURLToPath2(import.meta.url), "edit", project], {
10021
+ const child = spawn4(process.execPath, [fileURLToPath2(import.meta.url), "edit", project], {
9757
10022
  cwd: project,
9758
10023
  stdio: ["ignore", 2, 2],
9759
10024
  env: process.env
@@ -9804,14 +10069,14 @@ try {
9804
10069
  if (!isScaffoldAddition(value)) throw new Error(`--with must name additions from: ${SCAFFOLD_ADDITIONS.join(", ")} \u2014 got "${value}"`);
9805
10070
  additions.push(value);
9806
10071
  }
9807
- if (values.workbench) resolveWorkbench2(resolve11(values.workbench), PRODUCT3.id);
10072
+ if (values.workbench) resolveWorkbench2(resolve12(values.workbench), PRODUCT3.id);
9808
10073
  await createGameProject({
9809
10074
  name: folder.split(/[\\/]/).at(-1),
9810
- targetDir: resolve11(folder),
10075
+ targetDir: resolve12(folder),
9811
10076
  additions,
9812
10077
  ...values.template === void 0 ? {} : { template: values.template }
9813
10078
  });
9814
- if (values.workbench) writeWorkbenchDeclaration2(resolve11(folder), resolve11(values.workbench));
10079
+ if (values.workbench) writeWorkbenchDeclaration2(resolve12(folder), resolve12(values.workbench));
9815
10080
  }
9816
10081
  await launch(folder, PRODUCT3, {
9817
10082
  ...values.workbench ? { workbench: values.workbench } : {},