@volter/game-editor 0.5.68 → 0.5.70
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 +10941 -5080
- package/LICENSE +9 -10
- 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 +5 -5
- package/catalog/project-source/LICENSE +6 -6
- 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/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 +4026 -4026
- package/dist/assets/{AssetBudgetPanel-P2PeL_X5.js → AssetBudgetPanel-DpXsaQ6w.js} +4 -4
- package/dist/assets/AudioViewer-BdTHfNhD.js +1 -0
- package/dist/assets/{CanvasBoardDocument-BFJdTVGp.js → CanvasBoardDocument-DY-7zohc.js} +1 -1
- package/dist/assets/CanvasSceneViewport-57CEFqSM.js +1 -0
- package/dist/assets/ColorInput-Co6tCY9p.js +1 -0
- package/dist/assets/{EntityModelDocument-Du8wIbyK.js → EntityModelDocument-C-lhKrxv.js} +1 -1
- package/dist/assets/{EnvironmentAssetDocument-_SttfMY_.js → EnvironmentAssetDocument-BNe6ANTN.js} +1 -1
- package/dist/assets/{GameplaySessionTimeline-CWudWnfd.js → GameplaySessionTimeline-CryFYfYN.js} +1 -1
- package/dist/assets/ImageViewer-DiD2yIG4.js +1 -0
- package/dist/assets/{InspectorCanvasPreview-CEr_Kxna.js → InspectorCanvasPreview-BrFjhoiD.js} +1 -1
- package/dist/assets/InspectorObjectPreview-BBVO8bDT.js +1 -0
- package/dist/assets/JsonAssetDocument-xyXetSbl.js +2 -0
- package/dist/assets/{LiveModuleDocument-BWjOzO_6.js → LiveModuleDocument-BiAunjHS.js} +1 -1
- package/dist/assets/{LutAssetDocument-DIc6nsht.js → LutAssetDocument-5sW-5rb0.js} +1 -1
- package/dist/assets/{ModelAssetDocument-_CqTsX_A.js → ModelAssetDocument-Bdy7x47a.js} +1 -1
- package/dist/assets/{NonThreeAuthoringBootstrap-C-V23E1e.js → NonThreeAuthoringBootstrap-BP-1bVEr.js} +1 -1
- package/dist/assets/Object3DDocumentToolbar-CvnSLDPI.js +1 -0
- package/dist/assets/Object3DDocumentViewport-BE_OPc8T.js +2 -0
- package/dist/assets/{Object3DPreview-BPHEr3vI.js → Object3DPreview-D3w_dKrX.js} +1 -1
- package/dist/assets/OnlineAssetDetail-BnT8_p1W.js +1 -0
- package/dist/assets/PlayBar-C8Mn-EI0.js +1 -0
- package/dist/assets/{QuarksAssetDocument-4Dne3EHx.js → QuarksAssetDocument-DLMH5Csk.js} +1 -1
- package/dist/assets/ReactCanvasControls-rNz8syVB.js +1 -0
- package/dist/assets/RootSelectionOverlay-Cn2Rbr1N.js +1 -0
- package/dist/assets/{ShaderAssetDocument-W3ZjLCkt.js → ShaderAssetDocument-CsJCsNfA.js} +4 -4
- package/dist/assets/ShadowEditor-jB05hr1W.js +1 -0
- package/dist/assets/{SourceAssetViewer-BGUeDAEv.js → SourceAssetViewer-D0NgGrER.js} +1 -1
- package/dist/assets/StageHost-B3Yt4I7r.js +2 -0
- package/dist/assets/{StoryPreviewMount-Di8uMovM.js → StoryPreviewMount-CzzRn24c.js} +1 -1
- package/dist/assets/ThreeBoardDocument-BoHTN4Vl.js +2 -0
- package/dist/assets/{ThreeIsolationSceneContent-BAKurKW5.js → ThreeIsolationSceneContent-BM-0S6J5.js} +1 -1
- package/dist/assets/{ToolObject3DPreview-CffvGJ1h.js → ToolObject3DPreview-BeM_kx_u.js} +1 -1
- package/dist/assets/Toolbar-BZyog9MR.js +1 -0
- package/dist/assets/{TransientHint-CgmkrmKF.js → TransientHint-RJEkOJoy.js} +1 -1
- package/dist/assets/VideoViewer-CxajgKrf.js +1 -0
- package/dist/assets/ViewportShadingMenu-S2lADFJg.js +1 -0
- package/dist/assets/active-ingest-CjZtqL7Q.js +3 -0
- package/dist/assets/{animation-clock-fLmY_3--.js → animation-clock-CWVW-mqY.js} +1 -1
- package/dist/assets/animation-mixers.service-CpoYw8cs.js +1 -0
- package/dist/assets/animation-timeline.utility-CEerojaB.js +1 -0
- package/dist/assets/{asset-budget-asset.menu-BDRDWrvx.js → asset-budget-asset.menu-Bk6scVWQ.js} +1 -1
- package/dist/assets/{asset-budget.action-tQmNGQHC.js → asset-budget.action-DtBDSfDj.js} +1 -1
- package/dist/assets/{asset-budget.document-BthgX37Z.js → asset-budget.document-R2zyoJ8E.js} +1 -1
- package/dist/assets/{asset-budget.menu-DfyWVH6p.js → asset-budget.menu-D6jza5Bc.js} +1 -1
- package/dist/assets/asset-editor-persistence-DrgwOZIW.js +1 -0
- package/dist/assets/asset-loaders-CUeYIjeH.js +2 -0
- package/dist/assets/{asset-preview-Cv7tfD98.js → asset-preview-CQfnI2cX.js} +1 -1
- package/dist/assets/{audio-unlock.service-BvHvZjzx.js → audio-unlock.service-W3UBKsw9.js} +1 -1
- package/dist/assets/audio.utility-qrXBdGXg.js +1 -0
- package/dist/assets/autoplay.service-DQD3Swo9.js +1 -0
- package/dist/assets/{babylon-authoring-adapter-Cg5ALSpr.js → babylon-authoring-adapter-CS9LZNmz.js} +1 -1
- package/dist/assets/binding-resolver-B9VI52zt.js +2 -0
- package/dist/assets/blender-emscripten-engine-Cd6az4pU.js +2 -0
- package/dist/assets/{blender-node-editor.document-B92MO51u.js → blender-node-editor.document-BWLFvA2g.js} +1 -1
- package/dist/assets/{blender-properties-tab-CDVyDAbf.js → blender-properties-tab-BSmWG9d0.js} +1 -1
- package/dist/assets/{blender-runtime-host-CuniE0sy.js → blender-runtime-host-Cbkie7m4.js} +2 -2
- package/dist/assets/{blender-runtime-skin-B_tOz5j5.js → blender-runtime-skin-C_ATCb-z.js} +7 -7
- package/dist/assets/{blender-runtime.document-DxUwLiEW.js → blender-runtime.document-P9zdgwMt.js} +7 -7
- package/dist/assets/{blender-timeline.document-BdEEoQbK.js → blender-timeline.document-DRwySEJO.js} +1 -1
- package/dist/assets/{blender-uv-editor.document-EMSUlRh4.js → blender-uv-editor.document-CmLoL2Vo.js} +1 -1
- package/dist/assets/blender-version.status-CP4Jqkry.js +1 -0
- package/dist/assets/blender-wali-engine-CZcS3eAd.js +2 -0
- package/dist/assets/{blender.command-BkBML2SY.js → blender.command-BYGm0Q_s.js} +1 -1
- package/dist/assets/blender.status-BMETIbb2.js +1 -0
- package/dist/assets/board-guides-BG-MHK2G.js +1 -0
- package/dist/assets/body-marks-C1LxJtQb.js +1 -0
- package/dist/assets/{bridge.command-VnplZ81v.js → bridge.command-DpUNErKN.js} +3 -3
- package/dist/assets/{browserAll-BCmkqg8n.js → browserAll-DES3i79H.js} +1 -1
- package/dist/assets/{build-player.document-DV7YcJQt.js → build-player.document-B42HrdSU.js} +1 -1
- package/dist/assets/build-profiles.document-Di5CQoH9.js +2 -0
- package/dist/assets/build-progress.status-B4te7-3j.js +1 -0
- package/dist/assets/{build-session-BGe0eGrQ.js → build-session-Yw4JoE8T.js} +2 -2
- package/dist/assets/{build.action-Bdj4ZEL_.js → build.action-B-DBpUj6.js} +1 -1
- package/dist/assets/{build.command-DAWiYvPa.js → build.command-CfWoHNp0.js} +1 -1
- package/dist/assets/build.header-BaURztYD.js +1 -0
- package/dist/assets/{build.menu-BiRNC_xc.js → build.menu-BFBn-dPJ.js} +1 -1
- package/dist/assets/{build.service-Dw9K6VSF.js → build.service-D8gYWB3n.js} +1 -1
- package/dist/assets/{camera-C-qXzXFf.js → camera-C-uR_xQp.js} +1 -1
- package/dist/assets/{camera-runtime.inspector-BDrwWRlU.js → camera-runtime.inspector-BOGGEqVq.js} +1 -1
- package/dist/assets/{canvas-design-mount-DLn49Zle.js → canvas-design-mount-DamLAaWn.js} +4 -4
- package/dist/assets/canvas-entry-runtime-a6N7Rsrj.js +2 -0
- package/dist/assets/{canvas-preview-frames-B5xFRjhQ.js → canvas-preview-frames-XbrKuyJu.js} +1 -1
- package/dist/assets/{canvas-story-capture.service-DQ_leYyi.js → canvas-story-capture.service-DYRdEzkG.js} +2 -2
- package/dist/assets/capability-coverage-7wKVA3PF.js +7 -0
- package/dist/assets/{collaboration-presence-BOS1t8wI.js → collaboration-presence-DaVKEfxs.js} +1 -1
- package/dist/assets/{collider-Bf4Uk6LW.js → collider-BEwlgkG5.js} +1 -1
- package/dist/assets/component-board.service-BWSBM2Bb.js +2 -0
- package/dist/assets/{component-board.service-DFSSCaCf.js → component-board.service-C9ZouakC.js} +2 -2
- package/dist/assets/{component-board.service-CpVXGhz5.js → component-board.service-D2eGKqHf.js} +2 -2
- package/dist/assets/component-contracts.service-D0uElctD.js +1 -0
- package/dist/assets/component-instance-root-C1Xf4SwR.js +1 -0
- package/dist/assets/{component-verbs.command-DGzZAV_Z.js → component-verbs.command-N-Tj8KOS.js} +1 -1
- package/dist/assets/{component-verbs.service-D1rVRogp.js → component-verbs.service-CWh4mQ7X.js} +1 -1
- package/dist/assets/{config-D-EAAhqP.js → config-hmmj-QHZ.js} +4 -4
- package/dist/assets/{configurations-_HZOWZPy.js → configurations-B9Pi_eRN.js} +1 -1
- package/dist/assets/connection.status-C2HPxoww.js +1 -0
- package/dist/assets/{constraint-5KLYpGm7.js → constraint-Bp1l8hY-.js} +1 -1
- package/dist/assets/constraints.inspector-D-h1f3K2.js +1 -0
- package/dist/assets/{content-bounds-DKBD7nsv.js → content-bounds-7UyI42Vj.js} +1 -1
- package/dist/assets/{contract-system-adapters-h6OUBRYA.js → contract-system-adapters-Bq1LGdjs.js} +1 -1
- package/dist/assets/coverage.service-BiBikIsV.js +3 -0
- package/dist/assets/{create-runtime-Bg2uYMfh.js → create-runtime-Cx-q5z2y.js} +2 -2
- package/dist/assets/curve-Co_mro-I.js +1 -0
- package/dist/assets/{data-asset-7Nfmx-28.js → data-asset-Ckx4D_U_.js} +1 -1
- package/dist/assets/data-check-core-CHqar_E8.js +1 -0
- package/dist/assets/data-ref-70PUrMuT.js +1 -0
- package/dist/assets/debug-bridge-CarsgKpm.js +1 -0
- package/dist/assets/debug-registry-DgYNlhH_.js +1 -0
- package/dist/assets/{deferred-ingest-play-Bej67_y9.js → deferred-ingest-play-Bpdhu2i-.js} +2 -2
- package/dist/assets/{design-time-canvas-mount-CFW9ZWuk.js → design-time-canvas-mount-Ca9Q75Ui.js} +2 -2
- package/dist/assets/design-time-layers-BIb71snu.js +1 -0
- package/dist/assets/{design-time-mount.service-DJeAPUB_.js → design-time-mount.service-DL6ZK2TQ.js} +2 -2
- package/dist/assets/{design-time-mount.service-_R1UDCw3.js → design-time-mount.service-zKUVjKAu.js} +2 -2
- package/dist/assets/design-time-react-mount-NrWimSxY.js +1 -0
- package/dist/assets/{document-preview-three-5cbuuJMH.js → document-preview-three-DoDs6q1q.js} +1 -1
- package/dist/assets/{dom-authoring-adapter-CoESNvrM.js → dom-authoring-adapter-adLQog9l.js} +1 -1
- package/dist/assets/{draco3d-Sk9K4AUT.js → draco3d-aUvQF1Zx.js} +1 -1
- package/dist/assets/{edit-mode-audio.service-CH6J-8N7.js → edit-mode-audio.service-CHZ1ultu.js} +1 -1
- package/dist/assets/edit-mode-authoring-ZQuUwc6e.js +1 -0
- package/dist/assets/{edit-mode-networking.service-C4o2pGHX.js → edit-mode-networking.service-C7fk2fL1.js} +1 -1
- package/dist/assets/editor-api-C8MUOrwt.js +1 -0
- package/dist/assets/{editor-layers-B4oYfpj8.js → editor-layers-CGX7iCSP.js} +1 -1
- package/dist/assets/editor-presentation-activity-CqJH4G9t.js +1 -0
- package/dist/assets/{editor-shell-store-Bh1S7M54.js → editor-shell-store-BRqB1JZO.js} +1 -1
- package/dist/assets/{entity-object-B_5Gc0Ky.js → entity-object--ZpqIat7.js} +1 -1
- package/dist/assets/{extend-DcEyE5jI.js → extend-BZQIQ18F.js} +1 -1
- package/dist/assets/{fork-menu-CKjNh3MO.js → fork-menu-CziehkPx.js} +1 -1
- package/dist/assets/{frame-debugger-store-D5YViF_8.js → frame-debugger-store-BOQjrPsh.js} +1 -1
- package/dist/assets/game-audio-BeCyd0Ha.js +1 -0
- package/dist/assets/{game-contract-seams-C0AVYwvO.js → game-contract-seams-Dgqv6S8X.js} +1 -1
- package/dist/assets/{game-css-scope-transform-8GOvVu1s.js → game-css-scope-transform-anfk8vP_.js} +2 -2
- package/dist/assets/game-document.service-CqmgrRUA.js +1 -0
- package/dist/assets/game-eval.command-CoetFm6_.js +2 -0
- package/dist/assets/game-module-access-Cg1EB8Mx.js +1 -0
- package/dist/assets/game-network-BqI-Ehz0.js +22 -0
- package/dist/assets/{gameplay-export-K5AcStVC.js → gameplay-export-D0hZoeSg.js} +1 -1
- package/dist/assets/gameplay-replay-BHz6VAVa.js +1 -0
- package/dist/assets/{gameplay.command-DoWqBWhH.js → gameplay.command-CPc9GKuW.js} +1 -1
- package/dist/assets/generation-CdOATubd.css +1 -0
- package/dist/assets/{generation-jobs-CiabIfR0.js → generation-jobs-D-zXQNZI.js} +1 -1
- package/dist/assets/generation.service-Bwt9lQEG.js +1 -0
- package/dist/assets/{generations-DU9rCeQR.js → generations-d-U9lCVo.js} +1 -1
- package/dist/assets/generations.status-BQ8xhaLN.js +1 -0
- package/dist/assets/hierarchy-marks-CndAXtie.js +1 -0
- package/dist/assets/hierarchy-marks-CsTaTkc7.js +1 -0
- package/dist/assets/hosted-asset-materialization-r2vKfJGY.js +2 -0
- package/dist/assets/{ibl-override-material-CiKkaOTW.js → ibl-override-material-CMo_a49U.js} +1 -1
- package/dist/assets/index-BMxv2MNV.js +1 -0
- package/dist/assets/index-BPVnvJfX.js +1 -0
- package/dist/assets/{index-C4AUQbmq.js → index-BqzpzjSB.js} +1 -1
- package/dist/assets/{index-CC1puVjo.js → index-CMU7lnXk.js} +1 -1
- package/dist/assets/index-CPiRKiDC.css +1 -0
- package/dist/assets/{index-CaG87ZF-.js → index-Cr9NTnJp.js} +271 -270
- package/dist/assets/index-DSMLYme2.js +1 -0
- package/dist/assets/index-DoGlzvsX.js +1 -0
- package/dist/assets/{index-BsYc2Oyj.js → index-dlvCCB72.js} +1 -1
- package/dist/assets/{index-Kb9_s5aP.js → index-xjc_62Ha.js} +1 -1
- package/dist/assets/{index-C20Flc1s.js → index-z0_InXxO.js} +2 -2
- package/dist/assets/{inference-diagnostics-MGcIHEX6.js → inference-diagnostics-D5jfxI5p.js} +1 -1
- package/dist/assets/{ingest-boot-viewport-D2okO6JI.js → ingest-boot-viewport-Be0v44yf.js} +1 -1
- package/dist/assets/ingest-siblings-BowXSozE.js +1 -0
- package/dist/assets/ingest-source-persistence-BGIvThcv.js +1 -0
- package/dist/assets/ingest.service-wVm-ZcTI.js +1 -0
- package/dist/assets/{inspect-C8RP8G5F.js → inspect-CN92MgRT.js} +1 -1
- package/dist/assets/inspection-D8fZOHCM.js +1 -0
- package/dist/assets/instances.command-B6gJuL1Z.js +1 -0
- package/dist/assets/{json-history-resource-CTXRV4GD.js → json-history-resource-C9G_vCX9.js} +1 -1
- package/dist/assets/{layered-pick-B_-BRrRD.js → layered-pick-D9tIz_m7.js} +1 -1
- package/dist/assets/{light-CskDQ8gF.js → light-BGbl1a8K.js} +1 -1
- package/dist/assets/{live-project-verbs-BOAQN3ME.js → live-project-verbs-p1sdTwhF.js} +1 -1
- package/dist/assets/{machine.document-BxOoCOo9.js → machine.document-C1acXU7l.js} +1 -1
- package/dist/assets/{machines.finder-CqEceWzS.js → machines.finder-sOxNTYPx.js} +1 -1
- package/dist/assets/material-D7289cYI.js +1 -0
- package/dist/assets/{material-factory-qB9pzcQf.js → material-factory-D0T-DH8c.js} +1 -1
- package/dist/assets/{mesh-5--4qA-C.js → mesh-1A-HHxD6.js} +1 -1
- package/dist/assets/model-asset-sections-D1uxOu2v.css +1 -0
- package/dist/assets/model-asset-sections.service-DF-mllTL.js +1 -0
- package/dist/assets/{model-inspection-MrJY0U_-.js → model-inspection-CuVwNVvv.js} +1 -1
- package/dist/assets/{model-thumbnail-uk-2sblh.js → model-thumbnail-xm1Fabi2.js} +1 -1
- package/dist/assets/{models.finder-rk8dhgO8.js → models.finder-DrvU1qGk.js} +1 -1
- package/dist/assets/module-mode-BHOAAbgO.js +2 -0
- package/dist/assets/mount-canvas-ingest-root-aVZkVNh4.js +2 -0
- package/dist/assets/mount-dom-ingest-root-eOOGPaxi.js +2 -0
- package/dist/assets/{mount-ingest-root-BC3-1Cw1.js → mount-ingest-root-BsWbEvr_.js} +2 -2
- package/dist/assets/{mount-manifest-QJOB11Kv.js → mount-manifest-t6ipNsoF.js} +1 -1
- package/dist/assets/mount-readiness-DyAd17pe.js +4 -0
- package/dist/assets/mount-three-ingest-root-DIR0wKrN.js +1 -0
- package/dist/assets/{mounted-authoring-B7RL_V28.js → mounted-authoring-DX3DC9PJ.js} +1 -1
- package/dist/assets/{mounted-story-viewport-source-CnYhX3vW.js → mounted-story-viewport-source-D8FqGpci.js} +1 -1
- package/dist/assets/{native-debug-module-B-rWJfWE.js → native-debug-module-CB738yQu.js} +1 -1
- package/dist/assets/{navigation-BVu-aVmF.js → navigation-B9ihB0qU.js} +1 -1
- package/dist/assets/{navmesh.menu-C3M63eR4.js → navmesh.menu-CPxr9LPT.js} +1 -1
- package/dist/assets/{navmesh.service-B0H1fUfn.js → navmesh.service-BAtili_Y.js} +1 -1
- package/dist/assets/network-observer.service-CqTuZNtI.js +1 -0
- package/dist/assets/network.utility-CclYEmfV.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-OjqzJ86S.js → object3d-document-session-registry-BWeuL0nf.js} +2 -2
- package/dist/assets/{oid-transform-Bzc2ZJSH.js → oid-transform-BYeAsBKI.js} +1 -1
- package/dist/assets/{particles-Be7AvO4c.js → particles-BXiQDiB-.js} +1 -1
- package/dist/assets/{performance-profiler-OwnXQX0M.js → performance-profiler-CMbwGBuk.js} +1 -1
- package/dist/assets/pixi-authoring-adapter-CPsN0Yk7.js +1 -0
- package/dist/assets/pixi-live-write-target-BUbt5ixX.js +1 -0
- package/dist/assets/{play.command-CIGRq8ow.js → play.command-Bz5Ra6Uj.js} +2 -2
- package/dist/assets/pose-guard-CLabLSzf.js +1 -0
- package/dist/assets/presentation-C7ZHYsKF.js +1 -0
- package/dist/assets/{product-BN31wSnB.js → product-MSpbAqgo.js} +1 -1
- package/dist/assets/{profiler.action-D57Kj9ym.js → profiler.action-1Jbc-7Q4.js} +1 -1
- package/dist/assets/{profiler.menu-Dh9Q5DDx.js → profiler.menu-C544DxWZ.js} +1 -1
- package/dist/assets/profiler.utility-QnzedS3X.js +1 -0
- package/dist/assets/{project-authoring-session-LCJAwGrD.js → project-authoring-session-BhNfg7TY.js} +2 -2
- package/dist/assets/project-provenance-BGnJXJwa.js +1 -0
- package/dist/assets/{properties-bone-constraints.inspector-CaIDq5nN.js → properties-bone-constraints.inspector-DRCPfugt.js} +1 -1
- package/dist/assets/{properties-bone.inspector-D2fcQGMF.js → properties-bone.inspector-CYHeZX0p.js} +1 -1
- package/dist/assets/{properties-collection.inspector-CF5AtTAd.js → properties-collection.inspector-DtGhPkiU.js} +1 -1
- package/dist/assets/{properties-constraints.inspector-Bj2itDrS.js → properties-constraints.inspector-TIyIV777.js} +1 -1
- package/dist/assets/{properties-data.inspector-BfRqk0Xo.js → properties-data.inspector-vA0MTaup.js} +1 -1
- package/dist/assets/{properties-material.inspector-Bf8H0mvu.js → properties-material.inspector-C73spBQh.js} +1 -1
- package/dist/assets/{properties-modifiers.inspector-BKShc1TH.js → properties-modifiers.inspector-9oyLBBE0.js} +1 -1
- package/dist/assets/{properties-object.inspector-YBh8ABnN.js → properties-object.inspector-7BuiUgbd.js} +1 -1
- package/dist/assets/{properties-output.inspector-CVkzfs-l.js → properties-output.inspector-CjYAggz2.js} +1 -1
- package/dist/assets/{properties-particles.inspector-ChDpAq-2.js → properties-particles.inspector-DpSfjykX.js} +1 -1
- package/dist/assets/{properties-physics.inspector-BLEM7aMj.js → properties-physics.inspector-BUTvmfU9.js} +1 -1
- package/dist/assets/{properties-render.inspector-vU4D9xLL.js → properties-render.inspector-CEdsDqbI.js} +1 -1
- package/dist/assets/{properties-scene.inspector-C-DoN-kL.js → properties-scene.inspector-4kp0sLNw.js} +1 -1
- package/dist/assets/{properties-texture.inspector-DySxy1oU.js → properties-texture.inspector-Ckpqy9eo.js} +1 -1
- package/dist/assets/{properties-view-layer.inspector-DEKxMahJ.js → properties-view-layer.inspector-CQIFbY8-.js} +1 -1
- package/dist/assets/{properties-world.inspector-m5qL_TQV.js → properties-world.inspector-xZgNV6rI.js} +1 -1
- package/dist/assets/r3f-design-session-D8VF-hty.js +2 -0
- package/dist/assets/{r3f-physics-binding-Bgzzd4ol.js → r3f-physics-binding-oippu1v_.js} +1 -1
- package/dist/assets/{r3f-source-authoring-adapter-C8oMjdTL.js → r3f-source-authoring-adapter-CZJX6VLM.js} +1 -1
- package/dist/assets/react-canvas-navigation-DuzvnFoN.js +1 -0
- package/dist/assets/react-inspector.service-CV4p6nrb.js +1 -0
- package/dist/assets/react-story-board-mhldts6w.js +1 -0
- package/dist/assets/{react-three-rapier.esm-BR2ttgLS.js → react-three-rapier.esm-Bo9LjrZe.js} +1 -1
- package/dist/assets/react-world-authoring-adapter-CuyruDfq.js +1 -0
- package/dist/assets/{realm-services-DefTrXnY.js → realm-services-BtiLE3a-.js} +1 -1
- package/dist/assets/reflection-probe-capture.inspector-mrrOHs-9.js +1 -0
- package/dist/assets/{reflection-probe-BHNGwVyz.js → reflection-probe-sIto9mh0.js} +1 -1
- package/dist/assets/registry-DpUr2YIM.js +1 -0
- package/dist/assets/{relative-import-specifier-DQzkawgj.js → relative-import-specifier-CyT6yU4l.js} +1 -1
- package/dist/assets/{render-env-BZ7LsGfk.js → render-env-C63BGT5v.js} +1 -1
- package/dist/assets/{render-features-C7QwmhCo.js → render-features-CBl6rom9.js} +1 -1
- package/dist/assets/{render-settings-BBvkacR3.js → render-settings-DjarlnjI.js} +1 -1
- package/dist/assets/resolve-three-OiswFiIS.js +702 -0
- package/dist/assets/root-seam-contract-BYLQx4CQ.js +1 -0
- package/dist/assets/{run-selection-BUeubtHj.js → run-selection-BMu0v3qC.js} +1 -1
- package/dist/assets/scene-capture-BLf3lJ44.js +1 -0
- package/dist/assets/scene-document.service-CjPDph5k.js +2 -0
- package/dist/assets/{scene-framing-PVMqGU8h.js → scene-framing-BhNk0WhI.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-DmdE0u-C.js +1 -0
- package/dist/assets/{session-CTXsU1lK.js → session-CeyQA0Dv.js} +35 -35
- package/dist/assets/{setup-renderer-OOw1SykJ.js → setup-renderer-Bf8g2S0f.js} +1 -1
- package/dist/assets/{source-object3d-authoring-adapter-RmutT5Dt.js → source-object3d-authoring-adapter-IDRws2Nk.js} +1 -1
- package/dist/assets/{source-persistence-backend-HviqjKZ2.js → source-persistence-backend-Dzc6MsmN.js} +1 -1
- package/dist/assets/{spark-renderer-lifecycle-DfYpvEJa.js → spark-renderer-lifecycle-B6Axb6jm.js} +1 -1
- package/dist/assets/{stage-keyboard-DDi7S27C.js → stage-keyboard-CpnIYiph.js} +1 -1
- package/dist/assets/stage-overlay-set-BrJzOTCe.js +1 -0
- package/dist/assets/stage-presence-markers-BFTl9Djp.js +1 -0
- package/dist/assets/stage-transform-tools-QaenmSrC.js +1 -0
- package/dist/assets/standard-viewport-dressing-DuKH01r4.js +24 -0
- package/dist/assets/{state-watch.action-DEdb1mNa.js → state-watch.action-BaRZ6YII.js} +1 -1
- package/dist/assets/{state-watch.menu-jWbUM3kw.js → state-watch.menu-DR2AtQ6r.js} +1 -1
- package/dist/assets/state-watch.utility-VW8H9Fgi.js +1 -0
- package/dist/assets/{story-capture-Dj1xkeKH.js → story-capture-BEVV48wm.js} +1 -1
- package/dist/assets/story-documents-DndjqJ7Y.js +3 -0
- package/dist/assets/{story-documents.service-BzQCuNBu.js → story-documents.service-CPrZ7gRM.js} +1 -1
- package/dist/assets/{story-documents.service-iNP-ORNr.js → story-documents.service-wCVmBPhh.js} +1 -1
- package/dist/assets/{story-media-presence-zTPlU9HR.js → story-media-presence-BSX78yVJ.js} +1 -1
- package/dist/assets/{story-pixi-preview-B7THvSl7.js → story-pixi-preview-D4FuH7lJ.js} +1 -1
- package/dist/assets/{story-presentation-BLXYPadR.js → story-presentation-2AxtnKGb.js} +1 -1
- package/dist/assets/story-three-preview-DjObHSAF.js +2 -0
- package/dist/assets/{structural-ids-Br2zjINh.js → structural-ids-BOo2BRoY.js} +1 -1
- package/dist/assets/studio-environment-B--4k2mN.js +2 -0
- package/dist/assets/{surface-state-D9j6qNu8.js → surface-state-CQHVfsma.js} +1 -1
- package/dist/assets/{syntactic-prop-specs-BTnsMOvH.js → syntactic-prop-specs-CewRyC4c.js} +1 -1
- package/dist/assets/team-playtest.service-B9m6CNk7.js +1 -0
- package/dist/assets/{three-oYrcK5SQ.js → three-B86IzdNg.js} +1 -1
- package/dist/assets/three-authoring-adapter-BD8_MtYK.js +1 -0
- package/dist/assets/three-authoring.service-BjJ9wetk.js +2 -0
- package/dist/assets/{three-ingest-runtime-CXKjNysA.js → three-ingest-runtime-CXySzulx.js} +1 -1
- package/dist/assets/{three-integration-CuAnYaTW.js → three-integration-nl5TC6EF.js} +2 -2
- package/dist/assets/three-integration.service-BEk5QkKM.js +1 -0
- package/dist/assets/three-projection-core-D4m8lsPU.js +1 -0
- package/dist/assets/{three-state-wXRU3rLr.js → three-state-C36FeFK4.js} +1 -1
- package/dist/assets/{three-story-capture.service-DMJRcqjr.js → three-story-capture.service-C0icETyL.js} +2 -2
- package/dist/assets/{three-story-model-DgiAP-oQ.js → three-story-model-CqWu9S2a.js} +1 -1
- package/dist/assets/three-viewport-presentation-CCMgGLI2.js +141 -0
- package/dist/assets/tools-BnE3UWVA.js +1 -0
- package/dist/assets/transform-mode-request-CIgYj1Qb.js +1 -0
- package/dist/assets/transport-strip-B1AJKpn-.js +1 -0
- package/dist/assets/transport.header-D-n6dQ5n.js +1 -0
- package/dist/assets/{trigger-volume-DP0G1VBe.js → trigger-volume-BLkHmfm9.js} +1 -1
- package/dist/assets/tuples-uyiMYXrv.js +1 -0
- package/dist/assets/ui-board-document-6e4w4a8B.js +2 -0
- package/dist/assets/{user-data-CqOoAowZ.js → user-data-BXFD1jg-.js} +1 -1
- package/dist/assets/user-data-CODoGZqA.js +1 -0
- package/dist/assets/{utility-view-state-Db97zwDz.js → utility-view-state-I_o0WThv.js} +1 -1
- package/dist/assets/viewport-door-AsLxGhLN.js +1 -0
- package/dist/assets/{viewport-root-presentation-B35t51xX.js → viewport-root-presentation-B1qtThOB.js} +1 -1
- package/dist/assets/{viewport-surface-status-D5kZtFW5.js → viewport-surface-status-CWmQeKTO.js} +1 -1
- package/dist/assets/{webworkerAll-CfKEb4Ao.js → webworkerAll-DC445ANd.js} +1 -1
- package/dist/assets/worker-jepHAPPr.js +2 -0
- package/dist/assets/workspace-arrangement-dkubzCff.js +1 -0
- package/dist/assets/world-documents-psBK5u_2.js +1 -0
- package/dist/assets/world-root-stage-binding-BrvO8VMz.js +1 -0
- package/dist/assets/{xstate-animation-binding-aQEmNSpm.js → xstate-animation-binding-ChVFHSlM.js} +1 -1
- package/dist/assets/{xstate-animation-meta-CnMX1Sc1.js → xstate-animation-meta-D7xnhyCE.js} +1 -1
- package/dist/volter-shared-react.json +10 -0
- package/dist/volter-shared-three.json +3 -0
- package/dist-node/cli.js +247 -209
- package/dist-node/create.js +90 -74
- package/package.json +20 -19
- 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 -18
- 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/.agents/skills/{vgai-3d-models → volter-3d-models}/SKILL.md +3 -3
- package/template/.agents/skills/{vgai-ingest-existing-game → volter-ingest-existing-game}/SKILL.md +3 -3
- package/template/.agents/skills/{vgai-music → volter-music}/SKILL.md +7 -7
- package/template/{.github/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/{.claude/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/{.github/skills/vgai-3d-models → .claude/skills/volter-3d-models}/SKILL.md +3 -3
- package/template/{.github/skills/vgai-ingest-existing-game → .claude/skills/volter-ingest-existing-game}/SKILL.md +3 -3
- package/template/.claude/skills/{vgai-threejs-authoring → volter-threejs-authoring}/SKILL.md +9 -9
- package/template/.claude/skills/volter-threejs-authoring/agents/openai.yaml +4 -0
- package/template/{.agents/skills/vgai-threejs-authoring → .claude/skills/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/{.claude/skills/vgai-3d-models → .github/skills/volter-3d-models}/SKILL.md +3 -3
- package/template/{.claude/skills/vgai-ingest-existing-game → .github/skills/volter-ingest-existing-game}/SKILL.md +3 -3
- 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/.github/skills/{vgai-threejs-authoring → volter-threejs-authoring}/references/helper-catalog.md +1 -1
- package/template/.mcp.json +3 -3
- package/template/AGENTS.md +25 -25
- package/template/DEVLOG.md +1 -1
- package/template/IDIOMS.md +3 -3
- package/template/LICENSE +3 -3
- package/template/README.md +12 -13
- package/template/check-idioms.ts +71 -95
- package/template/manifest-entry-modules-plugin.ts +17 -4
- package/template/package.json +13 -15
- package/template/server/colyseus-setup.ts +1 -9
- package/template/server/main.ts +4 -9
- package/template/server/rooms/arena-room.ts +10 -10
- package/template/server/rooms/game-room.ts +10 -10
- package/template/server/rooms.ts +3 -5
- 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 +1 -1
- 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 +19 -38
- package/template/src/manifest-entry-modules.d.ts +12 -1
- package/template/src/net/NetworkedPlayers.tsx +3 -3
- 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 +12 -12
- 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-xFb5Wv7A.js +0 -1
- package/dist/assets/CanvasSceneViewport-vqBlOz8P.js +0 -1
- package/dist/assets/ColorInput-CX1UZjYO.js +0 -1
- package/dist/assets/ImageViewer-shZzMd91.js +0 -1
- package/dist/assets/InspectorObjectPreview-BMOvJaOw.js +0 -1
- package/dist/assets/JsonAssetDocument-D_HXneWE.js +0 -2
- package/dist/assets/Object3DDocumentToolbar-BfPH9jz5.js +0 -1
- package/dist/assets/Object3DDocumentViewport-BaXWtATg.js +0 -2
- package/dist/assets/OnlineAssetDetail-BxibUH6K.js +0 -1
- package/dist/assets/PlayBar-DRANyO01.js +0 -1
- package/dist/assets/ReactCanvasControls-K98jOX9b.js +0 -1
- package/dist/assets/RootSelectionOverlay-BQC12Gdd.js +0 -1
- package/dist/assets/ShadowEditor-DP1LWynl.js +0 -1
- package/dist/assets/StageHost-V_0opXFt.js +0 -2
- package/dist/assets/ThreeBoardDocument-tgcaZDqQ.js +0 -2
- package/dist/assets/Toolbar-uLgsrB2z.js +0 -1
- package/dist/assets/VideoViewer-ClUJ6_uy.js +0 -1
- package/dist/assets/ViewportShadingMenu-Bdkc6jcd.js +0 -1
- package/dist/assets/active-ingest-CnAeQcuQ.js +0 -3
- package/dist/assets/animation-mixers.service-DiecMX_A.js +0 -1
- package/dist/assets/animation-timeline.utility-C71vPJgs.js +0 -1
- package/dist/assets/asset-editor-persistence-BQgjOCrm.js +0 -1
- package/dist/assets/asset-loaders-5PIUVvmH.js +0 -2
- package/dist/assets/audio.utility-D9Vk_WYS.js +0 -1
- package/dist/assets/autoplay.service-CFJoLPLw.js +0 -1
- package/dist/assets/binding-resolver-C_9MBSMa.js +0 -2
- package/dist/assets/blender-emscripten-engine-BeWFjMn-.js +0 -2
- package/dist/assets/blender-version.status-DtfwUahB.js +0 -1
- package/dist/assets/blender-wali-engine-da698rDf.js +0 -2
- package/dist/assets/blender.status-ujwGU6dU.js +0 -1
- package/dist/assets/board-guides-_3R1t_-2.js +0 -1
- package/dist/assets/body-marks-RKb_LTwL.js +0 -1
- package/dist/assets/build-profiles.document-CZxDuhzz.js +0 -2
- package/dist/assets/build-progress.status-Dk5u3C67.js +0 -1
- package/dist/assets/build.header--xqH6uTP.js +0 -1
- package/dist/assets/canvas-entry-runtime-DVeh71nC.js +0 -2
- package/dist/assets/capability-coverage-DQgg6UJe.js +0 -7
- package/dist/assets/component-board.service-DgujG90T.js +0 -2
- package/dist/assets/component-contracts.service-Bc_2Xxh_.js +0 -1
- package/dist/assets/component-instance-root-df4ofoOR.js +0 -1
- package/dist/assets/connection.status-CCX-mgmr.js +0 -1
- package/dist/assets/constraints.inspector-CwEEREsf.js +0 -1
- package/dist/assets/coverage.service-CV7b5Sqn.js +0 -3
- package/dist/assets/curve-BKuiAPpj.js +0 -1
- package/dist/assets/data-check-core-CQEjuFyt.js +0 -1
- package/dist/assets/data-ref-DyFQqqX6.js +0 -1
- package/dist/assets/debug-bridge-CESAxmlz.js +0 -1
- package/dist/assets/debug-registry-l7k5Hjc8.js +0 -1
- package/dist/assets/design-time-layers-CQgnmqc8.js +0 -1
- package/dist/assets/design-time-react-mount-CFvIk_rV.js +0 -1
- package/dist/assets/edit-mode-authoring-DBjaBTxM.js +0 -1
- package/dist/assets/editor-api-D2azVray.js +0 -1
- package/dist/assets/editor-presentation-activity-C7SNSmTd.js +0 -1
- package/dist/assets/game-audio-CaGKzia4.js +0 -1
- package/dist/assets/game-document.service-FdG_gFPU.js +0 -1
- package/dist/assets/game-eval.command-4wa9vqWE.js +0 -2
- package/dist/assets/game-module-access-DulnT3NH.js +0 -1
- package/dist/assets/game-network-Bo_nlDR5.js +0 -22
- package/dist/assets/gameplay-replay-CnWnlogY.js +0 -1
- package/dist/assets/generation-DhwCUHPf.css +0 -1
- package/dist/assets/generation.service-D2yeZaJu.js +0 -1
- package/dist/assets/generations.status-3CrPw_n5.js +0 -1
- package/dist/assets/hierarchy-marks-BLPfSIym.js +0 -1
- package/dist/assets/hierarchy-marks-C25dY2fR.js +0 -1
- package/dist/assets/hosted-asset-materialization-DYdcFlDf.js +0 -2
- package/dist/assets/index-B5WjeCHm.css +0 -1
- package/dist/assets/index-BcH5GC3b.js +0 -1
- package/dist/assets/index-CwCDkEl1.js +0 -1
- package/dist/assets/index-n3QdTv-T.js +0 -1
- package/dist/assets/index.module-Ycad3DJq.js +0 -1
- package/dist/assets/ingest-siblings-CkxW__go.js +0 -1
- package/dist/assets/ingest-source-persistence-6peGfPAS.js +0 -1
- package/dist/assets/ingest.service-Cc73WMIW.js +0 -1
- package/dist/assets/inspection-CObLhnrs.js +0 -1
- package/dist/assets/instances.command-CxKGnrNl.js +0 -1
- package/dist/assets/material-BwFzKPi0.js +0 -1
- package/dist/assets/model-asset-sections-CFvvihfx.css +0 -1
- package/dist/assets/model-asset-sections.service-TZ2SaBmH.js +0 -1
- package/dist/assets/module-mode-B79jV5tQ.js +0 -2
- package/dist/assets/mount-canvas-ingest-root-BhaYNuhY.js +0 -2
- package/dist/assets/mount-dom-ingest-root-BQb1u0LX.js +0 -2
- package/dist/assets/mount-readiness-Ds0HvvLH.js +0 -4
- package/dist/assets/mount-three-ingest-root-DIDBfvIH.js +0 -1
- package/dist/assets/network-observer.service-CiR4Q9Q0.js +0 -1
- package/dist/assets/network.utility-CNG3eJ0E.js +0 -1
- package/dist/assets/object-marks-DwvIEBOK.js +0 -1
- package/dist/assets/pixi-authoring-adapter-B42K4md-.js +0 -1
- package/dist/assets/pixi-live-write-target-D56tQEe_.js +0 -1
- package/dist/assets/pose-guard-DILO6gGq.js +0 -1
- package/dist/assets/presentation-DGBuGP6i.js +0 -1
- package/dist/assets/profiler.utility-DLNySW3w.js +0 -1
- package/dist/assets/project-provenance-4ldz-EOG.js +0 -1
- package/dist/assets/r3f-design-session-C0DPEChS.js +0 -2
- package/dist/assets/react-canvas-navigation-Jowa_lJq.js +0 -1
- package/dist/assets/react-inspector.service-TfTdj_Qk.js +0 -1
- package/dist/assets/react-story-board-Bx7qYytV.js +0 -1
- package/dist/assets/react-world-authoring-adapter-C1jPW_cN.js +0 -1
- package/dist/assets/reflection-probe-capture.inspector-C-6zrzZb.js +0 -1
- package/dist/assets/registry-Z28XSZHF.js +0 -1
- package/dist/assets/resolve-three-C7zDbK29.js +0 -702
- package/dist/assets/root-seam-contract-rGNbiX6q.js +0 -1
- package/dist/assets/scene-capture-BTWgUzhI.js +0 -1
- package/dist/assets/scene-document.service-DJJp-la1.js +0 -2
- package/dist/assets/seeded-random-38To73fI.js +0 -1
- package/dist/assets/stage-overlay-set-olkNSZmq.js +0 -1
- package/dist/assets/stage-presence-markers-cznMN_qq.js +0 -1
- package/dist/assets/stage-transform-tools-BDUZqRIR.js +0 -1
- package/dist/assets/standard-viewport-dressing-BZyuxyVl.js +0 -24
- package/dist/assets/state-watch.utility-DDmn3G25.js +0 -1
- package/dist/assets/story-documents-8ehMyYHo.js +0 -3
- package/dist/assets/story-three-preview-B1nNiPwP.js +0 -2
- package/dist/assets/studio-environment-yaKaHPxH.js +0 -2
- package/dist/assets/team-playtest.service-Ds9tkO4q.js +0 -1
- package/dist/assets/three-authoring-adapter-BrkGH4cd.js +0 -1
- package/dist/assets/three-authoring.service-DoamZDMx.js +0 -2
- package/dist/assets/three-integration.service-Db-VabIm.js +0 -1
- package/dist/assets/three-projection-core-jBJVt6O0.js +0 -1
- package/dist/assets/three-viewport-presentation-CgO3eWJ-.js +0 -141
- package/dist/assets/tools-B_NJsk05.js +0 -1
- package/dist/assets/transform-mode-request-BnKpgRUW.js +0 -1
- package/dist/assets/transport-strip-a9yLoPsI.js +0 -1
- package/dist/assets/transport.header-CpfoppXc.js +0 -1
- package/dist/assets/tuples-CKsHOV9T.js +0 -1
- package/dist/assets/ui-board-document-DtTR_mBr.js +0 -2
- package/dist/assets/user-data-dHvLdpwM.js +0 -1
- package/dist/assets/viewport-door-DVkMQazS.js +0 -1
- package/dist/assets/worker-CC9Ug5Ei.js +0 -2
- package/dist/assets/workspace-arrangement-DIMM7ska.js +0 -1
- package/dist/assets/world-documents-C4t3iOD-.js +0 -1
- package/dist/assets/world-root-stage-binding-ydl3JN1a.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/template/server/loopback.ts +0 -76
- /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/editor-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/game-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/game-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,11 +468,11 @@ 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
|
|
475
|
-
* capture engine renders it — see `packages/editor/src/asset-preview.ts`'s
|
|
475
|
+
* capture engine renders it — see `packages/editor-threejs/src/kit/asset-preview.ts`'s
|
|
476
476
|
* `captureShotSetAssetPreview`. Throws (via `command`'s `{ok:false}`
|
|
477
477
|
* unwrap) with a clear message naming the missing joint(s) when the asset
|
|
478
478
|
* lacks a bone the definition requires.
|
|
@@ -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
|
|
@@ -829,14 +829,14 @@ var init_client = __esm({
|
|
|
829
829
|
* {@link captureActiveDocument} photographs. NOT play-mode gated, and NOT
|
|
830
830
|
* page automation: a target outside the active document's container is
|
|
831
831
|
* refused by name. Design and scope contract:
|
|
832
|
-
* `packages/editor/src/editor-document-probe.ts`.
|
|
832
|
+
* `packages/editor-sdk/src/kit/editor-document-probe.ts`.
|
|
833
833
|
*/
|
|
834
834
|
async documentProbe(step) {
|
|
835
835
|
return this.command({ type: "document-probe", step });
|
|
836
836
|
}
|
|
837
837
|
/**
|
|
838
838
|
* Run a wire-carried step against the ACTIVE document's published context
|
|
839
|
-
* (`packages/editor/src/document-context-registry.ts`) — the REPL door over
|
|
839
|
+
* (`packages/editor-sdk/src/kit/document-context-registry.ts`) — the REPL door over
|
|
840
840
|
* an open document, in Edit mode. `src` is the step's own `toString()`;
|
|
841
841
|
* same serialization contract as `page-script` (no closures survive).
|
|
842
842
|
*/
|
|
@@ -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.70",
|
|
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.70",
|
|
2363
|
+
"@volter/editor-game": "0.5.70",
|
|
2364
|
+
"@volter/editor-react": "0.5.70",
|
|
2365
|
+
"@volter/editor-threejs": "0.5.70",
|
|
2366
|
+
"@volter/editor-xstate": "0.5.70",
|
|
2367
|
+
"@volter/editor-blender": "0.1.13",
|
|
2368
|
+
"@volter/dawproject": "0.5.70",
|
|
2369
|
+
"@volter/editor-dawproject": "0.5.70",
|
|
2370
|
+
"@volter/blender-engine": "0.1.11",
|
|
2371
|
+
"@volter/editor-project": "0.5.70",
|
|
2372
|
+
"@volter/editor-sdk": "0.5.70",
|
|
2373
|
+
"@volter/editor-live": "0.5.70",
|
|
2374
|
+
"@volter/game-live": "0.5.70",
|
|
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.70",
|
|
2377
|
+
"@volter/threejs-runtime": "0.5.70",
|
|
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) => {
|
|
@@ -5626,6 +5631,16 @@ function writeNetworkedInput(targetDir) {
|
|
|
5626
5631
|
}
|
|
5627
5632
|
writeFileSync3(inputPath, input, "utf-8");
|
|
5628
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
|
+
}
|
|
5629
5644
|
function rewriteTemplateVariantFiles(targetDir, composition, additions, starterDir) {
|
|
5630
5645
|
if (!additions.has("three") || !additions.has("studio")) {
|
|
5631
5646
|
for (const relative7 of STUDIO_OWNED_PATHS) {
|
|
@@ -5655,9 +5670,9 @@ function rewriteTemplateVariantFiles(targetDir, composition, additions, starterD
|
|
|
5655
5670
|
for (const relative7 of THREE_OWNED_PATHS) {
|
|
5656
5671
|
rmSync2(join4(targetDir, relative7), { recursive: true, force: true });
|
|
5657
5672
|
}
|
|
5658
|
-
writeFileSync3(join4(targetDir, "
|
|
5673
|
+
writeFileSync3(join4(targetDir, "volter.adapter.ts"), adapterSourceFor(additions), "utf-8");
|
|
5659
5674
|
} else {
|
|
5660
|
-
const adapterPath = join4(targetDir, "
|
|
5675
|
+
const adapterPath = join4(targetDir, "volter.adapter.ts");
|
|
5661
5676
|
const source = joinAdditionFinders(readFileSync3(adapterPath, "utf-8"), additions);
|
|
5662
5677
|
writeFileSync3(adapterPath, source, "utf-8");
|
|
5663
5678
|
}
|
|
@@ -5714,7 +5729,7 @@ function rewriteTsconfig(targetDir, engineRelPath, editorRelPath) {
|
|
|
5714
5729
|
])
|
|
5715
5730
|
),
|
|
5716
5731
|
// `@volter/editor-blender`'s two VALUE exports — the look and the layout a models
|
|
5717
|
-
// project's `
|
|
5732
|
+
// project's `volter.adapter.ts` imports. Spelled entry by entry rather than
|
|
5718
5733
|
// as a wildcard because the package's `exports` names them individually;
|
|
5719
5734
|
// both entries are inert for a project that never declares the package.
|
|
5720
5735
|
"@volter/editor-blender/looks": ["node_modules/@volter/editor-blender/src/looks.ts"],
|
|
@@ -5754,7 +5769,7 @@ function ensureReactDedupe(content) {
|
|
|
5754
5769
|
if (!/resolve:\s*{/.test(content)) return content;
|
|
5755
5770
|
return content.replace(
|
|
5756
5771
|
/resolve:\s*{/,
|
|
5757
|
-
"resolve: {\n // react/react-dom dedupe (GH #123): see packages/editor/template/vite.config.ts's\n // matching comment for the dual-React-instance root cause this avoids.\n dedupe: ['react', 'react-dom'],"
|
|
5772
|
+
"resolve: {\n // react/react-dom dedupe (GH #123): see packages/game-editor/template/vite.config.ts's\n // matching comment for the dual-React-instance root cause this avoids.\n dedupe: ['react', 'react-dom'],"
|
|
5758
5773
|
);
|
|
5759
5774
|
}
|
|
5760
5775
|
function rewriteIndexHtml(targetDir, name) {
|
|
@@ -5812,7 +5827,8 @@ function scaffoldProject(opts) {
|
|
|
5812
5827
|
additions,
|
|
5813
5828
|
resolveScaffoldStarterDir(productDir)
|
|
5814
5829
|
);
|
|
5815
|
-
|
|
5830
|
+
if (additions.has("canvas")) applyCanvasAddition(targetDir, productDir);
|
|
5831
|
+
const adapterPath = join4(targetDir, "volter.adapter.ts");
|
|
5816
5832
|
writeFileSync3(
|
|
5817
5833
|
adapterPath,
|
|
5818
5834
|
withEditorDeclaration(readFileSync3(adapterPath, "utf-8"), composition.editor),
|
|
@@ -5961,7 +5977,7 @@ function initGitRepo(targetDir, projectName) {
|
|
|
5961
5977
|
notice: "Skipped git init \u2014 the project is already inside a git work tree."
|
|
5962
5978
|
};
|
|
5963
5979
|
}
|
|
5964
|
-
const authorFallback = hasCommitterIdentity(targetDir) ? [] : ["-c", "user.name=
|
|
5980
|
+
const authorFallback = hasCommitterIdentity(targetDir) ? [] : ["-c", "user.name=volter", "-c", "user.email=scaffold@volter"];
|
|
5965
5981
|
const steps = [
|
|
5966
5982
|
{ label: "git init", args: ["init", "--quiet"] },
|
|
5967
5983
|
{ label: "git add", args: ["add", "-A"] },
|
|
@@ -6000,13 +6016,15 @@ var presets = {
|
|
|
6000
6016
|
// silent console the agent contract requires; they are an author's TODO
|
|
6001
6017
|
// from the moment the author ASKS for those panels (`--with studio`, or
|
|
6002
6018
|
// `--template full`).
|
|
6003
|
-
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"] },
|
|
6004
6022
|
/** A 3D world and its models: the smallest thing that plays. */
|
|
6005
6023
|
prototype: { additions: ["three", "blender"] },
|
|
6006
6024
|
// EVERY addition in one project — the composition acceptance made
|
|
6007
6025
|
// permanent. Check it against `SCAFFOLD_ADDITIONS` (./scaffold/additions.ts)
|
|
6008
6026
|
// when the scaffolder grows one.
|
|
6009
|
-
full: { additions: ["three", "ui", "server", "blender", "studio"] },
|
|
6027
|
+
full: { additions: ["three", "canvas", "ui", "server", "blender", "studio"] },
|
|
6010
6028
|
/** The design skew: a React root and no 3D world. */
|
|
6011
6029
|
website: { additions: ["ui"] },
|
|
6012
6030
|
/** Nothing but the project — the shape an author adds to. */
|
|
@@ -6017,15 +6035,16 @@ var presets = {
|
|
|
6017
6035
|
examples: true,
|
|
6018
6036
|
compose(additions) {
|
|
6019
6037
|
const three = additions.has("three");
|
|
6038
|
+
const world = three || additions.has("canvas");
|
|
6020
6039
|
const studio = additions.has("studio");
|
|
6021
6040
|
const layouts = "@volter/editor-sdk/layouts";
|
|
6022
|
-
const design = additions.has("ui") && !
|
|
6041
|
+
const design = additions.has("ui") && !world;
|
|
6023
6042
|
return {
|
|
6024
|
-
// THE PRODUCT THIS PROJECT OPENS IN, and the
|
|
6025
|
-
// `@volter/editor-game` is the
|
|
6026
|
-
//
|
|
6027
|
-
// a running game to run.
|
|
6028
|
-
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"] : []],
|
|
6029
6048
|
editor: {
|
|
6030
6049
|
layout: { name: design ? "DesignLayout" : studio ? "StudioLayout" : "GameLayout", from: layouts },
|
|
6031
6050
|
inspector: studio ? "column" : "card"
|
|
@@ -6163,7 +6182,7 @@ function resolveWorktreeIdentity(projectRoot) {
|
|
|
6163
6182
|
};
|
|
6164
6183
|
}
|
|
6165
6184
|
|
|
6166
|
-
// ../editor-core/dist/server/chunk-
|
|
6185
|
+
// ../editor-core/dist/server/chunk-4QZTWRIK.js
|
|
6167
6186
|
import {
|
|
6168
6187
|
mkdirSync as mkdirSync5,
|
|
6169
6188
|
readdirSync as readdirSync4,
|
|
@@ -6175,7 +6194,7 @@ import {
|
|
|
6175
6194
|
import { homedir as homedir2 } from "node:os";
|
|
6176
6195
|
import { join as join7, resolve as resolve6 } from "node:path";
|
|
6177
6196
|
import { setTimeout as delay } from "node:timers/promises";
|
|
6178
|
-
var EDITOR_SESSIONS_REGISTRY_FILE = join7(homedir2(), ".
|
|
6197
|
+
var EDITOR_SESSIONS_REGISTRY_FILE = join7(homedir2(), ".volter", "editor-sessions.json");
|
|
6179
6198
|
function isEditorSessionEntry(v) {
|
|
6180
6199
|
if (typeof v !== "object" || v === null) return false;
|
|
6181
6200
|
const s = v;
|
|
@@ -6213,7 +6232,7 @@ function readLiveRegisteredSessions() {
|
|
|
6213
6232
|
}
|
|
6214
6233
|
}
|
|
6215
6234
|
function announceEditorLaunch(project) {
|
|
6216
|
-
const directory = join7(project, ".
|
|
6235
|
+
const directory = join7(project, ".volter", "editor-launches");
|
|
6217
6236
|
mkdirSync5(directory, { recursive: true });
|
|
6218
6237
|
const file = join7(directory, `${process.pid}.json`);
|
|
6219
6238
|
writeFileSync5(file, JSON.stringify({ pid: process.pid }));
|
|
@@ -6228,7 +6247,7 @@ function announceEditorLaunch(project) {
|
|
|
6228
6247
|
return clear;
|
|
6229
6248
|
}
|
|
6230
6249
|
function hasPendingEditorLaunch(project) {
|
|
6231
|
-
const directory = join7(project, ".
|
|
6250
|
+
const directory = join7(project, ".volter", "editor-launches");
|
|
6232
6251
|
try {
|
|
6233
6252
|
return readdirSync4(directory).some((name) => {
|
|
6234
6253
|
if (!/^\d+\.json$/.test(name)) return false;
|
|
@@ -6275,7 +6294,7 @@ function canonicalizeProjectPath(p) {
|
|
|
6275
6294
|
}
|
|
6276
6295
|
}
|
|
6277
6296
|
|
|
6278
|
-
// ../editor-core/dist/server/chunk-
|
|
6297
|
+
// ../editor-core/dist/server/chunk-RCSH7YYG.js
|
|
6279
6298
|
import { createServer } from "node:net";
|
|
6280
6299
|
import { execFileSync as execFileSync3 } from "node:child_process";
|
|
6281
6300
|
async function loopbackPortFree(port) {
|
|
@@ -6626,12 +6645,12 @@ import { createHash as createHash22 } from "node:crypto";
|
|
|
6626
6645
|
import { mkdirSync as mkdirSync22, readFileSync as readFileSync32, renameSync as renameSync2, rmdirSync, statSync as statSync3, writeFileSync as writeFileSync22 } from "node:fs";
|
|
6627
6646
|
import { homedir as homedir22 } from "node:os";
|
|
6628
6647
|
import { dirname as dirname22, join as join32 } from "node:path";
|
|
6629
|
-
var PRODUCT_DECLARATION_KEY = "
|
|
6648
|
+
var PRODUCT_DECLARATION_KEY = "volter.product";
|
|
6630
6649
|
var PRODUCT_INSTALL_LINES = [
|
|
6631
6650
|
" npm install --save-dev @volter/model-editor",
|
|
6632
6651
|
" npm install --save-dev @volter/game-editor"
|
|
6633
6652
|
];
|
|
6634
|
-
var PRODUCT_CREATE_LINES = [" npx @volter/editor create <name>"];
|
|
6653
|
+
var PRODUCT_CREATE_LINES = [" npx @volter/editor-core create <name>"];
|
|
6635
6654
|
var PRODUCT_COLOR_THEMES = ["dark", "light"];
|
|
6636
6655
|
function readProductManifest(packageDir) {
|
|
6637
6656
|
const manifestPath = join8(packageDir, "package.json");
|
|
@@ -6641,7 +6660,7 @@ function readProductManifest(packageDir) {
|
|
|
6641
6660
|
} catch {
|
|
6642
6661
|
return null;
|
|
6643
6662
|
}
|
|
6644
|
-
const declared = manifest.
|
|
6663
|
+
const declared = manifest.volter?.product;
|
|
6645
6664
|
if (declared === void 0) return null;
|
|
6646
6665
|
const entry = declared.entry;
|
|
6647
6666
|
if (typeof entry !== "string" || !entry.startsWith("./"))
|
|
@@ -6686,7 +6705,7 @@ function readProductManifest(packageDir) {
|
|
|
6686
6705
|
}
|
|
6687
6706
|
var SHA256_HEX = /^[0-9a-f]{64}$/;
|
|
6688
6707
|
function readProductWorkbench(manifestPath, declared) {
|
|
6689
|
-
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.';
|
|
6690
6709
|
if (typeof declared !== "object" || declared === null || Array.isArray(declared))
|
|
6691
6710
|
throw new Error(
|
|
6692
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:
|
|
@@ -6716,7 +6735,7 @@ ${example}`
|
|
|
6716
6735
|
function workbenchProductId(packageName) {
|
|
6717
6736
|
return packageName.split("/").pop() ?? packageName;
|
|
6718
6737
|
}
|
|
6719
|
-
function
|
|
6738
|
+
function declaredVolterPackages(projectRoot) {
|
|
6720
6739
|
let manifest;
|
|
6721
6740
|
try {
|
|
6722
6741
|
manifest = JSON.parse(
|
|
@@ -6752,7 +6771,7 @@ function locatePackage(projectRoot, name) {
|
|
|
6752
6771
|
}
|
|
6753
6772
|
function declaredProducts(projectRoot) {
|
|
6754
6773
|
const found = [];
|
|
6755
|
-
for (const name of
|
|
6774
|
+
for (const name of declaredVolterPackages(projectRoot)) {
|
|
6756
6775
|
const dir = locatePackage(projectRoot, name);
|
|
6757
6776
|
if (dir === null) continue;
|
|
6758
6777
|
const product = readProductManifest(dir);
|
|
@@ -6780,10 +6799,10 @@ are not building with:
|
|
|
6780
6799
|
` + products.map((product) => ` npm uninstall ${product.name}`).join("\n")
|
|
6781
6800
|
);
|
|
6782
6801
|
}
|
|
6783
|
-
var WORKBENCH_LOCATOR_PATH = ".
|
|
6802
|
+
var WORKBENCH_LOCATOR_PATH = ".volter/workbench.json";
|
|
6784
6803
|
var RELEASE_RECORD = "BUILD.json";
|
|
6785
6804
|
var SOURCES_LAUNCHER = join22("scripts", "code-server.sh");
|
|
6786
|
-
var OVERLAY_RECORD = ".
|
|
6805
|
+
var OVERLAY_RECORD = ".volter-overlay.json";
|
|
6787
6806
|
function workbenchDeclarationExample(projectRoot) {
|
|
6788
6807
|
return `${join22(projectRoot, WORKBENCH_LOCATOR_PATH)}:
|
|
6789
6808
|
{ "workbench": "<path to an extracted Code-OSS release, or to a fork checkout>" }`;
|
|
@@ -6824,7 +6843,7 @@ ${workbenchDeclarationExample(projectRoot)}`
|
|
|
6824
6843
|
return isAbsolute3(declared) ? resolve7(declared) : resolve7(projectRoot, declared);
|
|
6825
6844
|
}
|
|
6826
6845
|
function writeWorkbenchDeclaration(projectRoot, workbenchDir) {
|
|
6827
|
-
mkdirSync6(join22(projectRoot, ".
|
|
6846
|
+
mkdirSync6(join22(projectRoot, ".volter"), { recursive: true });
|
|
6828
6847
|
writeFileSync6(
|
|
6829
6848
|
join22(projectRoot, WORKBENCH_LOCATOR_PATH),
|
|
6830
6849
|
`${JSON.stringify({ workbench: resolve7(workbenchDir) }, null, 2)}
|
|
@@ -6849,7 +6868,7 @@ function resolveWorkbench(dir, expectedProduct) {
|
|
|
6849
6868
|
if (expectedProduct !== void 0 && resolved.product !== expectedProduct) {
|
|
6850
6869
|
throw new Error(
|
|
6851
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:
|
|
6852
|
-
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:
|
|
6853
6872
|
node scripts/workbench/build-release.mjs --product ${expectedProduct} --platform ${machinePlatform()} --checkout <fork dir>`}`
|
|
6854
6873
|
);
|
|
6855
6874
|
}
|
|
@@ -6907,7 +6926,7 @@ function resolveSources(dir) {
|
|
|
6907
6926
|
const marker = join22(dir, OVERLAY_RECORD);
|
|
6908
6927
|
if (!existsSync22(marker)) {
|
|
6909
6928
|
throw new Error(
|
|
6910
|
-
`${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:
|
|
6911
6930
|
node scripts/workbench/dev.mjs --checkout ${dir} --product <model-editor|game-editor>`
|
|
6912
6931
|
);
|
|
6913
6932
|
}
|
|
@@ -6932,7 +6951,7 @@ function resolveSources(dir) {
|
|
|
6932
6951
|
};
|
|
6933
6952
|
}
|
|
6934
6953
|
var RELEASE_REPO = "volter-ai/code-oss";
|
|
6935
|
-
var WORKBENCH_CACHE_ROOT = join22(homedir3(), ".
|
|
6954
|
+
var WORKBENCH_CACHE_ROOT = join22(homedir3(), ".volter", "workbenches");
|
|
6936
6955
|
async function resolveWorkbenchForProject(options) {
|
|
6937
6956
|
const { projectRoot, product, override, io } = options;
|
|
6938
6957
|
const productId = workbenchProductId(product.name);
|
|
@@ -6982,7 +7001,7 @@ function apiHeaders(token) {
|
|
|
6982
7001
|
return {
|
|
6983
7002
|
Accept: "application/vnd.github+json",
|
|
6984
7003
|
"X-GitHub-Api-Version": "2022-11-28",
|
|
6985
|
-
"User-Agent": "
|
|
7004
|
+
"User-Agent": "volter-workbench-locator",
|
|
6986
7005
|
...token === null ? {} : { Authorization: `Bearer ${token}` }
|
|
6987
7006
|
};
|
|
6988
7007
|
}
|
|
@@ -7116,7 +7135,7 @@ var MIN_PORT = 1024;
|
|
|
7116
7135
|
var MAX_PORT = 65535;
|
|
7117
7136
|
var WORKTREE_EDITOR_PORT_MIN = 20200;
|
|
7118
7137
|
var WORKTREE_EDITOR_PORT_MAX = 29999;
|
|
7119
|
-
var DEFAULT_PORT_REGISTRY = join32(homedir22(), ".
|
|
7138
|
+
var DEFAULT_PORT_REGISTRY = join32(homedir22(), ".volter", "worktree-ports.json");
|
|
7120
7139
|
var LOCK_STALE_MS = 1e4;
|
|
7121
7140
|
var lockWait = new Int32Array(new SharedArrayBuffer(4));
|
|
7122
7141
|
function assertPort(value, source) {
|
|
@@ -7229,7 +7248,7 @@ function allocateWorktreeEditorPort(projectRoot, registryFile = DEFAULT_PORT_REG
|
|
|
7229
7248
|
}
|
|
7230
7249
|
function readEditorPortEnv(value) {
|
|
7231
7250
|
if (value === void 0 || value.trim() === "") return void 0;
|
|
7232
|
-
return assertPort(Number(value), "
|
|
7251
|
+
return assertPort(Number(value), "VOLTER_EDITOR_PORT");
|
|
7233
7252
|
}
|
|
7234
7253
|
function resolveEditorPortRequest(projectRoot, portOverride, envValue, registryFile) {
|
|
7235
7254
|
if (portOverride !== void 0) {
|
|
@@ -7318,7 +7337,7 @@ async function launch(folder, launching, options = {}) {
|
|
|
7318
7337
|
const project = realpathSync3(resolve22(folder));
|
|
7319
7338
|
const product = resolveProductForProject(project);
|
|
7320
7339
|
if (product.name !== launching.packageName) throw new Error(`${project} declares ${product.name}, not ${launching.displayName}.`);
|
|
7321
|
-
const port = resolveEditorPortPreference(project, options.port, process.env["
|
|
7340
|
+
const port = resolveEditorPortPreference(project, options.port, process.env["VOLTER_EDITOR_PORT"]);
|
|
7322
7341
|
await waitForPendingEditorLaunch(project);
|
|
7323
7342
|
const sessions = await verifiedSessions(port);
|
|
7324
7343
|
const verdict = classifyProjectSession(sessions, project);
|
|
@@ -7355,14 +7374,14 @@ async function launch(folder, launching, options = {}) {
|
|
|
7355
7374
|
stdio: ["ignore", log, log],
|
|
7356
7375
|
env: {
|
|
7357
7376
|
...process.env,
|
|
7358
|
-
|
|
7359
|
-
|
|
7360
|
-
|
|
7361
|
-
|
|
7362
|
-
|
|
7363
|
-
|
|
7364
|
-
|
|
7365
|
-
...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" } : {}
|
|
7366
7385
|
}
|
|
7367
7386
|
});
|
|
7368
7387
|
} catch (error) {
|
|
@@ -7405,7 +7424,7 @@ async function prepareSession(folder, launching) {
|
|
|
7405
7424
|
const child = spawn2(process.execPath, [entry], {
|
|
7406
7425
|
cwd: project,
|
|
7407
7426
|
stdio: ["ignore", "inherit", "inherit"],
|
|
7408
|
-
env: { ...process.env,
|
|
7427
|
+
env: { ...process.env, VOLTER_PROJECT: project, VOLTER_PRODUCT_DIR: product.dir, VOLTER_NO_OPEN: "1", VOLTER_PREPARE: "1" }
|
|
7409
7428
|
});
|
|
7410
7429
|
child.once("error", fail2);
|
|
7411
7430
|
child.once("exit", done);
|
|
@@ -7422,10 +7441,29 @@ async function ensureTab(serverUrl, noOpen) {
|
|
|
7422
7441
|
openAttemptAt,
|
|
7423
7442
|
onProgress: (ms) => console.log(`Waiting for the editor page (${Math.round(ms / 1e3)}s)\u2026`)
|
|
7424
7443
|
});
|
|
7425
|
-
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
|
+
}
|
|
7426
7464
|
}
|
|
7427
7465
|
|
|
7428
|
-
// ../editor-core/dist/server/chunk-
|
|
7466
|
+
// ../editor-core/dist/server/chunk-UUZ3H4AP.js
|
|
7429
7467
|
import { Agent, fetch as nodeFetch } from "undici";
|
|
7430
7468
|
function createDispatcher(timeoutMs) {
|
|
7431
7469
|
return new Agent({ headersTimeout: timeoutMs, bodyTimeout: timeoutMs });
|
|
@@ -7452,7 +7490,7 @@ var EditorCommandError = class extends Error {
|
|
|
7452
7490
|
* the receipt window closing unanswered, a beating-but-dead tab, and no tab
|
|
7453
7491
|
* present at all. The last four can fail in milliseconds.
|
|
7454
7492
|
*
|
|
7455
|
-
* A caller that converges by retrying (`
|
|
7493
|
+
* A caller that converges by retrying (the editor's `restart` command) needs the distinction
|
|
7456
7494
|
* because a refusal the editor ANSWERED may go differently next time, while
|
|
7457
7495
|
* a command the relay abandoned tells you nothing new on a second identical
|
|
7458
7496
|
* attempt — and when the abandonment was a 120s budget, re-running it three
|
|
@@ -7630,22 +7668,22 @@ var EditorClient = class {
|
|
|
7630
7668
|
return data;
|
|
7631
7669
|
}
|
|
7632
7670
|
// --- Play control ---
|
|
7633
|
-
/** `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
|
|
7634
7672
|
* explicit config leg, relayed as `cmd['seed']`; `handleCommand`'s
|
|
7635
7673
|
* `'play'` case threads it into `enterPlayMode`'s highest-precedence seed
|
|
7636
|
-
* argument (beats manifest.determinism.defaultSeed/?
|
|
7674
|
+
* argument (beats manifest.determinism.defaultSeed/?volter-seed=). Omitted,
|
|
7637
7675
|
* boot seeding falls back to that precedence unchanged.
|
|
7638
7676
|
*
|
|
7639
|
-
* `opts.name` (`
|
|
7677
|
+
* `opts.name` (the editor's `play --name <text>` command) — an OPTIONAL label for this run,
|
|
7640
7678
|
* relayed as `cmd['name']` and slugified server-side into the run's
|
|
7641
7679
|
* `logs/play-*.jsonl` filename and its session-journal line. Findability
|
|
7642
7680
|
* only: no registry, no uniqueness, no lookup verb — grep and `ls` are the
|
|
7643
7681
|
* query engine. Omitted, the filename keeps its exact unnamed shape. */
|
|
7644
|
-
/* `opts.record` (`
|
|
7682
|
+
/* `opts.record` (the editor's `play --record <name>` command) — NAMES this run's recording
|
|
7645
7683
|
* file. It does not ENABLE recording: every relayed play records, with no
|
|
7646
|
-
* flag (see `@
|
|
7684
|
+
* flag (see `@volter/editor-game`'s `src/play/play-recording.ts`). Omitted, the clip is named for
|
|
7647
7685
|
* the durable Gameplay Session; named, it becomes an explicit keepsake in
|
|
7648
|
-
* `.
|
|
7686
|
+
* `.volter/recordings/<name>.webm`. */
|
|
7649
7687
|
async play(opts) {
|
|
7650
7688
|
return this.command({
|
|
7651
7689
|
type: "play",
|
|
@@ -7746,9 +7784,9 @@ var EditorClient = class {
|
|
|
7746
7784
|
return { base64: data.base64, mimeType: data.mimeType };
|
|
7747
7785
|
}
|
|
7748
7786
|
/**
|
|
7749
|
-
* Unit 4 (live-front-door wave) — capture the RUNNING GAME (
|
|
7750
|
-
* screenshot`'s wire leg). Sends the SAME `bridge-screenshot` relay op
|
|
7751
|
-
* `@
|
|
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/game-live`'s `RelayTransport.screenshot` (and therefore
|
|
7752
7790
|
* `game.screenshot()` on the relay path) already sends, so all three
|
|
7753
7791
|
* surfaces composite the identical full game stack — canvas(es) plus the
|
|
7754
7792
|
* HUD/react DOM layers — rather than any of them inventing a second,
|
|
@@ -7766,8 +7804,8 @@ var EditorClient = class {
|
|
|
7766
7804
|
* refuses it with `BRIDGE_SCREENSHOT_STALE` rather than pass it off as
|
|
7767
7805
|
* current. Setting this asks the relay to render exactly ONE deterministic
|
|
7768
7806
|
* tick (`runTicks(1, {render:'last'})`) first — the same escape
|
|
7769
|
-
* `@
|
|
7770
|
-
* `
|
|
7807
|
+
* `@volter/game-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.
|
|
7771
7809
|
* Off by default: a caller who does not ask must never be handed a frame
|
|
7772
7810
|
* that only exists because the capture drove the game.
|
|
7773
7811
|
*/
|
|
@@ -7852,8 +7890,8 @@ var EditorClient = class {
|
|
|
7852
7890
|
...source,
|
|
7853
7891
|
...options
|
|
7854
7892
|
},
|
|
7855
|
-
// Photographing changes nothing, and this is the relay `
|
|
7856
|
-
// <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
|
|
7857
7895
|
// transport failure cost a cold agent three probe modules.
|
|
7858
7896
|
{ retryTransport: true }
|
|
7859
7897
|
);
|
|
@@ -7867,11 +7905,11 @@ var EditorClient = class {
|
|
|
7867
7905
|
};
|
|
7868
7906
|
}
|
|
7869
7907
|
/**
|
|
7870
|
-
* A project-defined labeled shot set (`
|
|
7908
|
+
* A project-defined labeled shot set (the editor's `screenshot <target> --shots <set>` command):
|
|
7871
7909
|
* the DEFINITION travels with the command (project data — see
|
|
7872
7910
|
* `AssetPreviewShotSetDefinition`; the CLI resolves it from the registered
|
|
7873
7911
|
* `project.<set>.previewShots` tool), and the editor's generic
|
|
7874
|
-
* capture engine renders it — see `packages/editor/src/asset-preview.ts`'s
|
|
7912
|
+
* capture engine renders it — see `packages/editor-threejs/src/kit/asset-preview.ts`'s
|
|
7875
7913
|
* `captureShotSetAssetPreview`. Throws (via `command`'s `{ok:false}`
|
|
7876
7914
|
* unwrap) with a clear message naming the missing joint(s) when the asset
|
|
7877
7915
|
* lacks a bone the definition requires.
|
|
@@ -7896,8 +7934,8 @@ var EditorClient = class {
|
|
|
7896
7934
|
};
|
|
7897
7935
|
}
|
|
7898
7936
|
/**
|
|
7899
|
-
* B8.4 — score the asset against a reference GLB (`
|
|
7900
|
-
* <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
|
|
7901
7939
|
* (equal-height bounding-box framing, both yaw-normalized to face the
|
|
7902
7940
|
* camera), per-view IoU numbers, and overlay evidence images. The
|
|
7903
7941
|
* reference GLB's raw bytes travel base64 in the command; the editor
|
|
@@ -7914,7 +7952,7 @@ var EditorClient = class {
|
|
|
7914
7952
|
return { width: data.width, height: data.height, views: data.views };
|
|
7915
7953
|
}
|
|
7916
7954
|
/**
|
|
7917
|
-
* The STORY lane (`
|
|
7955
|
+
* The STORY lane (the editor's `screenshot <file>.stories.tsx` command): every CSF export of
|
|
7918
7956
|
* one project story file rendered in the live session's DOM and captured
|
|
7919
7957
|
* through the same composite leg {@link captureGame} uses, returned as
|
|
7920
7958
|
* per-export images plus one variant sheet. `options.story` narrows to a
|
|
@@ -8046,9 +8084,9 @@ var EditorClient = class {
|
|
|
8046
8084
|
* Run ONE command by id — the door to everything the command palette lists.
|
|
8047
8085
|
*
|
|
8048
8086
|
* Under the Code-OSS frame this is the workbench's own `ICommandService`, so
|
|
8049
|
-
* any command id works: a view's `
|
|
8050
|
-
* `
|
|
8051
|
-
* 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
|
|
8052
8090
|
* the views registry, refusing anything else BY NAME.
|
|
8053
8091
|
*
|
|
8054
8092
|
* The result is whatever the command answered — a view verb's state, or
|
|
@@ -8228,14 +8266,14 @@ var EditorClient = class {
|
|
|
8228
8266
|
* {@link captureActiveDocument} photographs. NOT play-mode gated, and NOT
|
|
8229
8267
|
* page automation: a target outside the active document's container is
|
|
8230
8268
|
* refused by name. Design and scope contract:
|
|
8231
|
-
* `packages/editor/src/editor-document-probe.ts`.
|
|
8269
|
+
* `packages/editor-sdk/src/kit/editor-document-probe.ts`.
|
|
8232
8270
|
*/
|
|
8233
8271
|
async documentProbe(step) {
|
|
8234
8272
|
return this.command({ type: "document-probe", step });
|
|
8235
8273
|
}
|
|
8236
8274
|
/**
|
|
8237
8275
|
* Run a wire-carried step against the ACTIVE document's published context
|
|
8238
|
-
* (`packages/editor/src/document-context-registry.ts`) — the REPL door over
|
|
8276
|
+
* (`packages/editor-sdk/src/kit/document-context-registry.ts`) — the REPL door over
|
|
8239
8277
|
* an open document, in Edit mode. `src` is the step's own `toString()`;
|
|
8240
8278
|
* same serialization contract as `page-script` (no closures survive).
|
|
8241
8279
|
*/
|
|
@@ -8244,7 +8282,7 @@ var EditorClient = class {
|
|
|
8244
8282
|
* `blender-object-info`, `blender-screenshot-view`, `blender-read-file`,
|
|
8245
8283
|
* `blender-write-file`, `blender-list-files`, `blender-start`,
|
|
8246
8284
|
* `blender-status`): Blender runs in the editor tab's worker, and
|
|
8247
|
-
* `
|
|
8285
|
+
* `volter blender-mcp` is transport onto these. `blender-status` is the only
|
|
8248
8286
|
* one that creates nothing — it answers whether this tab already has a
|
|
8249
8287
|
* session, which is how a caller survives an editor restart.
|
|
8250
8288
|
*/
|
|
@@ -8318,7 +8356,7 @@ var EditorClient = class {
|
|
|
8318
8356
|
return data.projects;
|
|
8319
8357
|
}
|
|
8320
8358
|
// --- Registered project tools ---
|
|
8321
|
-
/** List tools explicitly registered in `package.json#
|
|
8359
|
+
/** List tools explicitly registered in `package.json#volter.tools`.
|
|
8322
8360
|
* The editor server loads callable metadata in Node; modules never enter the
|
|
8323
8361
|
* editor browser merely because they were listed. */
|
|
8324
8362
|
async listProjectTools() {
|
|
@@ -8591,11 +8629,11 @@ var RELAY_COMMANDS = {
|
|
|
8591
8629
|
"close-asset-tab": alwaysRefresh(),
|
|
8592
8630
|
"toggle-command-palette": noDerivedRefresh(),
|
|
8593
8631
|
"toggle-console": noDerivedRefresh(),
|
|
8594
|
-
// RELOAD THE EDITOR PAGE — `@
|
|
8632
|
+
// RELOAD THE EDITOR PAGE — `@volter/game-live`'s `page.reload()`, the one page verb
|
|
8595
8633
|
// no step can express. It is the HOST's, not a package's: reloading the tab
|
|
8596
|
-
// 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/editor-game` command
|
|
8597
8635
|
// contribution, so a project without that package — every model project —
|
|
8598
|
-
// answered `unknown command type "page-reload"` for a door `@
|
|
8636
|
+
// answered `unknown command type "page-reload"` for a door `@volter/game-live`
|
|
8599
8637
|
// documents as general (measured on a `model-editor create` scaffold,
|
|
8600
8638
|
// 2026-09-21). The handler schedules the navigation for the next task so
|
|
8601
8639
|
// this ack can travel before the channel is torn down; the client waits for
|
|
@@ -8629,7 +8667,7 @@ var RELAY_COMMANDS = {
|
|
|
8629
8667
|
"set-inspection-field": alwaysRefresh(3e4),
|
|
8630
8668
|
"remove-inspection-field": alwaysRefresh(3e4),
|
|
8631
8669
|
// `extract-component` and `fork-component` left this table with their menus
|
|
8632
|
-
// (`@
|
|
8670
|
+
// (`@volter/editor-game/contributions/component-verbs.command.ts`), which carries
|
|
8633
8671
|
// both budgets forward row for row.
|
|
8634
8672
|
// The hierarchy context menu's structure verbs, over the control door. Every
|
|
8635
8673
|
// one of them rewrites the game's own source, so they refresh like a write.
|
|
@@ -8645,7 +8683,7 @@ var RELAY_COMMANDS = {
|
|
|
8645
8683
|
// `open` WAITS FOR THE PROJECT ADAPTER, for the same reason `play` waits on
|
|
8646
8684
|
// the project's async `setup()`: on a cold session the adapter's scene table
|
|
8647
8685
|
// is not there yet, and the door's whole job is to put a document on screen
|
|
8648
|
-
// once it is. MEASURED on three cold `
|
|
8686
|
+
// once it is. MEASURED on three cold the editor's `edit` command sessions over a
|
|
8649
8687
|
// `--template models` probe — 6025 / 6831 / 6474 ms from tab-connected to
|
|
8650
8688
|
// the entry being listed, every one of them first refusing with
|
|
8651
8689
|
// `SCENE_TABLE_UNAVAILABLE`. At the 5 s default the relay's timer won that
|
|
@@ -8668,7 +8706,7 @@ var RELAY_COMMANDS = {
|
|
|
8668
8706
|
// Object3D document's orbit/turntable/frame, the viewport photograph and the
|
|
8669
8707
|
// display and transform toggles — are its own command contribution
|
|
8670
8708
|
// (`viewport-commands.ts`), each budget on its contributed row.
|
|
8671
|
-
// The BLENDER lane's ten verbs are `@
|
|
8709
|
+
// The BLENDER lane's ten verbs are `@volter/editor-blender`'s
|
|
8672
8710
|
// `contributions/blender.command.ts` (WORK.md §The workbench, item D) —
|
|
8673
8711
|
// each row's budget travelled with it, onto the contributed spec the page
|
|
8674
8712
|
// reports to the server. `capture-story-variants` made the same move, to the
|
|
@@ -9085,7 +9123,7 @@ async function openProject(path) {
|
|
|
9085
9123
|
}
|
|
9086
9124
|
async function restart(command, options = {}) {
|
|
9087
9125
|
const { client, url, projectRoot } = await sessionClient();
|
|
9088
|
-
const noOpen = Boolean(process.env["
|
|
9126
|
+
const noOpen = Boolean(process.env["VOLTER_NO_OPEN"]);
|
|
9089
9127
|
const before = await client.getState().catch(() => null);
|
|
9090
9128
|
const divergence = staleAssetCacheWarning(before);
|
|
9091
9129
|
const attached = before?.connected === true || (before?.editorsConnected ?? 0) > 0;
|
|
@@ -9212,7 +9250,7 @@ function parseLookFlags(options) {
|
|
|
9212
9250
|
function screenshotPath(projectRoot, slug) {
|
|
9213
9251
|
const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
|
|
9214
9252
|
const safe = (slug ?? "").toLowerCase().replace(/[^a-z0-9-_]+/g, "-").replace(/^-+|-+$/g, "");
|
|
9215
|
-
return join23(projectRoot, ".
|
|
9253
|
+
return join23(projectRoot, ".volter", "screenshots", slug === void 0 ? `${stamp}.png` : `${safe === "" ? "look" : safe}-${stamp}`);
|
|
9216
9254
|
}
|
|
9217
9255
|
async function screenshot(target, options) {
|
|
9218
9256
|
const flags = parseLookFlags(options);
|
|
@@ -9346,7 +9384,7 @@ async function assetLabLook(client, source, flags, outputDirectory, defaultStage
|
|
|
9346
9384
|
}
|
|
9347
9385
|
async function moduleLook(client, projectRoot, modulePath, flags) {
|
|
9348
9386
|
if (flags.shots !== void 0 || flags.compare !== void 0) {
|
|
9349
|
-
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/.");
|
|
9350
9388
|
}
|
|
9351
9389
|
if (flags.width !== void 0 && flags.height !== void 0 && flags.width !== flags.height) {
|
|
9352
9390
|
throw new Error("a module look renders square views \u2014 use --size, not --width/--height");
|
|
@@ -9359,7 +9397,7 @@ async function moduleLook(client, projectRoot, modulePath, flags) {
|
|
|
9359
9397
|
...size === void 0 ? {} : { size }
|
|
9360
9398
|
});
|
|
9361
9399
|
if (!outcome.ok) {
|
|
9362
|
-
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).` : "";
|
|
9363
9401
|
throw new Error(`${toolName} refused '${modulePath}' \u2014 ${outcome.error?.message ?? "unknown error"}.${missing}`);
|
|
9364
9402
|
}
|
|
9365
9403
|
const result = outcome.data;
|
|
@@ -9426,7 +9464,7 @@ function runCapabilityCommand(verb, ids, options) {
|
|
|
9426
9464
|
}
|
|
9427
9465
|
return;
|
|
9428
9466
|
}
|
|
9429
|
-
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.");
|
|
9430
9468
|
if (verb === "outdated") {
|
|
9431
9469
|
if (ids.length > 0) throw new Error("Usage: volter-game-editor outdated [--project <path>] [--json]");
|
|
9432
9470
|
const rows = capabilityVersions(projectDir, catalogDir);
|
|
@@ -9506,7 +9544,7 @@ ${report.writtenFiles.map((path) => ` ${path}`).join("\n")}`);
|
|
|
9506
9544
|
}
|
|
9507
9545
|
for (const unplaced of report.unplacedFinders) {
|
|
9508
9546
|
const include = unplaced.finder.include ? `, include: [${unplaced.finder.include.map((glob) => `'${glob}'`).join(", ")}]` : "";
|
|
9509
|
-
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.`);
|
|
9510
9548
|
}
|
|
9511
9549
|
for (const unplaced of report.unplacedRegions) {
|
|
9512
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.`);
|
|
@@ -9529,12 +9567,12 @@ import {
|
|
|
9529
9567
|
} from "node:fs";
|
|
9530
9568
|
import { homedir as homedir4 } from "node:os";
|
|
9531
9569
|
import { isAbsolute as isAbsolute5, join as join11, resolve as resolve10 } from "node:path";
|
|
9532
|
-
var WORKBENCH_LOCATOR_PATH2 = ".
|
|
9570
|
+
var WORKBENCH_LOCATOR_PATH2 = ".volter/workbench.json";
|
|
9533
9571
|
var RELEASE_RECORD2 = "BUILD.json";
|
|
9534
9572
|
var SOURCES_LAUNCHER2 = join11("scripts", "code-server.sh");
|
|
9535
|
-
var OVERLAY_RECORD2 = ".
|
|
9573
|
+
var OVERLAY_RECORD2 = ".volter-overlay.json";
|
|
9536
9574
|
function writeWorkbenchDeclaration2(projectRoot, workbenchDir) {
|
|
9537
|
-
mkdirSync8(join11(projectRoot, ".
|
|
9575
|
+
mkdirSync8(join11(projectRoot, ".volter"), { recursive: true });
|
|
9538
9576
|
writeFileSync8(
|
|
9539
9577
|
join11(projectRoot, WORKBENCH_LOCATOR_PATH2),
|
|
9540
9578
|
`${JSON.stringify({ workbench: resolve10(workbenchDir) }, null, 2)}
|
|
@@ -9555,7 +9593,7 @@ function resolveWorkbench2(dir, expectedProduct) {
|
|
|
9555
9593
|
if (expectedProduct !== void 0 && resolved.product !== expectedProduct) {
|
|
9556
9594
|
throw new Error(
|
|
9557
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:
|
|
9558
|
-
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:
|
|
9559
9597
|
node scripts/workbench/build-release.mjs --product ${expectedProduct} --platform ${machinePlatform2()} --checkout <fork dir>`}`
|
|
9560
9598
|
);
|
|
9561
9599
|
}
|
|
@@ -9613,7 +9651,7 @@ function resolveSources2(dir) {
|
|
|
9613
9651
|
const marker = join11(dir, OVERLAY_RECORD2);
|
|
9614
9652
|
if (!existsSync9(marker)) {
|
|
9615
9653
|
throw new Error(
|
|
9616
|
-
`${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:
|
|
9617
9655
|
node scripts/workbench/dev.mjs --checkout ${dir} --product <model-editor|game-editor>`
|
|
9618
9656
|
);
|
|
9619
9657
|
}
|
|
@@ -9637,10 +9675,10 @@ function resolveSources2(dir) {
|
|
|
9637
9675
|
cwd: dir
|
|
9638
9676
|
};
|
|
9639
9677
|
}
|
|
9640
|
-
var WORKBENCH_CACHE_ROOT2 = join11(homedir4(), ".
|
|
9678
|
+
var WORKBENCH_CACHE_ROOT2 = join11(homedir4(), ".volter", "workbenches");
|
|
9641
9679
|
|
|
9642
9680
|
// node/cli.ts
|
|
9643
|
-
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] };
|
|
9644
9682
|
async function playVerb(verb) {
|
|
9645
9683
|
const { connect: connect2 } = await import("@volter/editor-live");
|
|
9646
9684
|
const { EditorClient: EditorClient3 } = await Promise.resolve().then(() => (init_client(), client_exports));
|