@volter/game-editor 0.5.67 → 0.5.69
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.
- package/BUNDLED_NOTICES +10954 -5077
- package/LICENSE +1 -1
- package/LICENSE-BLENDER +2 -2
- package/NOTICE +2 -2
- package/additions/canvas/package.json +8 -0
- package/additions/canvas/src/canvas-mount.ts +46 -0
- package/additions/canvas/src/scene2d.tsx +18 -0
- package/catalog/entries/bake.json +1 -1
- package/catalog/entries/blender.json +3 -3
- package/catalog/entries/music.json +6 -6
- package/catalog/project-source/LICENSE +1 -1
- package/catalog/project-source/src/contributions/bake.kind.ts +2 -2
- package/catalog/project-source/src/contributions/builder-document.tsx +1 -1
- package/catalog/project-source/src/contributions/builder-ui.tsx +3 -3
- package/catalog/project-source/src/contributions/module-source.ts +4 -4
- package/catalog/project-source/src/lib/music/music-player.ts +18 -12
- package/catalog/project-source/src/lib/reflections/volume-reflection-material.ts +59 -59
- package/catalog/project-source/src/lib/static-batch/Frozen.tsx +1 -1
- package/catalog/project-source/src/lib/static-batch/mutation-watch.ts +1 -1
- package/catalog/project-source/src/tools/bake-preview.tool.ts +9 -9
- package/dist/.vite/manifest.json +4106 -3965
- package/dist/assets/{AssetBudgetPanel-x_FNJbfZ.js → AssetBudgetPanel-BMR3AQhc.js} +10 -10
- package/dist/assets/AudioViewer-DESxi7pU.js +1 -0
- package/dist/assets/CanvasBoardDocument-Q_nrYFlB.js +1 -0
- package/dist/assets/CanvasSceneViewport-WZMoKy_F.js +1 -0
- package/dist/assets/ColorInput-C2EK-OnD.js +1 -0
- package/dist/assets/{EntityModelDocument-CzUHsH9E.js → EntityModelDocument-B_4ENTCq.js} +1 -1
- package/dist/assets/{EnvironmentAssetDocument-ByEB7_4A.js → EnvironmentAssetDocument-BZBp6OFJ.js} +1 -1
- package/dist/assets/{GameplaySessionTimeline-dhG-oiqd.js → GameplaySessionTimeline-1ivaucpv.js} +1 -1
- package/dist/assets/ImageViewer-D16OExYu.js +1 -0
- package/dist/assets/{InspectorCanvasPreview-CEr_Kxna.js → InspectorCanvasPreview-BrFjhoiD.js} +1 -1
- package/dist/assets/InspectorObjectPreview-CY5xVsPR.js +1 -0
- package/dist/assets/JsonAssetDocument-CvjTlcdr.js +2 -0
- package/dist/assets/{LiveModuleDocument-DL8QHSlk.js → LiveModuleDocument-ne1o9giX.js} +1 -1
- package/dist/assets/{LutAssetDocument-BImiug2M.js → LutAssetDocument-Cp0v-O7q.js} +1 -1
- package/dist/assets/ModelAssetDocument-Ceu7OIN9.js +1 -0
- package/dist/assets/{NonThreeAuthoringBootstrap-B40qmGGS.js → NonThreeAuthoringBootstrap-DiElZf-e.js} +1 -1
- package/dist/assets/Object3DDocumentToolbar-BLNamqii.js +1 -0
- package/dist/assets/Object3DDocumentViewport-D6QoHfa_.js +2 -0
- package/dist/assets/{Object3DPreview-ClYDoH2L.js → Object3DPreview-ZVokr044.js} +1 -1
- package/dist/assets/OnlineAssetDetail-Dnckd7zB.js +1 -0
- package/dist/assets/PlayBar-DsMitSgy.js +1 -0
- package/dist/assets/{QuarksAssetDocument-B-VOj-n4.js → QuarksAssetDocument-B5J8uHFM.js} +1 -1
- package/dist/assets/ReactCanvasControls-CmfvxJYY.js +1 -0
- package/dist/assets/RootSelectionOverlay-BWsNiSuM.js +1 -0
- package/dist/assets/{ShaderAssetDocument-Kn8IvRGV.js → ShaderAssetDocument-CT7XzsZq.js} +5 -5
- package/dist/assets/ShadowEditor-YO5KEfnz.js +1 -0
- package/dist/assets/{SourceAssetViewer-CLQ95VSD.js → SourceAssetViewer-FSLup2km.js} +1 -1
- package/dist/assets/StageHost-DYfGYwvq.js +2 -0
- package/dist/assets/{StoryPreviewMount-D2lg37et.js → StoryPreviewMount-BhvT5QlB.js} +1 -1
- package/dist/assets/ThreeBoardDocument-B-z2nwnH.js +2 -0
- package/dist/assets/{ThreeIsolationSceneContent-DbYIylZQ.js → ThreeIsolationSceneContent-B5pU4Y6k.js} +1 -1
- package/dist/assets/{ToolObject3DPreview-WEi6C9uU.js → ToolObject3DPreview-VtraiQ4Q.js} +1 -1
- package/dist/assets/Toolbar-M62Gob9T.js +1 -0
- package/dist/assets/{TransientHint-BpDLhRLd.js → TransientHint-Cc40mHWE.js} +1 -1
- package/dist/assets/VideoViewer-BxcUwXQm.js +1 -0
- package/dist/assets/ViewportShadingMenu-BoMPnTVh.js +1 -0
- package/dist/assets/active-ingest-0QjJWb7i.js +3 -0
- package/dist/assets/{animation-clock-Bm80XdqP.js → animation-clock-BXEwUJtz.js} +1 -1
- package/dist/assets/animation-mixers.service-C-Ko4KzM.js +1 -0
- package/dist/assets/animation-timeline.utility-Bl15-rYb.js +1 -0
- package/dist/assets/{asset-budget-asset.menu-CEgP0Kiw.js → asset-budget-asset.menu-BUa3g0Wy.js} +1 -1
- package/dist/assets/{asset-budget.action-D4R1c3wi.js → asset-budget.action-Dl5eVPIo.js} +1 -1
- package/dist/assets/{asset-budget.document-Syzjn1U1.js → asset-budget.document-DJylQ-0h.js} +1 -1
- package/dist/assets/{asset-budget.menu-BbRiqXeM.js → asset-budget.menu-BJtvNMLj.js} +1 -1
- package/dist/assets/asset-editor-persistence-BIbf5u0Q.js +1 -0
- package/dist/assets/asset-loaders-DoNflsHL.js +2 -0
- package/dist/assets/{asset-preview-B1tDziF1.js → asset-preview-DxlSdRZn.js} +1 -1
- package/dist/assets/{audio-unlock.service-ucMfCVBw.js → audio-unlock.service-CTaiyXF9.js} +1 -1
- package/dist/assets/audio.utility-CEmNc68t.js +1 -0
- package/dist/assets/autoplay.service-BZLSUyL8.js +1 -0
- package/dist/assets/{babylon-authoring-adapter-C8mFMXSr.js → babylon-authoring-adapter-BZvV2bz_.js} +1 -1
- package/dist/assets/binding-resolver-DGbk9_XR.js +2 -0
- package/dist/assets/blender-emscripten-engine-B7lfg-RX.js +2 -0
- package/dist/assets/{blender-node-editor.document-C1YmwWls.js → blender-node-editor.document-wXJobGNH.js} +1 -1
- package/dist/assets/{blender-properties-tab-B8lyjgj3.js → blender-properties-tab-7GFf80ev.js} +1 -1
- package/dist/assets/{blender-runtime-host-CyQlImSR.js → blender-runtime-host-CILxrx5T.js} +2 -2
- package/dist/assets/{blender-runtime-skin-BK7ShZ6z.js → blender-runtime-skin-Cd5lQYsC.js} +7 -7
- package/dist/assets/{blender-runtime.document-B0nVQs0P.js → blender-runtime.document-C0r_R49S.js} +7 -7
- package/dist/assets/{blender-timeline.document-CMcdE2CK.js → blender-timeline.document-BaISZMBc.js} +1 -1
- package/dist/assets/{blender-uv-editor.document-CjqNo4sZ.js → blender-uv-editor.document-CT_fsyyA.js} +1 -1
- package/dist/assets/blender-version.status-DzEx7u7k.js +1 -0
- package/dist/assets/blender-wali-engine-DOiQCBXH.js +2 -0
- package/dist/assets/{blender.command-C6NmRBo5.js → blender.command-DdiKd8mZ.js} +1 -1
- package/dist/assets/blender.keymap-BmOBRY7p.js +1 -0
- package/dist/assets/blender.status-BMETIbb2.js +1 -0
- package/dist/assets/board-guides-CjHQ9Ynm.js +1 -0
- package/dist/assets/body-marks-C1LxJtQb.js +1 -0
- package/dist/assets/bridge.command-DXUeavn5.js +3 -0
- package/dist/assets/{browserAll-lF_dLQVz.js → browserAll-Dg46xT22.js} +1 -1
- package/dist/assets/build-player.document-BHwVV3K0.js +1 -0
- package/dist/assets/build-profiles.document-HkpS-Kxa.js +2 -0
- package/dist/assets/build-progress.status-u1J0Rm1D.js +1 -0
- package/dist/assets/build-session-BLboUUbw.js +9 -0
- package/dist/assets/{build.action-DRX2IcYt.js → build.action-C00DL83N.js} +1 -1
- package/dist/assets/{build.command-BGvLaLG0.js → build.command-Cjk_NY75.js} +1 -1
- package/dist/assets/build.header-BWNmNWFT.js +1 -0
- package/dist/assets/{build.menu-UenrjPWS.js → build.menu-BBYtqCIq.js} +1 -1
- package/dist/assets/{build.service-BIUoTY6l.js → build.service-DOU15tKN.js} +1 -1
- package/dist/assets/{camera-DrvaM47S.js → camera-7DGyYW7Y.js} +1 -1
- package/dist/assets/{camera-runtime.inspector-CjJALNO8.js → camera-runtime.inspector-n-jiOR-3.js} +1 -1
- package/dist/assets/canvas-design-mount-CSRHU-ag.js +6 -0
- package/dist/assets/canvas-entry-runtime-BST8yRuK.js +2 -0
- package/dist/assets/{canvas-preview-frames-C0QTagA3.js → canvas-preview-frames-Cja32aW2.js} +1 -1
- package/dist/assets/{canvas-story-capture.service-Dgjr-rT1.js → canvas-story-capture.service-D5R5HJ8n.js} +2 -2
- package/dist/assets/capability-coverage-ByWftxk4.js +7 -0
- package/dist/assets/{collaboration-presence-BVIQuN1l.js → collaboration-presence-D6MC9xJN.js} +1 -1
- package/dist/assets/{collider-C7SbIYKY.js → collider-B78EcUc9.js} +1 -1
- package/dist/assets/{component-board.service-BEsFAw4_.js → component-board.service-BaQI5Oas.js} +2 -2
- package/dist/assets/component-board.service-CkjrsD8x.js +2 -0
- package/dist/assets/{component-board.service-CWFaGMCO.js → component-board.service-Dvjz_g-x.js} +2 -2
- package/dist/assets/component-contracts.service-C3-AXQp7.js +1 -0
- package/dist/assets/component-instance-root-DLI40MiB.js +1 -0
- package/dist/assets/{component-verbs.command-oNtGgzQL.js → component-verbs.command-Brr_WcaR.js} +1 -1
- package/dist/assets/component-verbs.service-DC2sC3j3.js +1 -0
- package/dist/assets/{config-_wCzzlM_.js → config-BI_7osdR.js} +3 -3
- package/dist/assets/{configurations-BXU4GGbV.js → configurations-XP9YLkrt.js} +1 -1
- package/dist/assets/connection.status-BhRwcFx0.js +1 -0
- package/dist/assets/{constraint-5KLYpGm7.js → constraint-Bp1l8hY-.js} +1 -1
- package/dist/assets/constraints.inspector-Dm1cycK3.js +1 -0
- package/dist/assets/{content-bounds-BeuIXKYu.js → content-bounds-DROIchTa.js} +1 -1
- package/dist/assets/{contract-system-adapters-Bic_7sev.js → contract-system-adapters-Cn7OW_ay.js} +1 -1
- package/dist/assets/coverage.service-l42ty7lr.js +3 -0
- package/dist/assets/create-runtime-B_uTwsmi.js +3 -0
- package/dist/assets/curve-THOUsg-j.js +1 -0
- package/dist/assets/{data-asset-DfQ2Pjse.js → data-asset-DAANayR6.js} +1 -1
- package/dist/assets/data-check-core-CHqar_E8.js +1 -0
- package/dist/assets/data-ref-CN34UeVw.js +1 -0
- package/dist/assets/debug-bridge-BD1XVAIB.js +1 -0
- package/dist/assets/debug-registry-ggQWxtu-.js +1 -0
- package/dist/assets/{deferred-ingest-play-BdR4qGk6.js → deferred-ingest-play-B2JUlwlT.js} +2 -2
- package/dist/assets/{design-time-canvas-mount-DPQeHSN2.js → design-time-canvas-mount-as9cN9I6.js} +2 -2
- package/dist/assets/design-time-layers-BRseeSmV.js +1 -0
- package/dist/assets/{design-time-mount.service-Ks-5Wkcs.js → design-time-mount.service-BTVu3yKo.js} +2 -2
- package/dist/assets/{design-time-mount.service-Ca-DZGFV.js → design-time-mount.service-DKvc7lVK.js} +2 -2
- package/dist/assets/design-time-react-mount-C7rB56QD.js +1 -0
- package/dist/assets/{document-preview-three-DThkjI1S.js → document-preview-three-CxmRhCcV.js} +1 -1
- package/dist/assets/{dom-authoring-adapter-BrLU8IJ_.js → dom-authoring-adapter-L8OzXfmE.js} +1 -1
- package/dist/assets/{draco3d-B2cwv46o.js → draco3d-BjNuXv66.js} +1 -1
- package/dist/assets/{edit-mode-audio.service-D4ITNbsm.js → edit-mode-audio.service-BwI5u845.js} +1 -1
- package/dist/assets/edit-mode-authoring-D5f7aHHl.js +1 -0
- package/dist/assets/{edit-mode-networking.service-BNv-FTRh.js → edit-mode-networking.service-DqP_4lbI.js} +1 -1
- package/dist/assets/editor-api-BM7H_F4G.js +1 -0
- package/dist/assets/{editor-layers-BDJnAAzj.js → editor-layers-D-CTUqco.js} +1 -1
- package/dist/assets/editor-presentation-activity-CqJH4G9t.js +1 -0
- package/dist/assets/{editor-shell-store-ChLcVeNB.js → editor-shell-store-DHVWS8cE.js} +1 -1
- package/dist/assets/{entity-object-JmYMfLsx.js → entity-object-MKYemTFM.js} +1 -1
- package/dist/assets/{extend-Cc-nEa_A.js → extend-BrgqZiMY.js} +1 -1
- package/dist/assets/fork-menu-DE2MK3Nq.js +1 -0
- package/dist/assets/{frame-debugger-store-DaCbAYSW.js → frame-debugger-store-BXoLKTdZ.js} +1 -1
- package/dist/assets/game-audio-BeCyd0Ha.js +1 -0
- package/dist/assets/{game-contract-seams-BnPFGLll.js → game-contract-seams-tyKDsfaP.js} +1 -1
- package/dist/assets/{game-css-scope-transform-D_p7cVgW.js → game-css-scope-transform-DcjrwtVc.js} +2 -2
- package/dist/assets/game-document.service-CTb2itHQ.js +1 -0
- package/dist/assets/game-eval.command-CpDKXOQU.js +2 -0
- package/dist/assets/game-module-access-BTInp2NG.js +1 -0
- package/dist/assets/game-network-DW5ARz4R.js +22 -0
- package/dist/assets/{gameplay-export-BzYzLZPi.js → gameplay-export-cHk3v9y-.js} +1 -1
- package/dist/assets/gameplay-replay-HRenPTtU.js +1 -0
- package/dist/assets/gameplay.command-DcY2lKKX.js +1 -0
- package/dist/assets/generation-CdOATubd.css +1 -0
- package/dist/assets/{generation-jobs-BZhOMrp-.js → generation-jobs-CJBehuUp.js} +1 -1
- package/dist/assets/generation.service-BMOc-C9i.js +1 -0
- package/dist/assets/{generations-DVDht_31.js → generations-ssgVOe_6.js} +1 -1
- package/dist/assets/generations.status-B_SmPReI.js +1 -0
- package/dist/assets/hierarchy-marks-BuCO8Ke-.js +1 -0
- package/dist/assets/hierarchy-marks-CsTaTkc7.js +1 -0
- package/dist/assets/hosted-asset-materialization-CiXZI85V.js +2 -0
- package/dist/assets/{ibl-override-material-CiKkaOTW.js → ibl-override-material-CMo_a49U.js} +1 -1
- package/dist/assets/index-B0S4fQQV.js +1 -0
- package/dist/assets/{index-C3Pw-9So.js → index-B9bd4k-t.js} +1 -1
- package/dist/assets/index-BMxv2MNV.js +1 -0
- package/dist/assets/{index-DUZeuA7g.js → index-Bm4_DmRO.js} +1 -1
- package/dist/assets/{index-cNc-iFbq.js → index-BvBlIRwM.js} +1 -1
- package/dist/assets/{index-Ck3JFh48.js → index-BweKDdi_.js} +1 -1
- package/dist/assets/{index-BRJMIUK0.js → index-C5ZAyrKq.js} +346 -345
- package/dist/assets/index-CPiRKiDC.css +1 -0
- package/dist/assets/index-CfpGZrbC.js +1 -0
- package/dist/assets/index-Czvj6whv.js +1 -0
- package/dist/assets/{index-SS9EugVg.js → index-DgPDGGSV.js} +2 -2
- package/dist/assets/{inference-diagnostics-xecGdohW.js → inference-diagnostics-DLt9ql9I.js} +1 -1
- package/dist/assets/{ingest-boot-viewport-DAt8WFSy.js → ingest-boot-viewport-BXVXjYpG.js} +1 -1
- package/dist/assets/ingest-siblings-DWJ7OGB_.js +1 -0
- package/dist/assets/ingest-source-persistence-6ShMoSCa.js +1 -0
- package/dist/assets/ingest.service-BBbX8ibg.js +1 -0
- package/dist/assets/{inspect-Dr4qvDpJ.js → inspect-Cz3Zyx_1.js} +1 -1
- package/dist/assets/inspection-D8fZOHCM.js +1 -0
- package/dist/assets/instances.command-BrdlngrL.js +1 -0
- package/dist/assets/{json-history-resource-DwS10tqD.js → json-history-resource-Uqrihfc8.js} +1 -1
- package/dist/assets/layered-pick-CAVQMPI7.js +1 -0
- package/dist/assets/{light-DcFqVCmv.js → light-CqzsCWeJ.js} +1 -1
- package/dist/assets/{live-project-verbs-C3LzprCe.js → live-project-verbs-CdFmLYOo.js} +1 -1
- package/dist/assets/{machine.document-BzZxubYQ.js → machine.document-DRIFOVaa.js} +1 -1
- package/dist/assets/{machines.finder-BR02bfVG.js → machines.finder-DPCT6few.js} +1 -1
- package/dist/assets/material-BVApn1V_.js +1 -0
- package/dist/assets/{material-factory-COz7qZhC.js → material-factory-B_75xxFD.js} +1 -1
- package/dist/assets/{mesh-DcmO-mWI.js → mesh-DdA3mExo.js} +1 -1
- package/dist/assets/model-asset-sections-D1uxOu2v.css +1 -0
- package/dist/assets/model-asset-sections.service-CJnSIckZ.js +1 -0
- package/dist/assets/{model-inspection-CXHxrafK.js → model-inspection-DvspbmJl.js} +1 -1
- package/dist/assets/{model-thumbnail-BEKPWg4l.js → model-thumbnail-BmQs-h6t.js} +1 -1
- package/dist/assets/{models.finder-c1I0tp2M.js → models.finder-Qv_Hsccy.js} +1 -1
- package/dist/assets/module-mode-MJ4Gbsry.js +2 -0
- package/dist/assets/mount-canvas-ingest-root-BxtM8OaB.js +2 -0
- package/dist/assets/mount-dom-ingest-root-pGatqO46.js +2 -0
- package/dist/assets/mount-ingest-root-C7jb-mCl.js +2 -0
- package/dist/assets/mount-manifest-BfoHBuzn.js +1 -0
- package/dist/assets/mount-readiness-DyAd17pe.js +4 -0
- package/dist/assets/mount-three-ingest-root-Boa5mcaF.js +1 -0
- package/dist/assets/{mounted-authoring-Clftxx0x.js → mounted-authoring-DxMISwvR.js} +1 -1
- package/dist/assets/{mounted-story-viewport-source-B4-eAYGI.js → mounted-story-viewport-source-DfnLxI1f.js} +1 -1
- package/dist/assets/{native-debug-module-2_HVupdg.js → native-debug-module-BlrALjM3.js} +1 -1
- package/dist/assets/{navigation-CH3-zr1n.js → navigation-CqG5o5AR.js} +1 -1
- package/dist/assets/{navmesh.menu-Dfi-Pk-8.js → navmesh.menu-D4TdVDhe.js} +1 -1
- package/dist/assets/{navmesh.service-Cz7QFY-M.js → navmesh.service-DWKT5ruQ.js} +1 -1
- package/dist/assets/network-observer.service-ZRAquNq4.js +1 -0
- package/dist/assets/network.utility-DjeOEvAY.js +1 -0
- package/dist/assets/object-marks-BnvSuCTt.js +1 -0
- package/dist/assets/{object3d-authoring-subject-BDrxd1GA.js → object3d-authoring-subject-XccsO0xG.js} +1 -1
- package/dist/assets/{object3d-document-session-registry-DJDEDM0p.js → object3d-document-session-registry-CMRJdFp6.js} +2 -2
- package/dist/assets/{oid-transform-D5Kxt6ij.js → oid-transform-DaA6yW6o.js} +1 -1
- package/dist/assets/{particles-vRp0Lf3o.js → particles-DsQRcDBY.js} +1 -1
- package/dist/assets/{performance-profiler-OwnXQX0M.js → performance-profiler-CMbwGBuk.js} +1 -1
- package/dist/assets/pixi-authoring-adapter-BoBt8bB5.js +1 -0
- package/dist/assets/pixi-live-write-target-CYZgvC6U.js +1 -0
- package/dist/assets/play.command-D9JGJP-e.js +2 -0
- package/dist/assets/pose-guard-CLabLSzf.js +1 -0
- package/dist/assets/presentation-COhHQdmR.js +1 -0
- package/dist/assets/{product-CxmUIxmr.js → product-CaRGoiIH.js} +1 -1
- package/dist/assets/{profiler.action-Dzy9DuAc.js → profiler.action-Cz7HYWjh.js} +1 -1
- package/dist/assets/{profiler.menu-jLDO3U6N.js → profiler.menu-D5aR_FBy.js} +1 -1
- package/dist/assets/profiler.utility-KwxlIPKb.js +1 -0
- package/dist/assets/{project-authoring-session-C3eusefK.js → project-authoring-session-DKXHVwxO.js} +2 -2
- package/dist/assets/project-provenance-BGnJXJwa.js +1 -0
- package/dist/assets/{properties-bone-constraints.inspector-B_PbSMV7.js → properties-bone-constraints.inspector-Bo-sU8eR.js} +1 -1
- package/dist/assets/{properties-bone.inspector-CMDEQuBd.js → properties-bone.inspector-BQiWplQv.js} +1 -1
- package/dist/assets/{properties-collection.inspector-D7Ay8yRj.js → properties-collection.inspector-C5BnR-GE.js} +1 -1
- package/dist/assets/{properties-constraints.inspector-DS1fZgXK.js → properties-constraints.inspector-CyheU12R.js} +1 -1
- package/dist/assets/{properties-data.inspector-k2pGN2Mp.js → properties-data.inspector-CkycARja.js} +1 -1
- package/dist/assets/{properties-material.inspector-Bb3yAGUx.js → properties-material.inspector-Bl_PUmY-.js} +1 -1
- package/dist/assets/{properties-modifiers.inspector-BcJfe-Wy.js → properties-modifiers.inspector-j7SnOxQq.js} +1 -1
- package/dist/assets/{properties-object.inspector-CUSfXJuq.js → properties-object.inspector-DcR3MGLK.js} +1 -1
- package/dist/assets/{properties-output.inspector-BTVW2kn1.js → properties-output.inspector-BLjw6K4b.js} +1 -1
- package/dist/assets/{properties-particles.inspector-Cw0fxx3B.js → properties-particles.inspector-BUIm2-Jf.js} +1 -1
- package/dist/assets/{properties-physics.inspector-C-0bD2bu.js → properties-physics.inspector-DNvRcxb6.js} +1 -1
- package/dist/assets/{properties-render.inspector-C8D5UpjX.js → properties-render.inspector-8FMZ-qoZ.js} +1 -1
- package/dist/assets/{properties-scene.inspector-HjK6QHGg.js → properties-scene.inspector-Dx7_z75k.js} +1 -1
- package/dist/assets/{properties-texture.inspector-CckZgUaI.js → properties-texture.inspector-WT15951-.js} +1 -1
- package/dist/assets/{properties-view-layer.inspector-C1ajtVSk.js → properties-view-layer.inspector-P7VNTdqr.js} +1 -1
- package/dist/assets/{properties-world.inspector-BiT_EdT-.js → properties-world.inspector-B3t1q8TF.js} +1 -1
- package/dist/assets/r3f-design-session-lsbFnoWH.js +2 -0
- package/dist/assets/{r3f-physics-binding-DzrbpqjM.js → r3f-physics-binding-Cx8yhuwt.js} +1 -1
- package/dist/assets/{r3f-source-authoring-adapter-DbbeRcvt.js → r3f-source-authoring-adapter-jH3G0TeH.js} +2 -2
- package/dist/assets/react-canvas-navigation-B_gOe3CI.js +1 -0
- package/dist/assets/react-inspector.service-CZf1vfdX.js +1 -0
- package/dist/assets/react-story-board-CCm2Opwn.js +1 -0
- package/dist/assets/{react-three-rapier.esm-U8J7g6tH.js → react-three-rapier.esm-CHXGG51p.js} +1 -1
- package/dist/assets/react-world-authoring-adapter-CnzxMtYz.js +1 -0
- package/dist/assets/{realm-services-CnY105XU.js → realm-services-Do9J6nsb.js} +1 -1
- package/dist/assets/reflection-probe-capture.inspector-BAjjIybz.js +1 -0
- package/dist/assets/{reflection-probe-BHNGwVyz.js → reflection-probe-sIto9mh0.js} +1 -1
- package/dist/assets/registry-Xnduk02T.js +1 -0
- package/dist/assets/{relative-import-specifier-BFKIWEWs.js → relative-import-specifier-CPFTrxi4.js} +1 -1
- package/dist/assets/{render-env-BkKZ4uMA.js → render-env-YJlI8K0i.js} +1 -1
- package/dist/assets/{render-features-rxbawsRb.js → render-features-DMSV2qKJ.js} +1 -1
- package/dist/assets/{render-settings-DS5leCed.js → render-settings-CRyDhHyz.js} +1 -1
- package/dist/assets/{resolve-three-CVnMRHxw.js → resolve-three-D27rMc37.js} +19 -19
- package/dist/assets/root-seam-contract-gjWUd5uu.js +1 -0
- package/dist/assets/run-selection-B0jOdyYt.js +2 -0
- package/dist/assets/scene-capture-Di9cM1p4.js +1 -0
- package/dist/assets/scene-document.service-XxGs4HHE.js +2 -0
- package/dist/assets/{scene-framing-BQt72ZCw.js → scene-framing-DkZKDwH3.js} +1 -1
- package/dist/assets/{scene-index--lRWLEmW.js → scene-index-DHeKmalD.js} +1 -1
- package/dist/assets/{scene-query-s1y04OVB.js → scene-query-ByZtXA2m.js} +1 -1
- package/dist/assets/seeded-random-BJthDRMu.js +1 -0
- package/dist/assets/{session-CTXsU1lK.js → session-x8E_NJk2.js} +34 -34
- package/dist/assets/{setup-renderer-Cwkl1Ar6.js → setup-renderer-F9mG7t6r.js} +1 -1
- package/dist/assets/{source-object3d-authoring-adapter-DF679Ncb.js → source-object3d-authoring-adapter-CvmFpSUj.js} +1 -1
- package/dist/assets/{source-persistence-backend-CwLYVPXj.js → source-persistence-backend-au3WtEn6.js} +1 -1
- package/dist/assets/{spark-renderer-lifecycle-DfYpvEJa.js → spark-renderer-lifecycle-B6Axb6jm.js} +1 -1
- package/dist/assets/{stage-keyboard-B8BEW592.js → stage-keyboard-BQkndG_D.js} +1 -1
- package/dist/assets/stage-overlay-set-g6eWhuRv.js +1 -0
- package/dist/assets/stage-presence-markers-0CDfO5f4.js +1 -0
- package/dist/assets/stage-transform-tools-BzPl7OIo.js +1 -0
- package/dist/assets/standard-viewport-dressing-BW-dM_1h.js +24 -0
- package/dist/assets/{state-watch.action-DnR5Zjr-.js → state-watch.action-Z1nQ5awu.js} +1 -1
- package/dist/assets/{state-watch.menu-wYLCLsAw.js → state-watch.menu-CQHGUF3W.js} +1 -1
- package/dist/assets/state-watch.utility-DCIg2i79.js +1 -0
- package/dist/assets/{story-capture-BmnwHGDV.js → story-capture-BIrjDKeY.js} +1 -1
- package/dist/assets/story-documents-BvG2xeaR.js +3 -0
- package/dist/assets/{story-documents.service-B6v7Z-WE.js → story-documents.service-DOSEa3ja.js} +1 -1
- package/dist/assets/{story-documents.service-yagl1wGp.js → story-documents.service-y1m7XGMJ.js} +1 -1
- package/dist/assets/{story-media-presence-BqRMu572.js → story-media-presence-HLV-KaMj.js} +1 -1
- package/dist/assets/{story-pixi-preview-Da6afqLg.js → story-pixi-preview-CMhho2gG.js} +1 -1
- package/dist/assets/{story-presentation-DMSYRWaz.js → story-presentation-CYhVv8Ku.js} +1 -1
- package/dist/assets/story-three-preview-CgcLF5lE.js +2 -0
- package/dist/assets/{structural-ids-Br2zjINh.js → structural-ids-BOo2BRoY.js} +1 -1
- package/dist/assets/studio-environment-R9qXUUcC.js +2 -0
- package/dist/assets/{surface-state-1lTOi8FD.js → surface-state-D8Qnowo6.js} +1 -1
- package/dist/assets/{syntactic-prop-specs-eiQXwMIc.js → syntactic-prop-specs-8gkBuc5j.js} +1 -1
- package/dist/assets/team-playtest.service-BBMZ2iyk.js +1 -0
- package/dist/assets/{three-TCuY32m_.js → three-DiL6vMXq.js} +1 -1
- package/dist/assets/three-authoring-adapter-CkLR2zGf.js +1 -0
- package/dist/assets/three-authoring.service-CovhlCGx.js +2 -0
- package/dist/assets/{three-ingest-runtime-B7rtg3QE.js → three-ingest-runtime-CwTqAHgX.js} +1 -1
- package/dist/assets/{three-integration-BdN5Nhsg.js → three-integration-DXOFI88n.js} +2 -2
- package/dist/assets/three-integration.service-rCAqpqSp.js +1 -0
- package/dist/assets/three-projection-core-B7Lf8tOp.js +1 -0
- package/dist/assets/{three-state-DwFE3ay2.js → three-state-BCACvUtm.js} +1 -1
- package/dist/assets/{three-story-capture.service-CvpV3v5a.js → three-story-capture.service-rTFKNtHA.js} +2 -2
- package/dist/assets/{three-story-model-C2r2BuiA.js → three-story-model-BjKr7OMn.js} +1 -1
- package/dist/assets/three-viewport-presentation-CBzvc2v2.js +141 -0
- package/dist/assets/tools-DfctM216.js +1 -0
- package/dist/assets/transform-mode-request-DlEApNrA.js +1 -0
- package/dist/assets/transport-strip-xCg94CuI.js +1 -0
- package/dist/assets/transport.header-BRtdky0x.js +1 -0
- package/dist/assets/{trigger-volume-DP0G1VBe.js → trigger-volume-BLkHmfm9.js} +1 -1
- package/dist/assets/tuples-BDz3wbQL.js +1 -0
- package/dist/assets/ui-board-document-DvbK_HVN.js +2 -0
- package/dist/assets/{user-data-Bpj7diUS.js → user-data-C84W0V47.js} +1 -1
- package/dist/assets/user-data-CODoGZqA.js +1 -0
- package/dist/assets/{utility-view-state-CAfbFbKQ.js → utility-view-state-CDRxZSo-.js} +1 -1
- package/dist/assets/viewport-door-BARIpMu-.js +1 -0
- package/dist/assets/{viewport-root-presentation-vgxsTyj4.js → viewport-root-presentation-hRLF0BeO.js} +1 -1
- package/dist/assets/{viewport-surface-status-cwCiBGa7.js → viewport-surface-status-TUfhXKR9.js} +1 -1
- package/dist/assets/{webworkerAll-Cm3gTjWi.js → webworkerAll-PJtcQ1FD.js} +1 -1
- package/dist/assets/worker-BtXrsgFy.js +2 -0
- package/dist/assets/workspace-arrangement-DqG5sUns.js +1 -0
- package/dist/assets/world-documents-D69XaqUX.js +1 -0
- package/dist/assets/world-root-stage-binding-BgZWZEuD.js +1 -0
- package/dist/assets/{xstate-animation-binding-BGLxcZT_.js → xstate-animation-binding-CIyLzGHs.js} +1 -1
- package/dist/assets/{xstate-animation-meta-D_T441Ru.js → xstate-animation-meta-CbYWup3R.js} +1 -1
- package/dist/volter-shared-react.json +10 -0
- package/dist/volter-shared-three.json +3 -0
- package/dist-node/cli.js +253 -210
- package/dist-node/create.js +103 -82
- package/package.json +23 -20
- package/src/contributions.d.ts +1 -1
- package/src/index.ts +10 -10
- package/starter/cube.py +1 -1
- package/template/.agents/references/project-manual.md +17 -17
- package/template/.agents/skills/editor/SKILL.md +6 -6
- package/template/.agents/skills/editor/agents/openai.yaml +3 -3
- package/template/.agents/skills/editor/references/editor-control.md +62 -62
- package/template/{.claude/skills/vgai-3d-models → .agents/skills/volter-3d-models}/SKILL.md +3 -3
- package/template/{.github/skills/vgai-ingest-existing-game → .agents/skills/volter-ingest-existing-game}/SKILL.md +2 -2
- package/template/.agents/skills/{vgai-music → volter-music}/SKILL.md +35 -11
- package/template/{.claude/skills/vgai-threejs-authoring → .agents/skills/volter-threejs-authoring}/SKILL.md +9 -9
- package/template/.agents/skills/volter-threejs-authoring/agents/openai.yaml +4 -0
- package/template/{.github/skills/vgai-threejs-authoring → .agents/skills/volter-threejs-authoring}/references/helper-catalog.md +1 -1
- package/template/.claude/skills/editor/SKILL.md +6 -6
- package/template/.claude/skills/editor/agents/openai.yaml +3 -3
- package/template/.claude/skills/editor/references/editor-control.md +62 -62
- package/template/{.agents/skills/vgai-3d-models → .claude/skills/volter-3d-models}/SKILL.md +3 -3
- package/template/{.agents/skills/vgai-ingest-existing-game → .claude/skills/volter-ingest-existing-game}/SKILL.md +2 -2
- package/template/{.github/skills/vgai-threejs-authoring → .claude/skills/volter-threejs-authoring}/SKILL.md +9 -9
- package/template/.claude/skills/volter-threejs-authoring/agents/openai.yaml +4 -0
- package/template/.claude/skills/{vgai-threejs-authoring → volter-threejs-authoring}/references/helper-catalog.md +1 -1
- package/template/.github/copilot-instructions.md +1 -1
- package/template/.github/skills/editor/SKILL.md +6 -6
- package/template/.github/skills/editor/agents/openai.yaml +3 -3
- package/template/.github/skills/editor/references/editor-control.md +62 -62
- package/template/.github/skills/{vgai-3d-models → volter-3d-models}/SKILL.md +3 -3
- package/template/{.claude/skills/vgai-ingest-existing-game → .github/skills/volter-ingest-existing-game}/SKILL.md +2 -2
- package/template/{.agents/skills/vgai-threejs-authoring → .github/skills/volter-threejs-authoring}/SKILL.md +9 -9
- package/template/.github/skills/volter-threejs-authoring/agents/openai.yaml +4 -0
- package/template/{.agents/skills/vgai-threejs-authoring → .github/skills/volter-threejs-authoring}/references/helper-catalog.md +1 -1
- package/template/.mcp.json +3 -3
- package/template/AGENTS.md +24 -23
- package/template/DEVLOG.md +1 -1
- package/template/IDIOMS.md +3 -3
- package/template/LICENSE +3 -3
- package/template/README.md +12 -12
- package/template/check-idioms.ts +51 -51
- package/template/manifest-entry-modules-plugin.ts +17 -4
- package/template/package.json +12 -12
- package/template/server/loopback.ts +1 -1
- package/template/server/main.ts +4 -4
- package/template/server/rooms/arena-room.ts +8 -8
- package/template/server/rooms/game-room.ts +8 -8
- package/template/server/rooms.ts +2 -2
- package/template/src/bot/QaTester.tsx +1 -1
- package/template/src/bot/bot-station.ts +2 -2
- package/template/src/bot/tester-station.ts +1 -1
- package/template/src/contributions/README.md +1 -1
- package/template/src/contributions/analytics.analytics.tsx +1 -1
- package/template/src/contributions/data.document.tsx +2 -2
- package/template/src/contributions/pages.finder.ts +1 -1
- package/template/src/contributions/tester.inspector.tsx +2 -2
- package/template/src/contributions/use-game-modules.ts +1 -1
- package/template/src/input.ts +2 -2
- package/template/src/lib/reflections/volume-reflection-material.ts +59 -59
- package/template/src/lib/static-batch/Frozen.tsx +1 -1
- package/template/src/lib/static-batch/mutation-watch.ts +1 -1
- package/template/src/main.ts +58 -6
- package/template/src/manifest-entry-modules.d.ts +12 -1
- package/template/src/prefabs/HeroBox.stories.tsx +1 -1
- package/template/src/world.tsx +1 -1
- package/template/tsconfig.json +1 -1
- package/template/validate-manifest.ts +3 -3
- package/template/vite.config.ts +11 -11
- package/template/{vgai.adapter.ts → volter.adapter.ts} +1 -1
- package/template/{vgai.project.json → volter.project.json} +2 -2
- package/template-dotfiles/gitignore +27 -27
- package/workbench/src/media/game-cover.css +11 -11
- package/workbench/src/product.contribution.ts +28 -28
- package/workbench/src/{vgaiGameSkew.ts → volterGameSkew.ts} +16 -16
- package/dist/assets/AudioViewer-BDPqHDfU.js +0 -1
- package/dist/assets/CanvasBoardDocument-mxL0oJ3N.js +0 -1
- package/dist/assets/CanvasSceneViewport-C_mapCwC.js +0 -1
- package/dist/assets/ColorInput-QUPS1pEB.js +0 -1
- package/dist/assets/ImageViewer-tlVvkdM4.js +0 -1
- package/dist/assets/InspectorObjectPreview-W-y079DS.js +0 -1
- package/dist/assets/JsonAssetDocument-CPmcWFPW.js +0 -2
- package/dist/assets/ModelAssetDocument-De1HKuxG.js +0 -1
- package/dist/assets/Object3DDocumentToolbar-Cks81kCS.js +0 -1
- package/dist/assets/Object3DDocumentViewport-DCwiSY3O.js +0 -2
- package/dist/assets/OnlineAssetDetail-CNuwSQRQ.js +0 -1
- package/dist/assets/PlayBar-bT8Xdrap.js +0 -1
- package/dist/assets/ReactCanvasControls-CnJrPj-B.js +0 -1
- package/dist/assets/RootSelectionOverlay-CpaGluQu.js +0 -1
- package/dist/assets/ShadowEditor-CVtMlALn.js +0 -1
- package/dist/assets/StageHost-B89HKcvd.js +0 -2
- package/dist/assets/ThreeBoardDocument-BAgHrbtu.js +0 -2
- package/dist/assets/Toolbar-DkTHnQto.js +0 -1
- package/dist/assets/VideoViewer-DMV8lf4P.js +0 -1
- package/dist/assets/ViewportShadingMenu-CXPi6fl8.js +0 -1
- package/dist/assets/active-ingest-DA426a81.js +0 -3
- package/dist/assets/adapter-runtime-bindings-4cmsRvRh.js +0 -2
- package/dist/assets/animation-mixers.service-DK64IuYq.js +0 -1
- package/dist/assets/animation-timeline.utility-D-g0zrOl.js +0 -1
- package/dist/assets/asset-editor-persistence-BGWIqZdk.js +0 -1
- package/dist/assets/asset-loaders-C0KQI5eY.js +0 -2
- package/dist/assets/audio.utility-BmE9WMUg.js +0 -1
- package/dist/assets/autoplay.service-CjPnv3QW.js +0 -1
- package/dist/assets/binding-resolver-dE0GnZT5.js +0 -2
- package/dist/assets/blender-emscripten-engine-BeWFjMn-.js +0 -2
- package/dist/assets/blender-version.status-OsFoc9SA.js +0 -1
- package/dist/assets/blender-wali-engine-da698rDf.js +0 -2
- package/dist/assets/blender.keymap-_rF_vRX8.js +0 -1
- package/dist/assets/blender.status-ujwGU6dU.js +0 -1
- package/dist/assets/board-guides-BEKPgD9M.js +0 -1
- package/dist/assets/body-marks-RKb_LTwL.js +0 -1
- package/dist/assets/bridge.command-BF00Iefm.js +0 -3
- package/dist/assets/build-profiles.document-CqNrDdh9.js +0 -2
- package/dist/assets/build-progress.status-Bo1ZgJcb.js +0 -1
- package/dist/assets/build-session-GZcSAfPN.js +0 -9
- package/dist/assets/build.header-Bt1kwHWl.js +0 -1
- package/dist/assets/canvas-design-mount-BbLW_Nci.js +0 -6
- package/dist/assets/canvas-entry-runtime-UNYuSfG0.js +0 -2
- package/dist/assets/capability-coverage-DZ-onC5j.js +0 -7
- package/dist/assets/component-board.service-q_TM9BCw.js +0 -2
- package/dist/assets/component-contracts.service-CPbfXE1h.js +0 -1
- package/dist/assets/component-instance-root-B0C5oNEm.js +0 -1
- package/dist/assets/component-verbs.service-CnA11bJq.js +0 -1
- package/dist/assets/connection.status-Yvt0bX0r.js +0 -1
- package/dist/assets/constraints.inspector-4r8jWq5a.js +0 -1
- package/dist/assets/coverage.service-DcpEoBuf.js +0 -3
- package/dist/assets/create-runtime-DBfUy0SO.js +0 -3
- package/dist/assets/curve-DVd18iAX.js +0 -1
- package/dist/assets/data-check-core-CQEjuFyt.js +0 -1
- package/dist/assets/data-ref-CWnkj-HX.js +0 -1
- package/dist/assets/debug-bridge-D3_-EgRE.js +0 -1
- package/dist/assets/debug-registry-P0_YQGWd.js +0 -1
- package/dist/assets/design-time-layers-ChswRUJt.js +0 -1
- package/dist/assets/design-time-react-mount-C85KfXOd.js +0 -1
- package/dist/assets/edit-mode-authoring-DeCxPcHM.js +0 -1
- package/dist/assets/editor-api-BFTIRlWa.js +0 -1
- package/dist/assets/editor-presentation-activity-C7SNSmTd.js +0 -1
- package/dist/assets/entry-adjudication-Dc18TIqT.js +0 -1
- package/dist/assets/fork-menu-DpKqRhF5.js +0 -1
- package/dist/assets/game-audio-CaGKzia4.js +0 -1
- package/dist/assets/game-document.service-Chmt4065.js +0 -1
- package/dist/assets/game-eval.command-DRSvOJ_1.js +0 -2
- package/dist/assets/game-module-access-o3iXZpCA.js +0 -1
- package/dist/assets/game-network-Ct2FQYmu.js +0 -1
- package/dist/assets/gameplay-replay-BwdxV4oF.js +0 -1
- package/dist/assets/gameplay.command-Boqv1hnc.js +0 -1
- package/dist/assets/generation-DhwCUHPf.css +0 -1
- package/dist/assets/generation.service-o9aXlsx4.js +0 -1
- package/dist/assets/generations.status-BvzgHlyk.js +0 -1
- package/dist/assets/hierarchy-marks-BLPfSIym.js +0 -1
- package/dist/assets/hierarchy-marks-Cc_3lxw6.js +0 -1
- package/dist/assets/hosted-asset-materialization-BpbnhJac.js +0 -2
- package/dist/assets/index-0Lm0Nf1M.css +0 -1
- package/dist/assets/index-BHoAKyAC.js +0 -1
- package/dist/assets/index-BeK4RPgj.js +0 -1
- package/dist/assets/index-C1c3eOmm.js +0 -1
- package/dist/assets/index.module-Ycad3DJq.js +0 -1
- package/dist/assets/ingest-siblings-BtiEXLnh.js +0 -1
- package/dist/assets/ingest-source-persistence-Dmdo-UBp.js +0 -1
- package/dist/assets/ingest.service-vbCucMz7.js +0 -1
- package/dist/assets/inspection-CObLhnrs.js +0 -1
- package/dist/assets/instances.command-BwayrqNm.js +0 -1
- package/dist/assets/layered-pick-kiQf53t5.js +0 -1
- package/dist/assets/material-B_V78pTt.js +0 -1
- package/dist/assets/model-asset-sections-CFvvihfx.css +0 -1
- package/dist/assets/model-asset-sections.service-CqSclZGY.js +0 -1
- package/dist/assets/module-mode-BH2R93XP.js +0 -2
- package/dist/assets/mount-canvas-ingest-root-D1z9i5B3.js +0 -2
- package/dist/assets/mount-dom-ingest-root-BAmmNxlm.js +0 -2
- package/dist/assets/mount-ingest-root-DYR0TMIt.js +0 -2
- package/dist/assets/mount-manifest-DdkFYdVA.js +0 -1
- package/dist/assets/mount-readiness-Ds0HvvLH.js +0 -4
- package/dist/assets/mount-three-ingest-root-DVbACDUy.js +0 -1
- package/dist/assets/network-observer.service-Ce83TdsU.js +0 -1
- package/dist/assets/network.utility-DFDul2Xb.js +0 -1
- package/dist/assets/object-marks-DwvIEBOK.js +0 -1
- package/dist/assets/pixi-authoring-adapter-BChknIdC.js +0 -1
- package/dist/assets/pixi-live-write-target-BjDsBQbp.js +0 -1
- package/dist/assets/play-mode-DICV4cKP.js +0 -22
- package/dist/assets/play.command-NHyi5rzF.js +0 -2
- package/dist/assets/pose-guard-DILO6gGq.js +0 -1
- package/dist/assets/presentation-BeNFBfKg.js +0 -1
- package/dist/assets/profiler.utility-Do2Bw7MY.js +0 -1
- package/dist/assets/project-provenance-4ldz-EOG.js +0 -1
- package/dist/assets/r3f-design-session-B5GsZI5M.js +0 -2
- package/dist/assets/react-canvas-navigation-Cp3cOHJa.js +0 -1
- package/dist/assets/react-inspector.service-Bm0OnanU.js +0 -1
- package/dist/assets/react-story-board-GaXqr03H.js +0 -1
- package/dist/assets/react-world-authoring-adapter-DOjv2pYm.js +0 -1
- package/dist/assets/reflection-probe-capture.inspector-DqSW9p1v.js +0 -1
- package/dist/assets/registry-CaCdF63N.js +0 -1
- package/dist/assets/root-seam-contract-CxLZaRio.js +0 -1
- package/dist/assets/run-selection-DzEkGesJ.js +0 -2
- package/dist/assets/scene-capture-0a-bTjT8.js +0 -1
- package/dist/assets/scene-document.service-CeDwVA7t.js +0 -2
- package/dist/assets/seeded-random-BgCwIAAU.js +0 -1
- package/dist/assets/stage-overlay-set-BGE03mqb.js +0 -1
- package/dist/assets/stage-presence-markers-DIP7YMcO.js +0 -1
- package/dist/assets/stage-transform-tools-BQB7EY4l.js +0 -1
- package/dist/assets/standard-viewport-dressing-BCA51Tum.js +0 -24
- package/dist/assets/state-watch.utility-CFG1Tu1m.js +0 -1
- package/dist/assets/story-documents-BTo90DiA.js +0 -3
- package/dist/assets/story-three-preview-R1JvrggS.js +0 -2
- package/dist/assets/studio-environment-DRxxq_QX.js +0 -2
- package/dist/assets/team-playtest.service-hLfjgScx.js +0 -1
- package/dist/assets/three-authoring-adapter-htbnVej2.js +0 -1
- package/dist/assets/three-authoring.service-BIQAtVdX.js +0 -2
- package/dist/assets/three-integration.service-CS8Nvbd2.js +0 -1
- package/dist/assets/three-projection-core-CG01r5Ta.js +0 -1
- package/dist/assets/three-viewport-presentation-B0z_cECu.js +0 -141
- package/dist/assets/tools-B_NJsk05.js +0 -1
- package/dist/assets/transform-mode-request-DzD9aUNA.js +0 -1
- package/dist/assets/transport-strip-CUjNltnb.js +0 -1
- package/dist/assets/transport.header-Bb4FpQ8J.js +0 -1
- package/dist/assets/tuples-DfWSY2tr.js +0 -1
- package/dist/assets/ui-board-document-CCiiXjX9.js +0 -2
- package/dist/assets/user-data-dHvLdpwM.js +0 -1
- package/dist/assets/viewport-door-Bj_ZIP85.js +0 -1
- package/dist/assets/worker-CC9Ug5Ei.js +0 -2
- package/dist/assets/workspace-arrangement-BdAlBwvd.js +0 -1
- package/dist/assets/world-documents-DBybpBq8.js +0 -1
- package/dist/assets/world-root-stage-binding-ZVYIgr74.js +0 -1
- package/dist/vgai-shared-react.json +0 -10
- package/dist/vgai-shared-three.json +0 -3
- package/template/.agents/skills/vgai-threejs-authoring/agents/openai.yaml +0 -4
- package/template/.claude/skills/vgai-threejs-authoring/agents/openai.yaml +0 -4
- package/template/.github/skills/vgai-threejs-authoring/agents/openai.yaml +0 -4
- /package/dist/assets/{vgai-shared-fontawesome-CU65D4Ij.js → volter-shared-fontawesome-CU65D4Ij.js} +0 -0
- /package/dist/assets/{vgai-shared-jsx-dev-runtime-DFDKL7fx.js → volter-shared-jsx-dev-runtime-DFDKL7fx.js} +0 -0
- /package/dist/assets/{vgai-shared-jsx-runtime-DIqBpTut.js → volter-shared-jsx-runtime-DIqBpTut.js} +0 -0
- /package/dist/assets/{vgai-shared-react-BT7rMc2H.js → volter-shared-react-BT7rMc2H.js} +0 -0
- /package/dist/assets/{vgai-shared-react-dom-DFajMqMT.js → volter-shared-react-dom-DFajMqMT.js} +0 -0
- /package/dist/assets/{vgai-shared-react-dom-client-S0ozfl6_.js → volter-shared-react-dom-client-S0ozfl6_.js} +0 -0
- /package/dist/assets/{vgai-shared-three-DH4yxKwt.js → volter-shared-three-DH4yxKwt.js} +0 -0
- /package/template/{.vgai → .volter}/assets.json +0 -0
- /package/template/{.vgai → .volter}/provenance.json +0 -0
package/dist-node/cli.js
CHANGED
|
@@ -72,7 +72,7 @@ var init_client = __esm({
|
|
|
72
72
|
* the receipt window closing unanswered, a beating-but-dead tab, and no tab
|
|
73
73
|
* present at all. The last four can fail in milliseconds.
|
|
74
74
|
*
|
|
75
|
-
* A caller that converges by retrying (`
|
|
75
|
+
* A caller that converges by retrying (the editor's `restart` command) needs the distinction
|
|
76
76
|
* because a refusal the editor ANSWERED may go differently next time, while
|
|
77
77
|
* a command the relay abandoned tells you nothing new on a second identical
|
|
78
78
|
* attempt — and when the abandonment was a 120s budget, re-running it three
|
|
@@ -231,22 +231,22 @@ var init_client = __esm({
|
|
|
231
231
|
return data;
|
|
232
232
|
}
|
|
233
233
|
// --- Play control ---
|
|
234
|
-
/** `opts.seed` (D15/T-D15.6, objection-4 fix) — `
|
|
234
|
+
/** `opts.seed` (D15/T-D15.6, objection-4 fix) — the editor's `play --seed <n>` command's
|
|
235
235
|
* explicit config leg, relayed as `cmd['seed']`; `handleCommand`'s
|
|
236
236
|
* `'play'` case threads it into `enterPlayMode`'s highest-precedence seed
|
|
237
|
-
* argument (beats manifest.determinism.defaultSeed/?
|
|
237
|
+
* argument (beats manifest.determinism.defaultSeed/?volter-seed=). Omitted,
|
|
238
238
|
* boot seeding falls back to that precedence unchanged.
|
|
239
239
|
*
|
|
240
|
-
* `opts.name` (`
|
|
240
|
+
* `opts.name` (the editor's `play --name <text>` command) — an OPTIONAL label for this run,
|
|
241
241
|
* relayed as `cmd['name']` and slugified server-side into the run's
|
|
242
242
|
* `logs/play-*.jsonl` filename and its session-journal line. Findability
|
|
243
243
|
* only: no registry, no uniqueness, no lookup verb — grep and `ls` are the
|
|
244
244
|
* query engine. Omitted, the filename keeps its exact unnamed shape. */
|
|
245
|
-
/* `opts.record` (`
|
|
245
|
+
/* `opts.record` (the editor's `play --record <name>` command) — NAMES this run's recording
|
|
246
246
|
* file. It does not ENABLE recording: every relayed play records, with no
|
|
247
|
-
* flag (see `@
|
|
247
|
+
* flag (see `@volter/game`'s `src/play/play-recording.ts`). Omitted, the clip is named for
|
|
248
248
|
* the durable Gameplay Session; named, it becomes an explicit keepsake in
|
|
249
|
-
* `.
|
|
249
|
+
* `.volter/recordings/<name>.webm`. */
|
|
250
250
|
async play(opts) {
|
|
251
251
|
return this.command({
|
|
252
252
|
type: "play",
|
|
@@ -347,9 +347,9 @@ var init_client = __esm({
|
|
|
347
347
|
return { base64: data.base64, mimeType: data.mimeType };
|
|
348
348
|
}
|
|
349
349
|
/**
|
|
350
|
-
* Unit 4 (live-front-door wave) — capture the RUNNING GAME (
|
|
351
|
-
* screenshot`'s wire leg). Sends the SAME `bridge-screenshot` relay op
|
|
352
|
-
* `@
|
|
350
|
+
* Unit 4 (live-front-door wave) — capture the RUNNING GAME (the editor's
|
|
351
|
+
* `screenshot`'s wire leg). Sends the SAME `bridge-screenshot` relay op
|
|
352
|
+
* `@volter/live`'s `RelayTransport.screenshot` (and therefore
|
|
353
353
|
* `game.screenshot()` on the relay path) already sends, so all three
|
|
354
354
|
* surfaces composite the identical full game stack — canvas(es) plus the
|
|
355
355
|
* HUD/react DOM layers — rather than any of them inventing a second,
|
|
@@ -367,8 +367,8 @@ var init_client = __esm({
|
|
|
367
367
|
* refuses it with `BRIDGE_SCREENSHOT_STALE` rather than pass it off as
|
|
368
368
|
* current. Setting this asks the relay to render exactly ONE deterministic
|
|
369
369
|
* tick (`runTicks(1, {render:'last'})`) first — the same escape
|
|
370
|
-
* `@
|
|
371
|
-
* `
|
|
370
|
+
* `@volter/live`'s `RelayTransport.screenshot` has always used, which is why
|
|
371
|
+
* the editor's `eval` command could recover these frames while the editor's `screenshot` command could not.
|
|
372
372
|
* Off by default: a caller who does not ask must never be handed a frame
|
|
373
373
|
* that only exists because the capture drove the game.
|
|
374
374
|
*/
|
|
@@ -453,8 +453,8 @@ var init_client = __esm({
|
|
|
453
453
|
...source,
|
|
454
454
|
...options
|
|
455
455
|
},
|
|
456
|
-
// Photographing changes nothing, and this is the relay `
|
|
457
|
-
// <module>`
|
|
456
|
+
// Photographing changes nothing, and this is the relay the editor's `screenshot
|
|
457
|
+
// <module>` command and `project.bake.preview` ride — the lane where a momentary
|
|
458
458
|
// transport failure cost a cold agent three probe modules.
|
|
459
459
|
{ retryTransport: true }
|
|
460
460
|
);
|
|
@@ -468,7 +468,7 @@ var init_client = __esm({
|
|
|
468
468
|
};
|
|
469
469
|
}
|
|
470
470
|
/**
|
|
471
|
-
* A project-defined labeled shot set (`
|
|
471
|
+
* A project-defined labeled shot set (the editor's `screenshot <target> --shots <set>` command):
|
|
472
472
|
* the DEFINITION travels with the command (project data — see
|
|
473
473
|
* `AssetPreviewShotSetDefinition`; the CLI resolves it from the registered
|
|
474
474
|
* `project.<set>.previewShots` tool), and the editor's generic
|
|
@@ -497,8 +497,8 @@ var init_client = __esm({
|
|
|
497
497
|
};
|
|
498
498
|
}
|
|
499
499
|
/**
|
|
500
|
-
* B8.4 — score the asset against a reference GLB (`
|
|
501
|
-
* <model.glb> --compare <ref.glb>`): matched orthographic front + side silhouettes
|
|
500
|
+
* B8.4 — score the asset against a reference GLB (the editor's `screenshot
|
|
501
|
+
* <model.glb> --compare <ref.glb>` command): matched orthographic front + side silhouettes
|
|
502
502
|
* (equal-height bounding-box framing, both yaw-normalized to face the
|
|
503
503
|
* camera), per-view IoU numbers, and overlay evidence images. The
|
|
504
504
|
* reference GLB's raw bytes travel base64 in the command; the editor
|
|
@@ -515,7 +515,7 @@ var init_client = __esm({
|
|
|
515
515
|
return { width: data.width, height: data.height, views: data.views };
|
|
516
516
|
}
|
|
517
517
|
/**
|
|
518
|
-
* The STORY lane (`
|
|
518
|
+
* The STORY lane (the editor's `screenshot <file>.stories.tsx` command): every CSF export of
|
|
519
519
|
* one project story file rendered in the live session's DOM and captured
|
|
520
520
|
* through the same composite leg {@link captureGame} uses, returned as
|
|
521
521
|
* per-export images plus one variant sheet. `options.story` narrows to a
|
|
@@ -647,9 +647,9 @@ var init_client = __esm({
|
|
|
647
647
|
* Run ONE command by id — the door to everything the command palette lists.
|
|
648
648
|
*
|
|
649
649
|
* Under the Code-OSS frame this is the workbench's own `ICommandService`, so
|
|
650
|
-
* any command id works: a view's `
|
|
651
|
-
* `
|
|
652
|
-
* command service and answers the `
|
|
650
|
+
* any command id works: a view's `volter.<view>.<verb>`, an editor action's
|
|
651
|
+
* `volter.action.<id>`, or one of VS Code's own. Standalone the editor's `edit` command has no
|
|
652
|
+
* command service and answers the `volter.<view>.<verb>` shape directly off
|
|
653
653
|
* the views registry, refusing anything else BY NAME.
|
|
654
654
|
*
|
|
655
655
|
* The result is whatever the command answered — a view verb's state, or
|
|
@@ -845,7 +845,7 @@ var init_client = __esm({
|
|
|
845
845
|
* `blender-object-info`, `blender-screenshot-view`, `blender-read-file`,
|
|
846
846
|
* `blender-write-file`, `blender-list-files`, `blender-start`,
|
|
847
847
|
* `blender-status`): Blender runs in the editor tab's worker, and
|
|
848
|
-
* `
|
|
848
|
+
* `volter blender-mcp` is transport onto these. `blender-status` is the only
|
|
849
849
|
* one that creates nothing — it answers whether this tab already has a
|
|
850
850
|
* session, which is how a caller survives an editor restart.
|
|
851
851
|
*/
|
|
@@ -919,7 +919,7 @@ var init_client = __esm({
|
|
|
919
919
|
return data.projects;
|
|
920
920
|
}
|
|
921
921
|
// --- Registered project tools ---
|
|
922
|
-
/** List tools explicitly registered in `package.json#
|
|
922
|
+
/** List tools explicitly registered in `package.json#volter.tools`.
|
|
923
923
|
* The editor server loads callable metadata in Node; modules never enter the
|
|
924
924
|
* editor browser merely because they were listed. */
|
|
925
925
|
async listProjectTools() {
|
|
@@ -2034,7 +2034,7 @@ ${tool.description}` } : tool
|
|
|
2034
2034
|
const defaults = blender_mcp_defaults_default;
|
|
2035
2035
|
const mirror = new Mirror(project, [
|
|
2036
2036
|
project,
|
|
2037
|
-
...(process.env["
|
|
2037
|
+
...(process.env["VOLTER_BLENDER_MIRROR_ROOTS"] ?? "").split(":").filter((root) => root.startsWith("/"))
|
|
2038
2038
|
], `${command} blender-mcp`);
|
|
2039
2039
|
const tab = new TabSession(project, ensureEditor);
|
|
2040
2040
|
const server = new Server(
|
|
@@ -2246,7 +2246,7 @@ var init_blender_mcp = __esm({
|
|
|
2246
2246
|
#origin = null;
|
|
2247
2247
|
#port = null;
|
|
2248
2248
|
/** A replay starts with a fresh model once; ordinary agent sessions persist. */
|
|
2249
|
-
#freshSessionPending = Boolean(process.env["
|
|
2249
|
+
#freshSessionPending = Boolean(process.env["VOLTER_BLENDER_FRESH_SESSION"]);
|
|
2250
2250
|
async client() {
|
|
2251
2251
|
if (this.#client) return this.#client;
|
|
2252
2252
|
if (!this.#connecting) {
|
|
@@ -2310,7 +2310,7 @@ import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
|
2310
2310
|
var package_default = {
|
|
2311
2311
|
name: "@volter/game-editor",
|
|
2312
2312
|
author: "Volter AI, Inc.",
|
|
2313
|
-
version: "0.5.
|
|
2313
|
+
version: "0.5.69",
|
|
2314
2314
|
publishConfig: {
|
|
2315
2315
|
access: "public"
|
|
2316
2316
|
},
|
|
@@ -2337,6 +2337,7 @@ var package_default = {
|
|
|
2337
2337
|
"workbench",
|
|
2338
2338
|
"template",
|
|
2339
2339
|
"template-dotfiles",
|
|
2340
|
+
"additions",
|
|
2340
2341
|
"catalog",
|
|
2341
2342
|
"starter",
|
|
2342
2343
|
"BUNDLED_NOTICES"
|
|
@@ -2346,34 +2347,34 @@ var package_default = {
|
|
|
2346
2347
|
"build:node": "node scripts/build-node.mjs",
|
|
2347
2348
|
typecheck: "tsc -p tsconfig.node.json"
|
|
2348
2349
|
},
|
|
2349
|
-
|
|
2350
|
+
volter: {
|
|
2350
2351
|
product: {
|
|
2351
2352
|
entry: "./src/index.ts",
|
|
2352
2353
|
displayName: "Volter Game Editor",
|
|
2353
2354
|
colorTheme: "dark",
|
|
2354
2355
|
workbench: {
|
|
2355
|
-
release: "game-editor-
|
|
2356
|
-
tarballSha256: "
|
|
2356
|
+
release: "game-editor-f16dc165c0df-7829035e8e51-darwin-arm64",
|
|
2357
|
+
tarballSha256: "5737029b2bfe64a22466ccf000e80056cf9cebfdc3650022a27fa990e037a421"
|
|
2357
2358
|
}
|
|
2358
2359
|
}
|
|
2359
2360
|
},
|
|
2360
2361
|
dependencies: {
|
|
2361
|
-
"@volter/editor-core": "0.5.
|
|
2362
|
-
"@volter/editor-game": "0.5.
|
|
2363
|
-
"@volter/editor-react": "0.5.
|
|
2364
|
-
"@volter/editor-threejs": "0.5.
|
|
2365
|
-
"@volter/editor-xstate": "0.5.
|
|
2366
|
-
"@volter/editor-blender": "0.1.
|
|
2367
|
-
"@volter/dawproject": "0.5.
|
|
2368
|
-
"@volter/editor-dawproject": "0.5.
|
|
2369
|
-
"@volter/blender-engine": "0.1.
|
|
2370
|
-
"@volter/editor-project": "0.5.
|
|
2371
|
-
"@volter/editor-sdk": "0.5.
|
|
2372
|
-
"@volter/editor-live": "0.5.
|
|
2373
|
-
"@volter/game-live": "0.5.
|
|
2362
|
+
"@volter/editor-core": "0.5.69",
|
|
2363
|
+
"@volter/editor-game": "0.5.69",
|
|
2364
|
+
"@volter/editor-react": "0.5.69",
|
|
2365
|
+
"@volter/editor-threejs": "0.5.69",
|
|
2366
|
+
"@volter/editor-xstate": "0.5.69",
|
|
2367
|
+
"@volter/editor-blender": "0.1.12",
|
|
2368
|
+
"@volter/dawproject": "0.5.69",
|
|
2369
|
+
"@volter/editor-dawproject": "0.5.69",
|
|
2370
|
+
"@volter/blender-engine": "0.1.10",
|
|
2371
|
+
"@volter/editor-project": "0.5.69",
|
|
2372
|
+
"@volter/editor-sdk": "0.5.69",
|
|
2373
|
+
"@volter/editor-live": "0.5.69",
|
|
2374
|
+
"@volter/game-live": "0.5.69",
|
|
2374
2375
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
2375
|
-
"@volter/game-runtime": "0.5.
|
|
2376
|
-
"@volter/threejs-runtime": "0.5.
|
|
2376
|
+
"@volter/game-runtime": "0.5.69",
|
|
2377
|
+
"@volter/threejs-runtime": "0.5.69",
|
|
2377
2378
|
undici: "7.29.1",
|
|
2378
2379
|
typescript: "5.9.3",
|
|
2379
2380
|
"@colyseus/schema": "^4.0.14",
|
|
@@ -2397,7 +2398,9 @@ var package_default = {
|
|
|
2397
2398
|
vite: "^6.4.3",
|
|
2398
2399
|
ztrack: "^1.5.5",
|
|
2399
2400
|
"three-bvh-csg": "^0.0.18",
|
|
2400
|
-
"three-mesh-bvh": "^0.9.12"
|
|
2401
|
+
"three-mesh-bvh": "^0.9.12",
|
|
2402
|
+
"@pixi/react": "8.0.5",
|
|
2403
|
+
"pixi.js": "^8.6.0"
|
|
2401
2404
|
},
|
|
2402
2405
|
bin: {
|
|
2403
2406
|
"volter-game-editor": "./dist-node/cli.js"
|
|
@@ -2410,7 +2413,7 @@ import { dirname as dirname4, join as join6, resolve as resolve4 } from "node:pa
|
|
|
2410
2413
|
import { fileURLToPath } from "node:url";
|
|
2411
2414
|
|
|
2412
2415
|
// node/scaffold/additions.ts
|
|
2413
|
-
var SCAFFOLD_ADDITIONS = ["three", "ui", "server", "blender", "studio"];
|
|
2416
|
+
var SCAFFOLD_ADDITIONS = ["three", "canvas", "ui", "server", "blender", "studio"];
|
|
2414
2417
|
var ADDITION_REQUIRES = {
|
|
2415
2418
|
studio: ["three"]
|
|
2416
2419
|
};
|
|
@@ -2583,7 +2586,7 @@ const meta = {
|
|
|
2583
2586
|
// states below render its presentational body with authored props.
|
|
2584
2587
|
component: GameUI,
|
|
2585
2588
|
render: (args) => <ReactGamePage {...args} />,
|
|
2586
|
-
parameters: {
|
|
2589
|
+
parameters: { volter: { defaultStory: 'Ready' } },
|
|
2587
2590
|
args: { lastInput: 'Ready', title: 'My Game' },
|
|
2588
2591
|
} satisfies Meta<typeof ReactGamePage>;
|
|
2589
2592
|
|
|
@@ -2598,15 +2601,15 @@ export const LongTitle: Story = {
|
|
|
2598
2601
|
`;
|
|
2599
2602
|
var REACT_ONLY_MAIN_SOURCE = `/**
|
|
2600
2603
|
* Standalone entry point: this game's own boot, in its own libraries. Every
|
|
2601
|
-
* \`dom\` root \`
|
|
2604
|
+
* \`dom\` root \`volter.project.json\` declares renders its entry's default export
|
|
2602
2605
|
* with react-dom, in one layer of \`#game-canvas\` per root, stacked by
|
|
2603
2606
|
* \`zOrder\`. The editor mounts the same entries itself.
|
|
2604
2607
|
*/
|
|
2605
2608
|
|
|
2606
2609
|
import { type ComponentType, createElement } from 'react';
|
|
2607
2610
|
import { createRoot } from 'react-dom/client';
|
|
2608
|
-
import { manifestEntryModules } from 'virtual:
|
|
2609
|
-
import manifest from '../
|
|
2611
|
+
import { manifestEntryModules } from 'virtual:volter-manifest-entries';
|
|
2612
|
+
import manifest from '../volter.project.json';
|
|
2610
2613
|
|
|
2611
2614
|
interface DeclaredRoot {
|
|
2612
2615
|
readonly id: string;
|
|
@@ -2644,7 +2647,7 @@ var REACT_ONLY_FILES = {
|
|
|
2644
2647
|
};
|
|
2645
2648
|
function withEditorDeclaration(source, declaration2) {
|
|
2646
2649
|
if (!source.includes("defineAdapter({"))
|
|
2647
|
-
throw new Error("Starter
|
|
2650
|
+
throw new Error("Starter volter.adapter.ts must call defineAdapter({ ... }).");
|
|
2648
2651
|
const look = [
|
|
2649
2652
|
declaration2.style ? `, style: ${declaration2.style.name}` : "",
|
|
2650
2653
|
declaration2.keymap ? `, keymap: ${declaration2.keymap.name}` : ""
|
|
@@ -2662,9 +2665,9 @@ function withEditorDeclaration(source, declaration2) {
|
|
|
2662
2665
|
return `${imports}${source.replace("defineAdapter({", `defineAdapter({
|
|
2663
2666
|
${editor}`)}`;
|
|
2664
2667
|
}
|
|
2665
|
-
var MODELS_AGENTS_CONTRACT = `# AGENTS.md \u2014
|
|
2668
|
+
var MODELS_AGENTS_CONTRACT = `# AGENTS.md \u2014 VOLTER Models Project
|
|
2666
2669
|
|
|
2667
|
-
A standalone modeling project built with
|
|
2670
|
+
A standalone modeling project built with VOLTER \u2014 Blender itself, compiled to
|
|
2668
2671
|
WebAssembly and running headless in the editor tab's worker, over this
|
|
2669
2672
|
project's own \`.blend\` files. Work here, not in the engine repo. The editor
|
|
2670
2673
|
is the authoring and verification surface; nothing here plays.
|
|
@@ -2675,7 +2678,7 @@ is the authoring and verification surface; nothing here plays.
|
|
|
2675
2678
|
| --- | --- |
|
|
2676
2679
|
| Model, revise or add a model | \`src/models/<name>.blend\` \u2014 read \`src/models/cube.py\`'s docstring first |
|
|
2677
2680
|
| Open the editor, look, or verify | \`.agents/skills/editor/SKILL.md\` |
|
|
2678
|
-
| Blender-style modeling craft | \`.agents/skills/
|
|
2681
|
+
| Blender-style modeling craft | \`.agents/skills/volter-3d-models/SKILL.md\` |
|
|
2679
2682
|
|
|
2680
2683
|
\`.agents/\` is canonical; \`.claude/skills/\` and \`.github/skills/\` are
|
|
2681
2684
|
generated projections (never edit); \`CLAUDE.md\` and
|
|
@@ -2691,7 +2694,7 @@ opens. The document does not run the script \u2014 you do, through the session's
|
|
|
2691
2694
|
Blender:
|
|
2692
2695
|
|
|
2693
2696
|
\`\`\`bash
|
|
2694
|
-
npm run --silent
|
|
2697
|
+
npm run --silent volter -- blender-mcp # the MCP transport onto the tab's Blender
|
|
2695
2698
|
\`\`\`
|
|
2696
2699
|
|
|
2697
2700
|
Every call is ordinary bpy against the open document, and the session saves it
|
|
@@ -2702,33 +2705,33 @@ finder lists every \`.blend\` as a document. Coordinates are metres and Z is up
|
|
|
2702
2705
|
## The editor
|
|
2703
2706
|
|
|
2704
2707
|
Workspaces: \`model\`, \`sculpt\`, \`texture\`, \`animate\`, \`design\`, \`look\`
|
|
2705
|
-
(\`npm run --silent
|
|
2708
|
+
(\`npm run --silent volter -- eval 'editor.workspace("sculpt")'\`; a wrong id
|
|
2706
2709
|
refuses and names the list). The look and keymap are Blender's
|
|
2707
2710
|
(\`@volter/editor-blender\` contributes them). There is no Game workspace and
|
|
2708
|
-
\`
|
|
2711
|
+
\`volter-game-editor play\` refuses: this project declares no roots.
|
|
2709
2712
|
|
|
2710
2713
|
## Verification contract \u2014 after every change
|
|
2711
2714
|
|
|
2712
2715
|
1. \`npm run typecheck\` \u2014 the gate.
|
|
2713
2716
|
2. Open the model's document and read the change through a door:
|
|
2714
|
-
\`npm run --silent
|
|
2715
|
-
document; \`npm run --silent
|
|
2717
|
+
\`npm run --silent volter -- eval 'editor.currentView()'\` names the open
|
|
2718
|
+
document; \`npm run --silent volter -- screenshot editor\` shows it; and
|
|
2716
2719
|
\`get_scene_info\` over \`blender-mcp\` is what the engine itself says is in
|
|
2717
2720
|
the file.
|
|
2718
|
-
3. \`npm run --silent
|
|
2721
|
+
3. \`npm run --silent volter -- console\` silent \u2014 an unresolved entry is
|
|
2719
2722
|
remaining work, never noise.
|
|
2720
2723
|
|
|
2721
2724
|
## Commands
|
|
2722
2725
|
|
|
2723
2726
|
\\\`\\\`\\\`bash
|
|
2724
2727
|
npm run dev # open/reuse this project's editor
|
|
2725
|
-
npm run --silent
|
|
2726
|
-
npm run --silent
|
|
2727
|
-
npm run --silent
|
|
2728
|
+
npm run --silent volter -- status # require connected: true
|
|
2729
|
+
npm run --silent volter -- screenshot # visible evidence
|
|
2730
|
+
npm run --silent volter -- eval '<js>' # THE door onto the editor
|
|
2728
2731
|
npm run typecheck # THE gate
|
|
2729
2732
|
\\\`\\\`\\\`
|
|
2730
2733
|
|
|
2731
|
-
Always \`npm run --silent
|
|
2734
|
+
Always \`npm run --silent volter -- <verb>\`, never a bare \`volter\` (a global one may
|
|
2732
2735
|
belong to another checkout).
|
|
2733
2736
|
`;
|
|
2734
2737
|
function withAgentsContract(source, additions) {
|
|
@@ -2799,7 +2802,7 @@ function assertScaffoldComposition(value, source, product) {
|
|
|
2799
2802
|
if (!packages.includes(product))
|
|
2800
2803
|
fail(
|
|
2801
2804
|
source,
|
|
2802
|
-
`compose() returned editorPackages ${JSON.stringify(packages)}, which omits ${product}. A scaffolded project declares the product it opens in \u2014 that declaration is how \`
|
|
2805
|
+
`compose() returned editorPackages ${JSON.stringify(packages)}, which omits ${product}. A scaffolded project declares the product it opens in \u2014 that declaration is how \`volter edit\` finds the editor to run (ARCHITECTURE-CORE \xA7The target shape, rule 4).`
|
|
2803
2806
|
);
|
|
2804
2807
|
const editor = composition?.editor;
|
|
2805
2808
|
if (typeof editor?.inspector !== "string" || editor.inspector.length === 0)
|
|
@@ -2834,7 +2837,7 @@ import {
|
|
|
2834
2837
|
} from "node:fs";
|
|
2835
2838
|
import { basename, dirname as dirname2, join as join4, relative as relative3, resolve as resolve2 } from "node:path";
|
|
2836
2839
|
|
|
2837
|
-
//
|
|
2840
|
+
// ../../node_modules/jsonc-parser/lib/esm/impl/scanner.js
|
|
2838
2841
|
function createScanner(text2, ignoreTrivia = false) {
|
|
2839
2842
|
const len = text2.length;
|
|
2840
2843
|
let pos = 0, value = "", tokenOffset = 0, token = 16, lineNumber = 0, lineStartOffset = 0, tokenLineStartOffset = 0, prevTokenLineStartOffset = 0, scanError = 0;
|
|
@@ -3255,7 +3258,7 @@ var CharacterCodes;
|
|
|
3255
3258
|
CharacterCodes2[CharacterCodes2["tab"] = 9] = "tab";
|
|
3256
3259
|
})(CharacterCodes || (CharacterCodes = {}));
|
|
3257
3260
|
|
|
3258
|
-
//
|
|
3261
|
+
// ../../node_modules/jsonc-parser/lib/esm/impl/string-intern.js
|
|
3259
3262
|
var cachedSpaces = new Array(20).fill(0).map((_, index) => {
|
|
3260
3263
|
return " ".repeat(index);
|
|
3261
3264
|
});
|
|
@@ -3285,7 +3288,7 @@ var cachedBreakLinesWithSpaces = {
|
|
|
3285
3288
|
}
|
|
3286
3289
|
};
|
|
3287
3290
|
|
|
3288
|
-
//
|
|
3291
|
+
// ../../node_modules/jsonc-parser/lib/esm/impl/parser.js
|
|
3289
3292
|
var ParseOptions;
|
|
3290
3293
|
(function(ParseOptions2) {
|
|
3291
3294
|
ParseOptions2.DEFAULT = {
|
|
@@ -3641,7 +3644,7 @@ function visit(text2, visitor, options = ParseOptions.DEFAULT) {
|
|
|
3641
3644
|
return true;
|
|
3642
3645
|
}
|
|
3643
3646
|
|
|
3644
|
-
//
|
|
3647
|
+
// ../../node_modules/jsonc-parser/lib/esm/main.js
|
|
3645
3648
|
var ScanError;
|
|
3646
3649
|
(function(ScanError2) {
|
|
3647
3650
|
ScanError2[ScanError2["None"] = 0] = "None";
|
|
@@ -3735,8 +3738,8 @@ import { existsSync } from "node:fs";
|
|
|
3735
3738
|
import { join } from "node:path";
|
|
3736
3739
|
|
|
3737
3740
|
// ../editor-project/src/manifest/filename.ts
|
|
3738
|
-
var MANIFEST_FILENAME = "
|
|
3739
|
-
var REMOVED_MANIFEST_FILENAME = "
|
|
3741
|
+
var MANIFEST_FILENAME = "volter.project.json";
|
|
3742
|
+
var REMOVED_MANIFEST_FILENAME = "volter.game.json";
|
|
3740
3743
|
function removedManifestFilenameMessage(where) {
|
|
3741
3744
|
return `${where}: found \`${REMOVED_MANIFEST_FILENAME}\` and no \`${MANIFEST_FILENAME}\`. \`${REMOVED_MANIFEST_FILENAME}\` was REMOVED (the legacy-removal doctrine, docs/ARCHITECTURE-CORE.md \xA7Vocabulary) \u2014 nothing reads it any more, and it is deliberately NOT read as a fallback, because a second accepted name is the defect.
|
|
3742
3745
|
Fix: rename it \u2014 \`git mv ${REMOVED_MANIFEST_FILENAME} ${MANIFEST_FILENAME}\`. The contents are unchanged; only the filename moved.`;
|
|
@@ -3762,7 +3765,7 @@ import { execFileSync } from "node:child_process";
|
|
|
3762
3765
|
import { createHash } from "node:crypto";
|
|
3763
3766
|
import { mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3764
3767
|
import { join as join2, relative, sep } from "node:path";
|
|
3765
|
-
var SCAFFOLD_BASELINE_RELATIVE_PATH = ".
|
|
3768
|
+
var SCAFFOLD_BASELINE_RELATIVE_PATH = ".volter/scaffold-baseline.json";
|
|
3766
3769
|
function readEngineSourceState(engineDir) {
|
|
3767
3770
|
try {
|
|
3768
3771
|
const sha = execFileSync("git", ["-C", engineDir, "rev-parse", "HEAD"], {
|
|
@@ -3804,7 +3807,7 @@ function buildScaffoldBaseline(targetDir, engineVersion, engineDir) {
|
|
|
3804
3807
|
}
|
|
3805
3808
|
function writeScaffoldBaseline(targetDir, engineVersion, engineDir) {
|
|
3806
3809
|
const baseline = buildScaffoldBaseline(targetDir, engineVersion, engineDir);
|
|
3807
|
-
mkdirSync(join2(targetDir, ".
|
|
3810
|
+
mkdirSync(join2(targetDir, ".volter"), { recursive: true });
|
|
3808
3811
|
writeFileSync(
|
|
3809
3812
|
join2(targetDir, SCAFFOLD_BASELINE_RELATIVE_PATH),
|
|
3810
3813
|
`${JSON.stringify(baseline, null, 2)}
|
|
@@ -3906,7 +3909,7 @@ ${indent}},`;
|
|
|
3906
3909
|
}
|
|
3907
3910
|
function mergeAdapterRegionIncludes(source, additions) {
|
|
3908
3911
|
if (additions.length === 0) return { kind: "unchanged" };
|
|
3909
|
-
const parsed = typescript().createSourceFile("
|
|
3912
|
+
const parsed = typescript().createSourceFile("volter.adapter.ts", source, typescript().ScriptTarget.Latest, true);
|
|
3910
3913
|
const definition = definitionObject(parsed);
|
|
3911
3914
|
if ("reason" in definition) return { kind: "unreadable", reason: definition.reason };
|
|
3912
3915
|
const listed = propertyOf(definition.object, "regions");
|
|
@@ -3997,7 +4000,7 @@ function finderText(addition, quote) {
|
|
|
3997
4000
|
}
|
|
3998
4001
|
function mergeAdapterFinders(source, additions) {
|
|
3999
4002
|
if (additions.length === 0) return { kind: "unchanged" };
|
|
4000
|
-
const parsed = typescript().createSourceFile("
|
|
4003
|
+
const parsed = typescript().createSourceFile("volter.adapter.ts", source, typescript().ScriptTarget.Latest, true);
|
|
4001
4004
|
const definition = definitionObject(parsed);
|
|
4002
4005
|
if ("reason" in definition) return { kind: "unreadable", reason: definition.reason };
|
|
4003
4006
|
const quote = quoteLike(source, void 0);
|
|
@@ -4058,7 +4061,7 @@ ${indentAt(source, array.getStart())}${source.slice(closing)}`;
|
|
|
4058
4061
|
}
|
|
4059
4062
|
|
|
4060
4063
|
// node/scaffold/catalog.ts
|
|
4061
|
-
var PROJECT_CATALOG_DIR = join3(".
|
|
4064
|
+
var PROJECT_CATALOG_DIR = join3(".volter", "catalog");
|
|
4062
4065
|
var CATALOG_SURFACES = ["three", "canvas", "dom"];
|
|
4063
4066
|
var CAPABILITY_STAMP_FILENAME = "capability.json";
|
|
4064
4067
|
function capabilityStampPath(entry) {
|
|
@@ -4077,7 +4080,7 @@ function stringArray(value, field, manifestPath) {
|
|
|
4077
4080
|
var RENAMED_CAPABILITY_IDS = /* @__PURE__ */ new Map([["mesh", "blender"]]);
|
|
4078
4081
|
function renamedCapabilityIdMessage(where, oldId, newId) {
|
|
4079
4082
|
return `${where}: capability id \`${oldId}\` was RENAMED to \`${newId}\` (2026-09-19). Nothing reads \`${oldId}\` any more, and it is deliberately NOT mapped onto \`${newId}\`, because a second accepted name is the defect.
|
|
4080
|
-
Fix: in this project, rename the file \u2014 \`git mv .
|
|
4083
|
+
Fix: in this project, rename the file \u2014 \`git mv .volter/catalog/${oldId}.json .volter/catalog/${newId}.json\` \u2014 and change its \`"id"\` to \`"${newId}"\`. If a stamp file names the old id, rename that too (\`src/tools/${oldId}.*\` -> \`src/tools/${newId}.*\`). Then \`volter-game-editor outdated\` will report against the current entry. Nothing else about the capability changed.`;
|
|
4081
4084
|
}
|
|
4082
4085
|
function readCatalogEntry(path) {
|
|
4083
4086
|
const parsed = JSON.parse(readFileSync2(path, "utf8"));
|
|
@@ -4115,15 +4118,15 @@ function readCatalogEntry(path) {
|
|
|
4115
4118
|
path
|
|
4116
4119
|
);
|
|
4117
4120
|
const scripts = readStringRecord(packageJson["scripts"], "scripts", path);
|
|
4118
|
-
const
|
|
4119
|
-
if (
|
|
4120
|
-
throw new Error(`${path}: packageJson.
|
|
4121
|
+
const volterTools = packageJson["volterTools"];
|
|
4122
|
+
if (volterTools !== void 0 && (!Array.isArray(volterTools) || volterTools.some((entry) => typeof entry !== "string" && !isRecord(entry)))) {
|
|
4123
|
+
throw new Error(`${path}: packageJson.volterTools must be an array of module paths`);
|
|
4121
4124
|
}
|
|
4122
4125
|
manifest.packageJson = {
|
|
4123
4126
|
...dependencies ? { dependencies } : {},
|
|
4124
4127
|
...devDependencies ? { devDependencies } : {},
|
|
4125
4128
|
...scripts ? { scripts } : {},
|
|
4126
|
-
...
|
|
4129
|
+
...volterTools ? { volterTools } : {}
|
|
4127
4130
|
};
|
|
4128
4131
|
}
|
|
4129
4132
|
const assetPacks = readAssetPacks(parsed["assetPacks"], path);
|
|
@@ -4438,29 +4441,29 @@ function planCapabilityPackageJson(originalBytes, manifests, label = "package.js
|
|
|
4438
4441
|
resolveSpec
|
|
4439
4442
|
);
|
|
4440
4443
|
mergeStringDependencies(parsed, "scripts", patch.scripts, manifest.id, origins);
|
|
4441
|
-
if (patch.
|
|
4442
|
-
const
|
|
4443
|
-
if (!isRecord(
|
|
4444
|
-
const currentTools =
|
|
4444
|
+
if (patch.volterTools) {
|
|
4445
|
+
const volter = parsed["volter"] === void 0 ? {} : parsed["volter"];
|
|
4446
|
+
if (!isRecord(volter)) throw new Error(`${label}: volter must be an object`);
|
|
4447
|
+
const currentTools = volter["tools"] === void 0 ? [] : volter["tools"];
|
|
4445
4448
|
if (!Array.isArray(currentTools) || currentTools.some((tool) => typeof tool !== "string" && !isRecord(tool))) {
|
|
4446
|
-
throw new Error(`${label}:
|
|
4449
|
+
throw new Error(`${label}: volter.tools must be an array of strings or objects`);
|
|
4447
4450
|
}
|
|
4448
4451
|
const tools = currentTools.map(
|
|
4449
4452
|
(tool) => typeof tool === "string" ? tool : { ...tool }
|
|
4450
4453
|
);
|
|
4451
|
-
for (const tool of patch.
|
|
4454
|
+
for (const tool of patch.volterTools) {
|
|
4452
4455
|
const id = toolIdentity(tool);
|
|
4453
4456
|
const existing = tools.find((candidate) => toolIdentity(candidate) === id);
|
|
4454
4457
|
if (existing && JSON.stringify(existing) !== JSON.stringify(tool)) {
|
|
4455
4458
|
throw new Error(
|
|
4456
|
-
`Capability ${manifest.id} conflicts with existing
|
|
4459
|
+
`Capability ${manifest.id} conflicts with existing volter.tools entry ${id}`
|
|
4457
4460
|
);
|
|
4458
4461
|
}
|
|
4459
4462
|
if (!existing) tools.push(tool);
|
|
4460
4463
|
}
|
|
4461
4464
|
tools.sort((a, b) => toolIdentity(a).localeCompare(toolIdentity(b)));
|
|
4462
|
-
|
|
4463
|
-
parsed["
|
|
4465
|
+
volter["tools"] = tools;
|
|
4466
|
+
parsed["volter"] = volter;
|
|
4464
4467
|
}
|
|
4465
4468
|
}
|
|
4466
4469
|
return Buffer.from(`${JSON.stringify(parsed, null, 2)}
|
|
@@ -4516,7 +4519,7 @@ function mergedAssetManifest(projectDir, manifests) {
|
|
|
4516
4519
|
);
|
|
4517
4520
|
return { bytes, changed: !original.equals(bytes), declared: merged };
|
|
4518
4521
|
}
|
|
4519
|
-
var ADAPTER_MODULE_FILE = "
|
|
4522
|
+
var ADAPTER_MODULE_FILE = "volter.adapter.ts";
|
|
4520
4523
|
function rootSurfaces(projectDir) {
|
|
4521
4524
|
const surfaces = /* @__PURE__ */ new Map();
|
|
4522
4525
|
let manifest;
|
|
@@ -4832,19 +4835,19 @@ function removeCapabilities(options) {
|
|
|
4832
4835
|
if (existsSync2(packagePath)) {
|
|
4833
4836
|
const original = readFileSync2(packagePath);
|
|
4834
4837
|
const parsed = JSON.parse(original.toString("utf8"));
|
|
4835
|
-
const
|
|
4836
|
-
if (isRecord(
|
|
4838
|
+
const volter = parsed["volter"];
|
|
4839
|
+
if (isRecord(volter) && Array.isArray(volter["tools"])) {
|
|
4837
4840
|
const doomed = new Set(
|
|
4838
4841
|
removing.flatMap(
|
|
4839
|
-
(id) => (byId.get(id)?.packageJson?.
|
|
4842
|
+
(id) => (byId.get(id)?.packageJson?.volterTools ?? []).map((tool) => toolIdentity(tool))
|
|
4840
4843
|
)
|
|
4841
4844
|
);
|
|
4842
|
-
const tools =
|
|
4845
|
+
const tools = volter["tools"].filter(
|
|
4843
4846
|
(tool) => !doomed.has(toolIdentity(tool))
|
|
4844
4847
|
);
|
|
4845
4848
|
report.removedToolEntries = [...doomed].sort();
|
|
4846
|
-
if (tools.length !==
|
|
4847
|
-
|
|
4849
|
+
if (tools.length !== volter["tools"].length) {
|
|
4850
|
+
volter["tools"] = tools;
|
|
4848
4851
|
if (!dryRun) {
|
|
4849
4852
|
writeFileSync2(packagePath, Buffer.from(`${JSON.stringify(parsed, null, 2)}
|
|
4850
4853
|
`));
|
|
@@ -5193,7 +5196,7 @@ Fix: create the project without --example, which scaffolds from the starter temp
|
|
|
5193
5196
|
);
|
|
5194
5197
|
}
|
|
5195
5198
|
throw new Error(
|
|
5196
|
-
`Unknown example id "${exampleId}": no
|
|
5199
|
+
`Unknown example id "${exampleId}": no volter.project.json found at ${examplesSrcDir}`
|
|
5197
5200
|
);
|
|
5198
5201
|
}
|
|
5199
5202
|
mkdirSync3(targetDir, { recursive: true });
|
|
@@ -5241,7 +5244,7 @@ function assertDevelopmentLog(targetDir) {
|
|
|
5241
5244
|
const path = join4(targetDir, PROJECT_DEVELOPMENT_LOG_RELATIVE_PATH);
|
|
5242
5245
|
if (!existsSync3(path)) {
|
|
5243
5246
|
throw new Error(
|
|
5244
|
-
`Scaffolded project is missing ${PROJECT_DEVELOPMENT_LOG_RELATIVE_PATH}; restore it from the
|
|
5247
|
+
`Scaffolded project is missing ${PROJECT_DEVELOPMENT_LOG_RELATIVE_PATH}; restore it from the VOLTER starter template`
|
|
5245
5248
|
);
|
|
5246
5249
|
}
|
|
5247
5250
|
}
|
|
@@ -5266,7 +5269,7 @@ function trackedExampleFiles(exampleDir) {
|
|
|
5266
5269
|
});
|
|
5267
5270
|
if (result.status !== 0 || !result.stdout) return null;
|
|
5268
5271
|
const paths = result.stdout.toString("utf8").split("\0").filter(Boolean);
|
|
5269
|
-
return paths.includes("
|
|
5272
|
+
return paths.includes("volter.project.json") ? paths : null;
|
|
5270
5273
|
}
|
|
5271
5274
|
function copyTrackedExampleFiles(exampleDir, targetDir) {
|
|
5272
5275
|
const paths = trackedExampleFiles(exampleDir);
|
|
@@ -5298,11 +5301,11 @@ function writeExampleReadme(targetDir, projectName, exampleId) {
|
|
|
5298
5301
|
path,
|
|
5299
5302
|
`# ${projectName}
|
|
5300
5303
|
|
|
5301
|
-
An editable standalone
|
|
5304
|
+
An editable standalone VOLTER project scaffolded from the \`${exampleId ?? "example"}\` reference. Its gameplay source and assets were copied unchanged; this folder is now your project.
|
|
5302
5305
|
|
|
5303
5306
|
\`\`\`bash
|
|
5304
5307
|
npm run dev # open/reuse the visual editor
|
|
5305
|
-
npm run
|
|
5308
|
+
npm run volter -- play # verify Play mode
|
|
5306
5309
|
npm run typecheck
|
|
5307
5310
|
npm run validate-manifest
|
|
5308
5311
|
\`\`\`
|
|
@@ -5316,12 +5319,12 @@ function shouldCopyExamplePath(exampleDir, sourcePath) {
|
|
|
5316
5319
|
const relativePath = relative3(exampleDir, sourcePath).replaceAll("\\", "/");
|
|
5317
5320
|
const topLevel = relativePath.split("/")[0] ?? "";
|
|
5318
5321
|
const segments = relativePath.split("/");
|
|
5319
|
-
return !["node_modules", "dist", "logs", ".
|
|
5322
|
+
return !["node_modules", "dist", "logs", ".volter", ".git", "package-lock.json"].includes(topLevel) && !segments.some((segment) => segment === ".env" || segment.startsWith(".env."));
|
|
5320
5323
|
}
|
|
5321
5324
|
function shouldCopyStarterPath(templateDir, sourcePath) {
|
|
5322
5325
|
const relativePath = relative3(templateDir, sourcePath).replaceAll("\\", "/");
|
|
5323
5326
|
const topLevel = relativePath.split("/")[0] ?? "";
|
|
5324
|
-
return !["node_modules", "dist", "logs", ".
|
|
5327
|
+
return !["node_modules", "dist", "logs", ".volter"].includes(topLevel);
|
|
5325
5328
|
}
|
|
5326
5329
|
function rewritePackageJson(targetDir, slug, engineDir, monoRoot) {
|
|
5327
5330
|
const pkgPath = join4(targetDir, "package.json");
|
|
@@ -5351,8 +5354,8 @@ function rewritePackageJson(targetDir, slug, engineDir, monoRoot) {
|
|
|
5351
5354
|
}
|
|
5352
5355
|
pkg.scripts ??= {};
|
|
5353
5356
|
for (const [name, script] of Object.entries(pkg.scripts)) {
|
|
5354
|
-
if (name !== "
|
|
5355
|
-
pkg.scripts[name] = `npm run
|
|
5357
|
+
if (name !== "volter" && script.startsWith("volter ")) {
|
|
5358
|
+
pkg.scripts[name] = `npm run volter -- ${script.slice("volter ".length)}`;
|
|
5356
5359
|
}
|
|
5357
5360
|
}
|
|
5358
5361
|
pkg.devDependencies = pkg.devDependencies ?? {};
|
|
@@ -5388,7 +5391,7 @@ function engineDependencySpec(monoRoot, packageName, checkoutRelPath = "") {
|
|
|
5388
5391
|
return `^${version}`;
|
|
5389
5392
|
}
|
|
5390
5393
|
function rewriteGameManifest(targetDir, name, slug, additions, monoRoot) {
|
|
5391
|
-
const manifestPath = join4(targetDir, "
|
|
5394
|
+
const manifestPath = join4(targetDir, "volter.project.json");
|
|
5392
5395
|
const engineVersion = readInstalledVersion(monoRoot, "@volter/editor-project");
|
|
5393
5396
|
let manifest;
|
|
5394
5397
|
if (existsSync3(manifestPath)) {
|
|
@@ -5407,12 +5410,14 @@ function rewriteGameManifest(targetDir, name, slug, additions, monoRoot) {
|
|
|
5407
5410
|
}
|
|
5408
5411
|
manifest["name"] = name;
|
|
5409
5412
|
manifest["manifestVersion"] = 2;
|
|
5410
|
-
manifest["$schema"] = "./node_modules/@volter/editor-project/schemas/
|
|
5413
|
+
manifest["$schema"] = "./node_modules/@volter/editor-project/schemas/volter-project.schema.json";
|
|
5411
5414
|
manifest["appId"] = `com.example.${slug.replace(/[^a-zA-Z0-9]/g, "")}`;
|
|
5412
5415
|
if (additions) {
|
|
5413
5416
|
const roots = [];
|
|
5414
5417
|
if (additions.has("three"))
|
|
5415
5418
|
roots.push({ id: "world", adapter: "three", entry: "src/world.tsx" });
|
|
5419
|
+
if (additions.has("canvas"))
|
|
5420
|
+
roots.push({ id: "scene2d", adapter: "canvas", entry: "src/scene2d.tsx" });
|
|
5416
5421
|
if (additions.has("ui"))
|
|
5417
5422
|
roots.push({ id: "ui", adapter: "dom", entry: "src/ui/game.tsx", zOrder: 0 });
|
|
5418
5423
|
manifest["roots"] = roots;
|
|
@@ -5451,7 +5456,7 @@ function repinEngineAfterInstall(targetDir) {
|
|
|
5451
5456
|
try {
|
|
5452
5457
|
const baseline = JSON.parse(readFileSync3(baselinePath, "utf-8"));
|
|
5453
5458
|
baseline.engineVersion = installed;
|
|
5454
|
-
baseline.files["
|
|
5459
|
+
baseline.files["volter.project.json"] = hashFile(manifestPath);
|
|
5455
5460
|
writeFileSync3(baselinePath, `${JSON.stringify(baseline, null, 2)}
|
|
5456
5461
|
`, "utf-8");
|
|
5457
5462
|
} catch {
|
|
@@ -5460,7 +5465,7 @@ function repinEngineAfterInstall(targetDir) {
|
|
|
5460
5465
|
}
|
|
5461
5466
|
var runNpmLink = (projectDir, packageDirs) => {
|
|
5462
5467
|
const checkout = packageDirs[0] ? resolve2(packageDirs[0], "..", "..") : projectDir;
|
|
5463
|
-
const prefix = join4(checkout, ".
|
|
5468
|
+
const prefix = join4(checkout, ".volter", "npm-link-prefix");
|
|
5464
5469
|
mkdirSync3(join4(prefix, "lib", "node_modules"), { recursive: true });
|
|
5465
5470
|
mkdirSync3(join4(prefix, "bin"), { recursive: true });
|
|
5466
5471
|
const result = spawnSync("npm", ["link", "--no-save", ...packageDirs], {
|
|
@@ -5474,7 +5479,7 @@ var runNpmLink = (projectDir, packageDirs) => {
|
|
|
5474
5479
|
throw new Error(`npm link exited with code ${result.status ?? "unknown"}`);
|
|
5475
5480
|
}
|
|
5476
5481
|
};
|
|
5477
|
-
function
|
|
5482
|
+
function checkoutVolterPackageDirs(monoRoot) {
|
|
5478
5483
|
const found = /* @__PURE__ */ new Map();
|
|
5479
5484
|
const packagesDir = join4(monoRoot, "packages");
|
|
5480
5485
|
let entries;
|
|
@@ -5500,7 +5505,7 @@ function checkoutVgaiPackageDirs(monoRoot) {
|
|
|
5500
5505
|
}
|
|
5501
5506
|
return found;
|
|
5502
5507
|
}
|
|
5503
|
-
function
|
|
5508
|
+
function declaredVolterDependencies(projectDir) {
|
|
5504
5509
|
let pkg;
|
|
5505
5510
|
try {
|
|
5506
5511
|
pkg = JSON.parse(readFileSync3(join4(projectDir, "package.json"), "utf-8"));
|
|
@@ -5512,9 +5517,9 @@ function declaredVgaiDependencies(projectDir) {
|
|
|
5512
5517
|
].filter((name) => name.startsWith("@volter/")).sort();
|
|
5513
5518
|
}
|
|
5514
5519
|
function planCheckoutLink(projectDir, monoRoot) {
|
|
5515
|
-
const owned =
|
|
5520
|
+
const owned = checkoutVolterPackageDirs(monoRoot);
|
|
5516
5521
|
if (owned.size === 0) return { packages: [], directories: [] };
|
|
5517
|
-
const packages =
|
|
5522
|
+
const packages = declaredVolterDependencies(projectDir).filter((name) => owned.has(name));
|
|
5518
5523
|
return { packages, directories: packages.map((name) => owned.get(name)) };
|
|
5519
5524
|
}
|
|
5520
5525
|
function pointUnpublishedPackagesAtCheckout(projectDir, monoRoot) {
|
|
@@ -5540,7 +5545,7 @@ function pointUnpublishedPackagesAtCheckout(projectDir, monoRoot) {
|
|
|
5540
5545
|
return rewritten;
|
|
5541
5546
|
}
|
|
5542
5547
|
function checkoutPackageSpec(name, monoRoot) {
|
|
5543
|
-
const dir =
|
|
5548
|
+
const dir = checkoutVolterPackageDirs(monoRoot).get(name);
|
|
5544
5549
|
return dir === void 0 ? null : `file:${dir}`;
|
|
5545
5550
|
}
|
|
5546
5551
|
var runPackageBuild = (packageDir) => {
|
|
@@ -5615,6 +5620,27 @@ function writeEditorPackages(targetDir, wanted) {
|
|
|
5615
5620
|
);
|
|
5616
5621
|
writeJson(pkgPath, pkg);
|
|
5617
5622
|
}
|
|
5623
|
+
function writeNetworkedInput(targetDir) {
|
|
5624
|
+
const inputPath = join4(targetDir, "src", "input.ts");
|
|
5625
|
+
let input = readFileSync3(inputPath, "utf-8");
|
|
5626
|
+
for (const [line, replacement] of NETWORKED_INPUT_LINES) {
|
|
5627
|
+
if (!input.includes(line)) {
|
|
5628
|
+
throw new Error(`The template input store no longer declares its actions as expected: ${line}`);
|
|
5629
|
+
}
|
|
5630
|
+
input = input.replace(line, replacement);
|
|
5631
|
+
}
|
|
5632
|
+
writeFileSync3(inputPath, input, "utf-8");
|
|
5633
|
+
}
|
|
5634
|
+
function applyCanvasAddition(targetDir, productDir) {
|
|
5635
|
+
const additionDir = join4(productDir, "additions", "canvas");
|
|
5636
|
+
cpSync(join4(additionDir, "src"), join4(targetDir, "src"), { recursive: true });
|
|
5637
|
+
const own = JSON.parse(readFileSync3(join4(additionDir, "package.json"), "utf-8"));
|
|
5638
|
+
const pkgPath = join4(targetDir, "package.json");
|
|
5639
|
+
const pkg = JSON.parse(readFileSync3(pkgPath, "utf-8"));
|
|
5640
|
+
pkg.dependencies = { ...pkg.dependencies };
|
|
5641
|
+
for (const [name, spec] of Object.entries(own.dependencies ?? {})) pkg.dependencies[name] ??= spec;
|
|
5642
|
+
writeJson(pkgPath, pkg);
|
|
5643
|
+
}
|
|
5618
5644
|
function rewriteTemplateVariantFiles(targetDir, composition, additions, starterDir) {
|
|
5619
5645
|
if (!additions.has("three") || !additions.has("studio")) {
|
|
5620
5646
|
for (const relative7 of STUDIO_OWNED_PATHS) {
|
|
@@ -5623,15 +5649,7 @@ function rewriteTemplateVariantFiles(targetDir, composition, additions, starterD
|
|
|
5623
5649
|
}
|
|
5624
5650
|
writeEditorPackages(targetDir, composition.editorPackages);
|
|
5625
5651
|
if (additions.has("server") && additions.has("three")) {
|
|
5626
|
-
|
|
5627
|
-
let input = readFileSync3(inputPath, "utf-8");
|
|
5628
|
-
for (const [line, replacement] of NETWORKED_INPUT_LINES) {
|
|
5629
|
-
if (!input.includes(line)) {
|
|
5630
|
-
throw new Error(`The template input store no longer declares its actions as expected: ${line}`);
|
|
5631
|
-
}
|
|
5632
|
-
input = input.replace(line, replacement);
|
|
5633
|
-
}
|
|
5634
|
-
writeFileSync3(inputPath, input, "utf-8");
|
|
5652
|
+
writeNetworkedInput(targetDir);
|
|
5635
5653
|
} else {
|
|
5636
5654
|
for (const relative7 of SERVER_CLIENT_PATHS) {
|
|
5637
5655
|
rmSync2(join4(targetDir, relative7), { recursive: true, force: true });
|
|
@@ -5652,9 +5670,9 @@ function rewriteTemplateVariantFiles(targetDir, composition, additions, starterD
|
|
|
5652
5670
|
for (const relative7 of THREE_OWNED_PATHS) {
|
|
5653
5671
|
rmSync2(join4(targetDir, relative7), { recursive: true, force: true });
|
|
5654
5672
|
}
|
|
5655
|
-
writeFileSync3(join4(targetDir, "
|
|
5673
|
+
writeFileSync3(join4(targetDir, "volter.adapter.ts"), adapterSourceFor(additions), "utf-8");
|
|
5656
5674
|
} else {
|
|
5657
|
-
const adapterPath = join4(targetDir, "
|
|
5675
|
+
const adapterPath = join4(targetDir, "volter.adapter.ts");
|
|
5658
5676
|
const source = joinAdditionFinders(readFileSync3(adapterPath, "utf-8"), additions);
|
|
5659
5677
|
writeFileSync3(adapterPath, source, "utf-8");
|
|
5660
5678
|
}
|
|
@@ -5711,7 +5729,7 @@ function rewriteTsconfig(targetDir, engineRelPath, editorRelPath) {
|
|
|
5711
5729
|
])
|
|
5712
5730
|
),
|
|
5713
5731
|
// `@volter/editor-blender`'s two VALUE exports — the look and the layout a models
|
|
5714
|
-
// project's `
|
|
5732
|
+
// project's `volter.adapter.ts` imports. Spelled entry by entry rather than
|
|
5715
5733
|
// as a wildcard because the package's `exports` names them individually;
|
|
5716
5734
|
// both entries are inert for a project that never declares the package.
|
|
5717
5735
|
"@volter/editor-blender/looks": ["node_modules/@volter/editor-blender/src/looks.ts"],
|
|
@@ -5809,7 +5827,8 @@ function scaffoldProject(opts) {
|
|
|
5809
5827
|
additions,
|
|
5810
5828
|
resolveScaffoldStarterDir(productDir)
|
|
5811
5829
|
);
|
|
5812
|
-
|
|
5830
|
+
if (additions.has("canvas")) applyCanvasAddition(targetDir, productDir);
|
|
5831
|
+
const adapterPath = join4(targetDir, "volter.adapter.ts");
|
|
5813
5832
|
writeFileSync3(
|
|
5814
5833
|
adapterPath,
|
|
5815
5834
|
withEditorDeclaration(readFileSync3(adapterPath, "utf-8"), composition.editor),
|
|
@@ -5821,6 +5840,8 @@ function scaffoldProject(opts) {
|
|
|
5821
5840
|
withAgentsContract(readFileSync3(agentsPath, "utf-8"), additions),
|
|
5822
5841
|
"utf-8"
|
|
5823
5842
|
);
|
|
5843
|
+
} else if (exampleId === void 0 && existsSync3(join4(targetDir, "src", "net"))) {
|
|
5844
|
+
writeNetworkedInput(targetDir);
|
|
5824
5845
|
}
|
|
5825
5846
|
rewriteTsconfig(targetDir, engineRelPath, editorRelPath);
|
|
5826
5847
|
rewriteViteConfig(targetDir);
|
|
@@ -5956,7 +5977,7 @@ function initGitRepo(targetDir, projectName) {
|
|
|
5956
5977
|
notice: "Skipped git init \u2014 the project is already inside a git work tree."
|
|
5957
5978
|
};
|
|
5958
5979
|
}
|
|
5959
|
-
const authorFallback = hasCommitterIdentity(targetDir) ? [] : ["-c", "user.name=
|
|
5980
|
+
const authorFallback = hasCommitterIdentity(targetDir) ? [] : ["-c", "user.name=volter", "-c", "user.email=scaffold@volter"];
|
|
5960
5981
|
const steps = [
|
|
5961
5982
|
{ label: "git init", args: ["init", "--quiet"] },
|
|
5962
5983
|
{ label: "git add", args: ["add", "-A"] },
|
|
@@ -5995,13 +6016,15 @@ var presets = {
|
|
|
5995
6016
|
// silent console the agent contract requires; they are an author's TODO
|
|
5996
6017
|
// from the moment the author ASKS for those panels (`--with studio`, or
|
|
5997
6018
|
// `--template full`).
|
|
5998
|
-
game
|
|
6019
|
+
// A game's UI is React DOM: its HUD is the `ui` root over the world. A `canvas` (Pixi) root
|
|
6020
|
+
// is 2D game rendering, never the UI layer.
|
|
6021
|
+
game: { additions: ["three", "ui", "server", "blender"] },
|
|
5999
6022
|
/** A 3D world and its models: the smallest thing that plays. */
|
|
6000
6023
|
prototype: { additions: ["three", "blender"] },
|
|
6001
6024
|
// EVERY addition in one project — the composition acceptance made
|
|
6002
6025
|
// permanent. Check it against `SCAFFOLD_ADDITIONS` (./scaffold/additions.ts)
|
|
6003
6026
|
// when the scaffolder grows one.
|
|
6004
|
-
full: { additions: ["three", "ui", "server", "blender", "studio"] },
|
|
6027
|
+
full: { additions: ["three", "canvas", "ui", "server", "blender", "studio"] },
|
|
6005
6028
|
/** The design skew: a React root and no 3D world. */
|
|
6006
6029
|
website: { additions: ["ui"] },
|
|
6007
6030
|
/** Nothing but the project — the shape an author adds to. */
|
|
@@ -6012,15 +6035,16 @@ var presets = {
|
|
|
6012
6035
|
examples: true,
|
|
6013
6036
|
compose(additions) {
|
|
6014
6037
|
const three = additions.has("three");
|
|
6038
|
+
const world = three || additions.has("canvas");
|
|
6015
6039
|
const studio = additions.has("studio");
|
|
6016
6040
|
const layouts = "@volter/editor-sdk/layouts";
|
|
6017
|
-
const design = additions.has("ui") && !
|
|
6041
|
+
const design = additions.has("ui") && !world;
|
|
6018
6042
|
return {
|
|
6019
|
-
// THE PRODUCT THIS PROJECT OPENS IN, and the
|
|
6020
|
-
// `@volter/editor-game` is the
|
|
6021
|
-
//
|
|
6022
|
-
// a running game to run.
|
|
6023
|
-
editorPackages: [PRODUCT2, ...
|
|
6043
|
+
// THE PRODUCT THIS PROJECT OPENS IN, and the game lane beside it:
|
|
6044
|
+
// `@volter/editor-game` is the lane of a game world (3D, or a 2D scene), and
|
|
6045
|
+
// a project with no world has nothing for Play, the Game workspace or the
|
|
6046
|
+
// instruments over a running game to run.
|
|
6047
|
+
editorPackages: [PRODUCT2, ...world ? ["@volter/editor-game"] : []],
|
|
6024
6048
|
editor: {
|
|
6025
6049
|
layout: { name: design ? "DesignLayout" : studio ? "StudioLayout" : "GameLayout", from: layouts },
|
|
6026
6050
|
inspector: studio ? "column" : "card"
|
|
@@ -6158,7 +6182,7 @@ function resolveWorktreeIdentity(projectRoot) {
|
|
|
6158
6182
|
};
|
|
6159
6183
|
}
|
|
6160
6184
|
|
|
6161
|
-
// ../editor-core/dist/server/chunk-
|
|
6185
|
+
// ../editor-core/dist/server/chunk-C7HWTZ6G.js
|
|
6162
6186
|
import {
|
|
6163
6187
|
mkdirSync as mkdirSync5,
|
|
6164
6188
|
readdirSync as readdirSync4,
|
|
@@ -6170,7 +6194,7 @@ import {
|
|
|
6170
6194
|
import { homedir as homedir2 } from "node:os";
|
|
6171
6195
|
import { join as join7, resolve as resolve6 } from "node:path";
|
|
6172
6196
|
import { setTimeout as delay } from "node:timers/promises";
|
|
6173
|
-
var EDITOR_SESSIONS_REGISTRY_FILE = join7(homedir2(), ".
|
|
6197
|
+
var EDITOR_SESSIONS_REGISTRY_FILE = join7(homedir2(), ".volter", "editor-sessions.json");
|
|
6174
6198
|
function isEditorSessionEntry(v) {
|
|
6175
6199
|
if (typeof v !== "object" || v === null) return false;
|
|
6176
6200
|
const s = v;
|
|
@@ -6208,7 +6232,7 @@ function readLiveRegisteredSessions() {
|
|
|
6208
6232
|
}
|
|
6209
6233
|
}
|
|
6210
6234
|
function announceEditorLaunch(project) {
|
|
6211
|
-
const directory = join7(project, ".
|
|
6235
|
+
const directory = join7(project, ".volter", "editor-launches");
|
|
6212
6236
|
mkdirSync5(directory, { recursive: true });
|
|
6213
6237
|
const file = join7(directory, `${process.pid}.json`);
|
|
6214
6238
|
writeFileSync5(file, JSON.stringify({ pid: process.pid }));
|
|
@@ -6223,7 +6247,7 @@ function announceEditorLaunch(project) {
|
|
|
6223
6247
|
return clear;
|
|
6224
6248
|
}
|
|
6225
6249
|
function hasPendingEditorLaunch(project) {
|
|
6226
|
-
const directory = join7(project, ".
|
|
6250
|
+
const directory = join7(project, ".volter", "editor-launches");
|
|
6227
6251
|
try {
|
|
6228
6252
|
return readdirSync4(directory).some((name) => {
|
|
6229
6253
|
if (!/^\d+\.json$/.test(name)) return false;
|
|
@@ -6270,7 +6294,7 @@ function canonicalizeProjectPath(p) {
|
|
|
6270
6294
|
}
|
|
6271
6295
|
}
|
|
6272
6296
|
|
|
6273
|
-
// ../editor-core/dist/server/chunk-
|
|
6297
|
+
// ../editor-core/dist/server/chunk-4EX3ZYKI.js
|
|
6274
6298
|
import { createServer } from "node:net";
|
|
6275
6299
|
import { execFileSync as execFileSync3 } from "node:child_process";
|
|
6276
6300
|
async function loopbackPortFree(port) {
|
|
@@ -6621,7 +6645,7 @@ import { createHash as createHash22 } from "node:crypto";
|
|
|
6621
6645
|
import { mkdirSync as mkdirSync22, readFileSync as readFileSync32, renameSync as renameSync2, rmdirSync, statSync as statSync3, writeFileSync as writeFileSync22 } from "node:fs";
|
|
6622
6646
|
import { homedir as homedir22 } from "node:os";
|
|
6623
6647
|
import { dirname as dirname22, join as join32 } from "node:path";
|
|
6624
|
-
var PRODUCT_DECLARATION_KEY = "
|
|
6648
|
+
var PRODUCT_DECLARATION_KEY = "volter.product";
|
|
6625
6649
|
var PRODUCT_INSTALL_LINES = [
|
|
6626
6650
|
" npm install --save-dev @volter/model-editor",
|
|
6627
6651
|
" npm install --save-dev @volter/game-editor"
|
|
@@ -6636,7 +6660,7 @@ function readProductManifest(packageDir) {
|
|
|
6636
6660
|
} catch {
|
|
6637
6661
|
return null;
|
|
6638
6662
|
}
|
|
6639
|
-
const declared = manifest.
|
|
6663
|
+
const declared = manifest.volter?.product;
|
|
6640
6664
|
if (declared === void 0) return null;
|
|
6641
6665
|
const entry = declared.entry;
|
|
6642
6666
|
if (typeof entry !== "string" || !entry.startsWith("./"))
|
|
@@ -6681,7 +6705,7 @@ function readProductManifest(packageDir) {
|
|
|
6681
6705
|
}
|
|
6682
6706
|
var SHA256_HEX = /^[0-9a-f]{64}$/;
|
|
6683
6707
|
function readProductWorkbench(manifestPath, declared) {
|
|
6684
|
-
const example = ' "
|
|
6708
|
+
const example = ' "volter": { "product": { "workbench": { "release": "<product>-<fork sha 12>-<platform>", "tarballSha256": "<64 hex>" } } }\n`node scripts/workbench/build-release.mjs --publish --out <release dir>` cuts the release and prints exactly that block.';
|
|
6685
6709
|
if (typeof declared !== "object" || declared === null || Array.isArray(declared))
|
|
6686
6710
|
throw new Error(
|
|
6687
6711
|
`${manifestPath} declares ${PRODUCT_DECLARATION_KEY} but its "workbench" is ${JSON.stringify(declared)}. A product IS the Code-OSS workbench it was compiled into, so it names the published release those bytes are:
|
|
@@ -6711,7 +6735,7 @@ ${example}`
|
|
|
6711
6735
|
function workbenchProductId(packageName) {
|
|
6712
6736
|
return packageName.split("/").pop() ?? packageName;
|
|
6713
6737
|
}
|
|
6714
|
-
function
|
|
6738
|
+
function declaredVolterPackages(projectRoot) {
|
|
6715
6739
|
let manifest;
|
|
6716
6740
|
try {
|
|
6717
6741
|
manifest = JSON.parse(
|
|
@@ -6747,7 +6771,7 @@ function locatePackage(projectRoot, name) {
|
|
|
6747
6771
|
}
|
|
6748
6772
|
function declaredProducts(projectRoot) {
|
|
6749
6773
|
const found = [];
|
|
6750
|
-
for (const name of
|
|
6774
|
+
for (const name of declaredVolterPackages(projectRoot)) {
|
|
6751
6775
|
const dir = locatePackage(projectRoot, name);
|
|
6752
6776
|
if (dir === null) continue;
|
|
6753
6777
|
const product = readProductManifest(dir);
|
|
@@ -6775,10 +6799,10 @@ are not building with:
|
|
|
6775
6799
|
` + products.map((product) => ` npm uninstall ${product.name}`).join("\n")
|
|
6776
6800
|
);
|
|
6777
6801
|
}
|
|
6778
|
-
var WORKBENCH_LOCATOR_PATH = ".
|
|
6802
|
+
var WORKBENCH_LOCATOR_PATH = ".volter/workbench.json";
|
|
6779
6803
|
var RELEASE_RECORD = "BUILD.json";
|
|
6780
6804
|
var SOURCES_LAUNCHER = join22("scripts", "code-server.sh");
|
|
6781
|
-
var OVERLAY_RECORD = ".
|
|
6805
|
+
var OVERLAY_RECORD = ".volter-overlay.json";
|
|
6782
6806
|
function workbenchDeclarationExample(projectRoot) {
|
|
6783
6807
|
return `${join22(projectRoot, WORKBENCH_LOCATOR_PATH)}:
|
|
6784
6808
|
{ "workbench": "<path to an extracted Code-OSS release, or to a fork checkout>" }`;
|
|
@@ -6819,7 +6843,7 @@ ${workbenchDeclarationExample(projectRoot)}`
|
|
|
6819
6843
|
return isAbsolute3(declared) ? resolve7(declared) : resolve7(projectRoot, declared);
|
|
6820
6844
|
}
|
|
6821
6845
|
function writeWorkbenchDeclaration(projectRoot, workbenchDir) {
|
|
6822
|
-
mkdirSync6(join22(projectRoot, ".
|
|
6846
|
+
mkdirSync6(join22(projectRoot, ".volter"), { recursive: true });
|
|
6823
6847
|
writeFileSync6(
|
|
6824
6848
|
join22(projectRoot, WORKBENCH_LOCATOR_PATH),
|
|
6825
6849
|
`${JSON.stringify({ workbench: resolve7(workbenchDir) }, null, 2)}
|
|
@@ -6844,7 +6868,7 @@ function resolveWorkbench(dir, expectedProduct) {
|
|
|
6844
6868
|
if (expectedProduct !== void 0 && resolved.product !== expectedProduct) {
|
|
6845
6869
|
throw new Error(
|
|
6846
6870
|
`${root} is a ${resolved.product} workbench and this project opens in ${expectedProduct}. A workbench is built for ONE product \u2014 the editor kit and that product's workbench half are overlaid on the fork together \u2014 so its title, its look and its commands are the other product's, whatever this session serves into it. ${resolved.kind === "sources" ? `Re-overlay the checkout:
|
|
6847
|
-
node scripts/workbench/dev.mjs --checkout ${root} --product ${expectedProduct}` : `Name a ${expectedProduct} release in .
|
|
6871
|
+
node scripts/workbench/dev.mjs --checkout ${root} --product ${expectedProduct}` : `Name a ${expectedProduct} release in .volter/workbench.json, or cut one:
|
|
6848
6872
|
node scripts/workbench/build-release.mjs --product ${expectedProduct} --platform ${machinePlatform()} --checkout <fork dir>`}`
|
|
6849
6873
|
);
|
|
6850
6874
|
}
|
|
@@ -6902,7 +6926,7 @@ function resolveSources(dir) {
|
|
|
6902
6926
|
const marker = join22(dir, OVERLAY_RECORD);
|
|
6903
6927
|
if (!existsSync22(marker)) {
|
|
6904
6928
|
throw new Error(
|
|
6905
|
-
`${dir} is a Code-OSS checkout with no
|
|
6929
|
+
`${dir} is a Code-OSS checkout with no volter overlay: ${OVERLAY_RECORD} 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:
|
|
6906
6930
|
node scripts/workbench/dev.mjs --checkout ${dir} --product <model-editor|game-editor>`
|
|
6907
6931
|
);
|
|
6908
6932
|
}
|
|
@@ -6927,7 +6951,7 @@ function resolveSources(dir) {
|
|
|
6927
6951
|
};
|
|
6928
6952
|
}
|
|
6929
6953
|
var RELEASE_REPO = "volter-ai/code-oss";
|
|
6930
|
-
var WORKBENCH_CACHE_ROOT = join22(homedir3(), ".
|
|
6954
|
+
var WORKBENCH_CACHE_ROOT = join22(homedir3(), ".volter", "workbenches");
|
|
6931
6955
|
async function resolveWorkbenchForProject(options) {
|
|
6932
6956
|
const { projectRoot, product, override, io } = options;
|
|
6933
6957
|
const productId = workbenchProductId(product.name);
|
|
@@ -6977,7 +7001,7 @@ function apiHeaders(token) {
|
|
|
6977
7001
|
return {
|
|
6978
7002
|
Accept: "application/vnd.github+json",
|
|
6979
7003
|
"X-GitHub-Api-Version": "2022-11-28",
|
|
6980
|
-
"User-Agent": "
|
|
7004
|
+
"User-Agent": "volter-workbench-locator",
|
|
6981
7005
|
...token === null ? {} : { Authorization: `Bearer ${token}` }
|
|
6982
7006
|
};
|
|
6983
7007
|
}
|
|
@@ -7111,7 +7135,7 @@ var MIN_PORT = 1024;
|
|
|
7111
7135
|
var MAX_PORT = 65535;
|
|
7112
7136
|
var WORKTREE_EDITOR_PORT_MIN = 20200;
|
|
7113
7137
|
var WORKTREE_EDITOR_PORT_MAX = 29999;
|
|
7114
|
-
var DEFAULT_PORT_REGISTRY = join32(homedir22(), ".
|
|
7138
|
+
var DEFAULT_PORT_REGISTRY = join32(homedir22(), ".volter", "worktree-ports.json");
|
|
7115
7139
|
var LOCK_STALE_MS = 1e4;
|
|
7116
7140
|
var lockWait = new Int32Array(new SharedArrayBuffer(4));
|
|
7117
7141
|
function assertPort(value, source) {
|
|
@@ -7224,7 +7248,7 @@ function allocateWorktreeEditorPort(projectRoot, registryFile = DEFAULT_PORT_REG
|
|
|
7224
7248
|
}
|
|
7225
7249
|
function readEditorPortEnv(value) {
|
|
7226
7250
|
if (value === void 0 || value.trim() === "") return void 0;
|
|
7227
|
-
return assertPort(Number(value), "
|
|
7251
|
+
return assertPort(Number(value), "VOLTER_EDITOR_PORT");
|
|
7228
7252
|
}
|
|
7229
7253
|
function resolveEditorPortRequest(projectRoot, portOverride, envValue, registryFile) {
|
|
7230
7254
|
if (portOverride !== void 0) {
|
|
@@ -7313,7 +7337,7 @@ async function launch(folder, launching, options = {}) {
|
|
|
7313
7337
|
const project = realpathSync3(resolve22(folder));
|
|
7314
7338
|
const product = resolveProductForProject(project);
|
|
7315
7339
|
if (product.name !== launching.packageName) throw new Error(`${project} declares ${product.name}, not ${launching.displayName}.`);
|
|
7316
|
-
const port = resolveEditorPortPreference(project, options.port, process.env["
|
|
7340
|
+
const port = resolveEditorPortPreference(project, options.port, process.env["VOLTER_EDITOR_PORT"]);
|
|
7317
7341
|
await waitForPendingEditorLaunch(project);
|
|
7318
7342
|
const sessions = await verifiedSessions(port);
|
|
7319
7343
|
const verdict = classifyProjectSession(sessions, project);
|
|
@@ -7350,14 +7374,14 @@ async function launch(folder, launching, options = {}) {
|
|
|
7350
7374
|
stdio: ["ignore", log, log],
|
|
7351
7375
|
env: {
|
|
7352
7376
|
...process.env,
|
|
7353
|
-
|
|
7354
|
-
|
|
7355
|
-
|
|
7356
|
-
|
|
7357
|
-
|
|
7358
|
-
|
|
7359
|
-
|
|
7360
|
-
...options.noOpen ? {
|
|
7377
|
+
VOLTER_CLI_ENTRY: resolve22(process.argv[1]),
|
|
7378
|
+
VOLTER_PROJECT: project,
|
|
7379
|
+
VOLTER_PRODUCT_DIR: product.dir,
|
|
7380
|
+
VOLTER_EDITOR_PORT: String(port),
|
|
7381
|
+
VOLTER_WORKBENCH_DIR: workbench.dir,
|
|
7382
|
+
VOLTER_FRAME_PORT: String(framePort),
|
|
7383
|
+
VOLTER_FRAME_PROXY_PORT: String(proxyPort),
|
|
7384
|
+
...options.noOpen ? { VOLTER_NO_OPEN: "1" } : {}
|
|
7361
7385
|
}
|
|
7362
7386
|
});
|
|
7363
7387
|
} catch (error) {
|
|
@@ -7400,7 +7424,7 @@ async function prepareSession(folder, launching) {
|
|
|
7400
7424
|
const child = spawn2(process.execPath, [entry], {
|
|
7401
7425
|
cwd: project,
|
|
7402
7426
|
stdio: ["ignore", "inherit", "inherit"],
|
|
7403
|
-
env: { ...process.env,
|
|
7427
|
+
env: { ...process.env, VOLTER_PROJECT: project, VOLTER_PRODUCT_DIR: product.dir, VOLTER_NO_OPEN: "1", VOLTER_PREPARE: "1" }
|
|
7404
7428
|
});
|
|
7405
7429
|
child.once("error", fail2);
|
|
7406
7430
|
child.once("exit", done);
|
|
@@ -7417,10 +7441,29 @@ async function ensureTab(serverUrl, noOpen) {
|
|
|
7417
7441
|
openAttemptAt,
|
|
7418
7442
|
onProgress: (ms) => console.log(`Waiting for the editor page (${Math.round(ms / 1e3)}s)\u2026`)
|
|
7419
7443
|
});
|
|
7420
|
-
if (outcome.status !== "connected")
|
|
7444
|
+
if (outcome.status !== "connected") {
|
|
7445
|
+
const said = outcome.status === "never-arrived" ? [] : await currentPageErrors(serverUrl);
|
|
7446
|
+
throw new Error(
|
|
7447
|
+
`Editor page ${outcome.status === "never-arrived" ? "did not arrive" : "arrived but did not become ready"}` + (said.length > 0 ? `:
|
|
7448
|
+
${said.map((message) => ` ${message}`).join("\n")}` : "; open the printed workbench URL and inspect the session log.")
|
|
7449
|
+
);
|
|
7450
|
+
}
|
|
7451
|
+
}
|
|
7452
|
+
async function currentPageErrors(serverUrl) {
|
|
7453
|
+
try {
|
|
7454
|
+
const response = await fetch(new URL("/__editor/console?all=1", serverUrl), { signal: AbortSignal.timeout(3e3) });
|
|
7455
|
+
if (!response.ok) return [];
|
|
7456
|
+
const body = await response.json();
|
|
7457
|
+
if (!body.currentLoadId) return [];
|
|
7458
|
+
return (body.entries ?? []).filter(
|
|
7459
|
+
(entry) => entry.severity === "error" && typeof entry.message === "string" && entry.lastLoadId === body.currentLoadId
|
|
7460
|
+
).map((entry) => entry.message.split("\n")[0]);
|
|
7461
|
+
} catch {
|
|
7462
|
+
return [];
|
|
7463
|
+
}
|
|
7421
7464
|
}
|
|
7422
7465
|
|
|
7423
|
-
// ../editor-core/dist/server/chunk-
|
|
7466
|
+
// ../editor-core/dist/server/chunk-RWQATMGM.js
|
|
7424
7467
|
import { Agent, fetch as nodeFetch } from "undici";
|
|
7425
7468
|
function createDispatcher(timeoutMs) {
|
|
7426
7469
|
return new Agent({ headersTimeout: timeoutMs, bodyTimeout: timeoutMs });
|
|
@@ -7447,7 +7490,7 @@ var EditorCommandError = class extends Error {
|
|
|
7447
7490
|
* the receipt window closing unanswered, a beating-but-dead tab, and no tab
|
|
7448
7491
|
* present at all. The last four can fail in milliseconds.
|
|
7449
7492
|
*
|
|
7450
|
-
* A caller that converges by retrying (`
|
|
7493
|
+
* A caller that converges by retrying (the editor's `restart` command) needs the distinction
|
|
7451
7494
|
* because a refusal the editor ANSWERED may go differently next time, while
|
|
7452
7495
|
* a command the relay abandoned tells you nothing new on a second identical
|
|
7453
7496
|
* attempt — and when the abandonment was a 120s budget, re-running it three
|
|
@@ -7625,22 +7668,22 @@ var EditorClient = class {
|
|
|
7625
7668
|
return data;
|
|
7626
7669
|
}
|
|
7627
7670
|
// --- Play control ---
|
|
7628
|
-
/** `opts.seed` (D15/T-D15.6, objection-4 fix) — `
|
|
7671
|
+
/** `opts.seed` (D15/T-D15.6, objection-4 fix) — the editor's `play --seed <n>` command's
|
|
7629
7672
|
* explicit config leg, relayed as `cmd['seed']`; `handleCommand`'s
|
|
7630
7673
|
* `'play'` case threads it into `enterPlayMode`'s highest-precedence seed
|
|
7631
|
-
* argument (beats manifest.determinism.defaultSeed/?
|
|
7674
|
+
* argument (beats manifest.determinism.defaultSeed/?volter-seed=). Omitted,
|
|
7632
7675
|
* boot seeding falls back to that precedence unchanged.
|
|
7633
7676
|
*
|
|
7634
|
-
* `opts.name` (`
|
|
7677
|
+
* `opts.name` (the editor's `play --name <text>` command) — an OPTIONAL label for this run,
|
|
7635
7678
|
* relayed as `cmd['name']` and slugified server-side into the run's
|
|
7636
7679
|
* `logs/play-*.jsonl` filename and its session-journal line. Findability
|
|
7637
7680
|
* only: no registry, no uniqueness, no lookup verb — grep and `ls` are the
|
|
7638
7681
|
* query engine. Omitted, the filename keeps its exact unnamed shape. */
|
|
7639
|
-
/* `opts.record` (`
|
|
7682
|
+
/* `opts.record` (the editor's `play --record <name>` command) — NAMES this run's recording
|
|
7640
7683
|
* file. It does not ENABLE recording: every relayed play records, with no
|
|
7641
|
-
* flag (see `@
|
|
7684
|
+
* flag (see `@volter/game`'s `src/play/play-recording.ts`). Omitted, the clip is named for
|
|
7642
7685
|
* the durable Gameplay Session; named, it becomes an explicit keepsake in
|
|
7643
|
-
* `.
|
|
7686
|
+
* `.volter/recordings/<name>.webm`. */
|
|
7644
7687
|
async play(opts) {
|
|
7645
7688
|
return this.command({
|
|
7646
7689
|
type: "play",
|
|
@@ -7741,9 +7784,9 @@ var EditorClient = class {
|
|
|
7741
7784
|
return { base64: data.base64, mimeType: data.mimeType };
|
|
7742
7785
|
}
|
|
7743
7786
|
/**
|
|
7744
|
-
* Unit 4 (live-front-door wave) — capture the RUNNING GAME (
|
|
7745
|
-
* screenshot`'s wire leg). Sends the SAME `bridge-screenshot` relay op
|
|
7746
|
-
* `@
|
|
7787
|
+
* Unit 4 (live-front-door wave) — capture the RUNNING GAME (the editor's
|
|
7788
|
+
* `screenshot`'s wire leg). Sends the SAME `bridge-screenshot` relay op
|
|
7789
|
+
* `@volter/live`'s `RelayTransport.screenshot` (and therefore
|
|
7747
7790
|
* `game.screenshot()` on the relay path) already sends, so all three
|
|
7748
7791
|
* surfaces composite the identical full game stack — canvas(es) plus the
|
|
7749
7792
|
* HUD/react DOM layers — rather than any of them inventing a second,
|
|
@@ -7761,8 +7804,8 @@ var EditorClient = class {
|
|
|
7761
7804
|
* refuses it with `BRIDGE_SCREENSHOT_STALE` rather than pass it off as
|
|
7762
7805
|
* current. Setting this asks the relay to render exactly ONE deterministic
|
|
7763
7806
|
* tick (`runTicks(1, {render:'last'})`) first — the same escape
|
|
7764
|
-
* `@
|
|
7765
|
-
* `
|
|
7807
|
+
* `@volter/live`'s `RelayTransport.screenshot` has always used, which is why
|
|
7808
|
+
* the editor's `eval` command could recover these frames while the editor's `screenshot` command could not.
|
|
7766
7809
|
* Off by default: a caller who does not ask must never be handed a frame
|
|
7767
7810
|
* that only exists because the capture drove the game.
|
|
7768
7811
|
*/
|
|
@@ -7847,8 +7890,8 @@ var EditorClient = class {
|
|
|
7847
7890
|
...source,
|
|
7848
7891
|
...options
|
|
7849
7892
|
},
|
|
7850
|
-
// Photographing changes nothing, and this is the relay `
|
|
7851
|
-
// <module>`
|
|
7893
|
+
// Photographing changes nothing, and this is the relay the editor's `screenshot
|
|
7894
|
+
// <module>` command and `project.bake.preview` ride — the lane where a momentary
|
|
7852
7895
|
// transport failure cost a cold agent three probe modules.
|
|
7853
7896
|
{ retryTransport: true }
|
|
7854
7897
|
);
|
|
@@ -7862,7 +7905,7 @@ var EditorClient = class {
|
|
|
7862
7905
|
};
|
|
7863
7906
|
}
|
|
7864
7907
|
/**
|
|
7865
|
-
* A project-defined labeled shot set (`
|
|
7908
|
+
* A project-defined labeled shot set (the editor's `screenshot <target> --shots <set>` command):
|
|
7866
7909
|
* the DEFINITION travels with the command (project data — see
|
|
7867
7910
|
* `AssetPreviewShotSetDefinition`; the CLI resolves it from the registered
|
|
7868
7911
|
* `project.<set>.previewShots` tool), and the editor's generic
|
|
@@ -7891,8 +7934,8 @@ var EditorClient = class {
|
|
|
7891
7934
|
};
|
|
7892
7935
|
}
|
|
7893
7936
|
/**
|
|
7894
|
-
* B8.4 — score the asset against a reference GLB (`
|
|
7895
|
-
* <model.glb> --compare <ref.glb>`): matched orthographic front + side silhouettes
|
|
7937
|
+
* B8.4 — score the asset against a reference GLB (the editor's `screenshot
|
|
7938
|
+
* <model.glb> --compare <ref.glb>` command): matched orthographic front + side silhouettes
|
|
7896
7939
|
* (equal-height bounding-box framing, both yaw-normalized to face the
|
|
7897
7940
|
* camera), per-view IoU numbers, and overlay evidence images. The
|
|
7898
7941
|
* reference GLB's raw bytes travel base64 in the command; the editor
|
|
@@ -7909,7 +7952,7 @@ var EditorClient = class {
|
|
|
7909
7952
|
return { width: data.width, height: data.height, views: data.views };
|
|
7910
7953
|
}
|
|
7911
7954
|
/**
|
|
7912
|
-
* The STORY lane (`
|
|
7955
|
+
* The STORY lane (the editor's `screenshot <file>.stories.tsx` command): every CSF export of
|
|
7913
7956
|
* one project story file rendered in the live session's DOM and captured
|
|
7914
7957
|
* through the same composite leg {@link captureGame} uses, returned as
|
|
7915
7958
|
* per-export images plus one variant sheet. `options.story` narrows to a
|
|
@@ -8041,9 +8084,9 @@ var EditorClient = class {
|
|
|
8041
8084
|
* Run ONE command by id — the door to everything the command palette lists.
|
|
8042
8085
|
*
|
|
8043
8086
|
* Under the Code-OSS frame this is the workbench's own `ICommandService`, so
|
|
8044
|
-
* any command id works: a view's `
|
|
8045
|
-
* `
|
|
8046
|
-
* command service and answers the `
|
|
8087
|
+
* any command id works: a view's `volter.<view>.<verb>`, an editor action's
|
|
8088
|
+
* `volter.action.<id>`, or one of VS Code's own. Standalone the editor's `edit` command has no
|
|
8089
|
+
* command service and answers the `volter.<view>.<verb>` shape directly off
|
|
8047
8090
|
* the views registry, refusing anything else BY NAME.
|
|
8048
8091
|
*
|
|
8049
8092
|
* The result is whatever the command answered — a view verb's state, or
|
|
@@ -8239,7 +8282,7 @@ var EditorClient = class {
|
|
|
8239
8282
|
* `blender-object-info`, `blender-screenshot-view`, `blender-read-file`,
|
|
8240
8283
|
* `blender-write-file`, `blender-list-files`, `blender-start`,
|
|
8241
8284
|
* `blender-status`): Blender runs in the editor tab's worker, and
|
|
8242
|
-
* `
|
|
8285
|
+
* `volter blender-mcp` is transport onto these. `blender-status` is the only
|
|
8243
8286
|
* one that creates nothing — it answers whether this tab already has a
|
|
8244
8287
|
* session, which is how a caller survives an editor restart.
|
|
8245
8288
|
*/
|
|
@@ -8313,7 +8356,7 @@ var EditorClient = class {
|
|
|
8313
8356
|
return data.projects;
|
|
8314
8357
|
}
|
|
8315
8358
|
// --- Registered project tools ---
|
|
8316
|
-
/** List tools explicitly registered in `package.json#
|
|
8359
|
+
/** List tools explicitly registered in `package.json#volter.tools`.
|
|
8317
8360
|
* The editor server loads callable metadata in Node; modules never enter the
|
|
8318
8361
|
* editor browser merely because they were listed. */
|
|
8319
8362
|
async listProjectTools() {
|
|
@@ -8586,11 +8629,11 @@ var RELAY_COMMANDS = {
|
|
|
8586
8629
|
"close-asset-tab": alwaysRefresh(),
|
|
8587
8630
|
"toggle-command-palette": noDerivedRefresh(),
|
|
8588
8631
|
"toggle-console": noDerivedRefresh(),
|
|
8589
|
-
// RELOAD THE EDITOR PAGE — `@
|
|
8632
|
+
// RELOAD THE EDITOR PAGE — `@volter/live`'s `page.reload()`, the one page verb
|
|
8590
8633
|
// no step can express. It is the HOST's, not a package's: reloading the tab
|
|
8591
|
-
// is what the tab is, and until walk 5 it was a `@
|
|
8634
|
+
// is what the tab is, and until walk 5 it was a `@volter/game` command
|
|
8592
8635
|
// contribution, so a project without that package — every model project —
|
|
8593
|
-
// answered `unknown command type "page-reload"` for a door `@
|
|
8636
|
+
// answered `unknown command type "page-reload"` for a door `@volter/live`
|
|
8594
8637
|
// documents as general (measured on a `model-editor create` scaffold,
|
|
8595
8638
|
// 2026-09-21). The handler schedules the navigation for the next task so
|
|
8596
8639
|
// this ack can travel before the channel is torn down; the client waits for
|
|
@@ -8624,7 +8667,7 @@ var RELAY_COMMANDS = {
|
|
|
8624
8667
|
"set-inspection-field": alwaysRefresh(3e4),
|
|
8625
8668
|
"remove-inspection-field": alwaysRefresh(3e4),
|
|
8626
8669
|
// `extract-component` and `fork-component` left this table with their menus
|
|
8627
|
-
// (`@
|
|
8670
|
+
// (`@volter/game/contributions/component-verbs.command.ts`), which carries
|
|
8628
8671
|
// both budgets forward row for row.
|
|
8629
8672
|
// The hierarchy context menu's structure verbs, over the control door. Every
|
|
8630
8673
|
// one of them rewrites the game's own source, so they refresh like a write.
|
|
@@ -8640,7 +8683,7 @@ var RELAY_COMMANDS = {
|
|
|
8640
8683
|
// `open` WAITS FOR THE PROJECT ADAPTER, for the same reason `play` waits on
|
|
8641
8684
|
// the project's async `setup()`: on a cold session the adapter's scene table
|
|
8642
8685
|
// is not there yet, and the door's whole job is to put a document on screen
|
|
8643
|
-
// once it is. MEASURED on three cold `
|
|
8686
|
+
// once it is. MEASURED on three cold the editor's `edit` command sessions over a
|
|
8644
8687
|
// `--template models` probe — 6025 / 6831 / 6474 ms from tab-connected to
|
|
8645
8688
|
// the entry being listed, every one of them first refusing with
|
|
8646
8689
|
// `SCENE_TABLE_UNAVAILABLE`. At the 5 s default the relay's timer won that
|
|
@@ -8663,7 +8706,7 @@ var RELAY_COMMANDS = {
|
|
|
8663
8706
|
// Object3D document's orbit/turntable/frame, the viewport photograph and the
|
|
8664
8707
|
// display and transform toggles — are its own command contribution
|
|
8665
8708
|
// (`viewport-commands.ts`), each budget on its contributed row.
|
|
8666
|
-
// The BLENDER lane's ten verbs are `@
|
|
8709
|
+
// The BLENDER lane's ten verbs are `@volter/blender`'s
|
|
8667
8710
|
// `contributions/blender.command.ts` (WORK.md §The workbench, item D) —
|
|
8668
8711
|
// each row's budget travelled with it, onto the contributed spec the page
|
|
8669
8712
|
// reports to the server. `capture-story-variants` made the same move, to the
|
|
@@ -9080,7 +9123,7 @@ async function openProject(path) {
|
|
|
9080
9123
|
}
|
|
9081
9124
|
async function restart(command, options = {}) {
|
|
9082
9125
|
const { client, url, projectRoot } = await sessionClient();
|
|
9083
|
-
const noOpen = Boolean(process.env["
|
|
9126
|
+
const noOpen = Boolean(process.env["VOLTER_NO_OPEN"]);
|
|
9084
9127
|
const before = await client.getState().catch(() => null);
|
|
9085
9128
|
const divergence = staleAssetCacheWarning(before);
|
|
9086
9129
|
const attached = before?.connected === true || (before?.editorsConnected ?? 0) > 0;
|
|
@@ -9207,7 +9250,7 @@ function parseLookFlags(options) {
|
|
|
9207
9250
|
function screenshotPath(projectRoot, slug) {
|
|
9208
9251
|
const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
|
|
9209
9252
|
const safe = (slug ?? "").toLowerCase().replace(/[^a-z0-9-_]+/g, "-").replace(/^-+|-+$/g, "");
|
|
9210
|
-
return join23(projectRoot, ".
|
|
9253
|
+
return join23(projectRoot, ".volter", "screenshots", slug === void 0 ? `${stamp}.png` : `${safe === "" ? "look" : safe}-${stamp}`);
|
|
9211
9254
|
}
|
|
9212
9255
|
async function screenshot(target, options) {
|
|
9213
9256
|
const flags = parseLookFlags(options);
|
|
@@ -9341,7 +9384,7 @@ async function assetLabLook(client, source, flags, outputDirectory, defaultStage
|
|
|
9341
9384
|
}
|
|
9342
9385
|
async function moduleLook(client, projectRoot, modulePath, flags) {
|
|
9343
9386
|
if (flags.shots !== void 0 || flags.compare !== void 0) {
|
|
9344
|
-
throw new Error("--shots/--compare do not apply to a module target \u2014 the module lane builds bytes that stand nowhere and writes its fixed views under .
|
|
9387
|
+
throw new Error("--shots/--compare do not apply to a module target \u2014 the module lane builds bytes that stand nowhere and writes its fixed views under .volter/screenshots/.");
|
|
9345
9388
|
}
|
|
9346
9389
|
if (flags.width !== void 0 && flags.height !== void 0 && flags.width !== flags.height) {
|
|
9347
9390
|
throw new Error("a module look renders square views \u2014 use --size, not --width/--height");
|
|
@@ -9354,7 +9397,7 @@ async function moduleLook(client, projectRoot, modulePath, flags) {
|
|
|
9354
9397
|
...size === void 0 ? {} : { size }
|
|
9355
9398
|
});
|
|
9356
9399
|
if (!outcome.ok) {
|
|
9357
|
-
const missing = outcome.error?.code === "PROJECT_TOOL_NOT_FOUND" ? ` This project registers no ${toolName} tool (package.json#
|
|
9400
|
+
const missing = outcome.error?.code === "PROJECT_TOOL_NOT_FOUND" ? ` This project registers no ${toolName} tool (package.json#volter.tools).` : "";
|
|
9358
9401
|
throw new Error(`${toolName} refused '${modulePath}' \u2014 ${outcome.error?.message ?? "unknown error"}.${missing}`);
|
|
9359
9402
|
}
|
|
9360
9403
|
const result = outcome.data;
|
|
@@ -9421,7 +9464,7 @@ function runCapabilityCommand(verb, ids, options) {
|
|
|
9421
9464
|
}
|
|
9422
9465
|
return;
|
|
9423
9466
|
}
|
|
9424
|
-
if (!projectDir) throw new Error("No
|
|
9467
|
+
if (!projectDir) throw new Error("No volter.project.json found. Run this command inside a game or pass --project.");
|
|
9425
9468
|
if (verb === "outdated") {
|
|
9426
9469
|
if (ids.length > 0) throw new Error("Usage: volter-game-editor outdated [--project <path>] [--json]");
|
|
9427
9470
|
const rows = capabilityVersions(projectDir, catalogDir);
|
|
@@ -9501,7 +9544,7 @@ ${report.writtenFiles.map((path) => ` ${path}`).join("\n")}`);
|
|
|
9501
9544
|
}
|
|
9502
9545
|
for (const unplaced of report.unplacedFinders) {
|
|
9503
9546
|
const include = unplaced.finder.include ? `, include: [${unplaced.finder.include.map((glob) => `'${glob}'`).join(", ")}]` : "";
|
|
9504
|
-
console.error(`Warning: ${unplaced.capability}'s documents are found by \`${unplaced.finder.finder}\`, but ${unplaced.reason}. Until
|
|
9547
|
+
console.error(`Warning: ${unplaced.capability}'s documents are found by \`${unplaced.finder.finder}\`, but ${unplaced.reason}. Until volter.adapter.ts selects it in \`documents.find\` (\`{ finder: '${unplaced.finder.finder}'${include} }\`), none of them opens.`);
|
|
9505
9548
|
}
|
|
9506
9549
|
for (const unplaced of report.unplacedRegions) {
|
|
9507
9550
|
console.error(`Warning: ${unplaced.capability} renders on the \`${unplaced.surface}\` surface (${unplaced.globs.join(", ")}), but ${unplaced.reason}. The editor will report \`OID001\` for those files until this project declares them.`);
|
|
@@ -9524,12 +9567,12 @@ import {
|
|
|
9524
9567
|
} from "node:fs";
|
|
9525
9568
|
import { homedir as homedir4 } from "node:os";
|
|
9526
9569
|
import { isAbsolute as isAbsolute5, join as join11, resolve as resolve10 } from "node:path";
|
|
9527
|
-
var WORKBENCH_LOCATOR_PATH2 = ".
|
|
9570
|
+
var WORKBENCH_LOCATOR_PATH2 = ".volter/workbench.json";
|
|
9528
9571
|
var RELEASE_RECORD2 = "BUILD.json";
|
|
9529
9572
|
var SOURCES_LAUNCHER2 = join11("scripts", "code-server.sh");
|
|
9530
|
-
var OVERLAY_RECORD2 = ".
|
|
9573
|
+
var OVERLAY_RECORD2 = ".volter-overlay.json";
|
|
9531
9574
|
function writeWorkbenchDeclaration2(projectRoot, workbenchDir) {
|
|
9532
|
-
mkdirSync8(join11(projectRoot, ".
|
|
9575
|
+
mkdirSync8(join11(projectRoot, ".volter"), { recursive: true });
|
|
9533
9576
|
writeFileSync8(
|
|
9534
9577
|
join11(projectRoot, WORKBENCH_LOCATOR_PATH2),
|
|
9535
9578
|
`${JSON.stringify({ workbench: resolve10(workbenchDir) }, null, 2)}
|
|
@@ -9550,7 +9593,7 @@ function resolveWorkbench2(dir, expectedProduct) {
|
|
|
9550
9593
|
if (expectedProduct !== void 0 && resolved.product !== expectedProduct) {
|
|
9551
9594
|
throw new Error(
|
|
9552
9595
|
`${root} is a ${resolved.product} workbench and this project opens in ${expectedProduct}. A workbench is built for ONE product \u2014 the editor kit and that product's workbench half are overlaid on the fork together \u2014 so its title, its look and its commands are the other product's, whatever this session serves into it. ${resolved.kind === "sources" ? `Re-overlay the checkout:
|
|
9553
|
-
node scripts/workbench/dev.mjs --checkout ${root} --product ${expectedProduct}` : `Name a ${expectedProduct} release in .
|
|
9596
|
+
node scripts/workbench/dev.mjs --checkout ${root} --product ${expectedProduct}` : `Name a ${expectedProduct} release in .volter/workbench.json, or cut one:
|
|
9554
9597
|
node scripts/workbench/build-release.mjs --product ${expectedProduct} --platform ${machinePlatform2()} --checkout <fork dir>`}`
|
|
9555
9598
|
);
|
|
9556
9599
|
}
|
|
@@ -9608,7 +9651,7 @@ function resolveSources2(dir) {
|
|
|
9608
9651
|
const marker = join11(dir, OVERLAY_RECORD2);
|
|
9609
9652
|
if (!existsSync9(marker)) {
|
|
9610
9653
|
throw new Error(
|
|
9611
|
-
`${dir} is a Code-OSS checkout with no
|
|
9654
|
+
`${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:
|
|
9612
9655
|
node scripts/workbench/dev.mjs --checkout ${dir} --product <model-editor|game-editor>`
|
|
9613
9656
|
);
|
|
9614
9657
|
}
|
|
@@ -9632,10 +9675,10 @@ function resolveSources2(dir) {
|
|
|
9632
9675
|
cwd: dir
|
|
9633
9676
|
};
|
|
9634
9677
|
}
|
|
9635
|
-
var WORKBENCH_CACHE_ROOT2 = join11(homedir4(), ".
|
|
9678
|
+
var WORKBENCH_CACHE_ROOT2 = join11(homedir4(), ".volter", "workbenches");
|
|
9636
9679
|
|
|
9637
9680
|
// node/cli.ts
|
|
9638
|
-
var PRODUCT3 = { packageName: package_default.name, id: "game-editor", displayName: package_default.
|
|
9681
|
+
var PRODUCT3 = { packageName: package_default.name, id: "game-editor", displayName: package_default.volter.product.displayName, command: Object.keys(package_default.bin)[0] };
|
|
9639
9682
|
async function playVerb(verb) {
|
|
9640
9683
|
const { connect: connect2 } = await import("@volter/editor-live");
|
|
9641
9684
|
const { EditorClient: EditorClient3 } = await Promise.resolve().then(() => (init_client(), client_exports));
|