@volter/editor-core 0.5.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (719) hide show
  1. package/BUNDLED_NOTICES +1527 -0
  2. package/LICENSE +686 -0
  3. package/LICENSE-APACHE +202 -0
  4. package/NOTICE +18 -0
  5. package/README.md +24 -0
  6. package/dist/build/chunk-JS4D4XZ3.js +175 -0
  7. package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
  8. package/dist/build/vite-plugin-product-contributions.js +100 -0
  9. package/dist/build/vite-plugin-product-contributions.js.map +7 -0
  10. package/dist/build/vite-plugin-shared-react.js +25 -0
  11. package/dist/build/vite-plugin-shared-react.js.map +7 -0
  12. package/dist/build/vite-plugin-shared-three.js +86 -0
  13. package/dist/build/vite-plugin-shared-three.js.map +7 -0
  14. package/dist/server/chunk-KMJC7AGO.js +98 -0
  15. package/dist/server/chunk-KMJC7AGO.js.map +7 -0
  16. package/dist/server/chunk-PSILUMGS.js +46 -0
  17. package/dist/server/chunk-PSILUMGS.js.map +7 -0
  18. package/dist/server/frame-proxy.js +255 -0
  19. package/dist/server/frame-proxy.js.map +7 -0
  20. package/dist/server/open-browser.js +53 -0
  21. package/dist/server/open-browser.js.map +7 -0
  22. package/dist/server/process-shutdown.js +127 -0
  23. package/dist/server/process-shutdown.js.map +7 -0
  24. package/dist/server/session-registry.js +141 -0
  25. package/dist/server/session-registry.js.map +7 -0
  26. package/dist/server/spawn-opener.js +11 -0
  27. package/dist/server/spawn-opener.js.map +7 -0
  28. package/dist/server/worktree-identity.js +11 -0
  29. package/dist/server/worktree-identity.js.map +7 -0
  30. package/dist-server/packaged.mjs +88816 -0
  31. package/package.json +118 -0
  32. package/scripts/build-plugins.mjs +14 -0
  33. package/scripts/build-server.mjs +26 -0
  34. package/scripts/build-session.mjs +9 -0
  35. package/server/account-credentials.ts +60 -0
  36. package/server/account-service.ts +1434 -0
  37. package/server/adapter-region-includes.ts +47 -0
  38. package/server/asset-catalog-v2.ts +175 -0
  39. package/server/asset-history-snapshots.ts +196 -0
  40. package/server/asset-ledger-store.ts +195 -0
  41. package/server/asset-library-routes.ts +1595 -0
  42. package/server/blender-wasm-artifact.ts +430 -0
  43. package/server/boot-timings.ts +106 -0
  44. package/server/canonical-path.ts +50 -0
  45. package/server/checkout-workspace-preflight.ts +349 -0
  46. package/server/cloud-asset-catalog.ts +158 -0
  47. package/server/coding-inference-launch.ts +237 -0
  48. package/server/collaboration-account-client.ts +202 -0
  49. package/server/collaboration-attribution.ts +122 -0
  50. package/server/collaboration-session.ts +934 -0
  51. package/server/comfyui-bridge.ts +248 -0
  52. package/server/console-ledger.ts +499 -0
  53. package/server/creation-site-transform.ts +304 -0
  54. package/server/creation-site-write.ts +648 -0
  55. package/server/data-file-serialize.ts +158 -0
  56. package/server/editor-brand-html.ts +72 -0
  57. package/server/editor-control-socket.ts +366 -0
  58. package/server/editor-server-options.ts +190 -0
  59. package/server/editor-server.ts +1483 -0
  60. package/server/editor-sse.ts +352 -0
  61. package/server/engine-provenance.ts +169 -0
  62. package/server/engine-source-restart.ts +117 -0
  63. package/server/frame-bridge.ts +115 -0
  64. package/server/frame-proxy.ts +490 -0
  65. package/server/frame-workbench.ts +259 -0
  66. package/server/frontend-handoff.ts +229 -0
  67. package/server/game-globals-shadow.ts +113 -0
  68. package/server/gameplay-session-retention.ts +149 -0
  69. package/server/gameplay-sessions.ts +123 -0
  70. package/server/generation-jobs.ts +201 -0
  71. package/server/generation-reconciler.ts +137 -0
  72. package/server/generative-execution-context.ts +59 -0
  73. package/server/git-workflow.ts +612 -0
  74. package/server/harness-chat-caller.ts +36 -0
  75. package/server/harness-chat-service.ts +1681 -0
  76. package/server/idle-shutdown.ts +170 -0
  77. package/server/js-profiling-policy.ts +52 -0
  78. package/server/launcher-settings.ts +84 -0
  79. package/server/local-asset-catalog.ts +410 -0
  80. package/server/managed-account-defaults.ts +22 -0
  81. package/server/mock-control-plane.ts +540 -0
  82. package/server/model-import-conversion.ts +345 -0
  83. package/server/native-credential-store.ts +162 -0
  84. package/server/open-browser.ts +118 -0
  85. package/server/packaged.ts +1192 -0
  86. package/server/play-stall.ts +126 -0
  87. package/server/process-shutdown.ts +218 -0
  88. package/server/product-presets.ts +55 -0
  89. package/server/project-build-artifact.ts +95 -0
  90. package/server/project-components.ts +100 -0
  91. package/server/project-dependency-invalidation.ts +114 -0
  92. package/server/project-file-scan.ts +235 -0
  93. package/server/project-hmr-files.ts +215 -0
  94. package/server/project-install-roots.ts +210 -0
  95. package/server/project-kinds.ts +71 -0
  96. package/server/project-mcp-servers.ts +82 -0
  97. package/server/project-module-freshness.ts +109 -0
  98. package/server/project-module-instance.ts +375 -0
  99. package/server/project-optimize-deps-entries.ts +827 -0
  100. package/server/project-output-writer.ts +679 -0
  101. package/server/project-package-origin.ts +63 -0
  102. package/server/project-root-surface.ts +831 -0
  103. package/server/project-scratch-path.ts +47 -0
  104. package/server/project-script-hmr.ts +619 -0
  105. package/server/project-serving-plugins.ts +236 -0
  106. package/server/project-tools.ts +653 -0
  107. package/server/project-validation.ts +250 -0
  108. package/server/project-verbs.ts +127 -0
  109. package/server/project-view.ts +52 -0
  110. package/server/project-watch.ts +1134 -0
  111. package/server/project-work-coordinator.ts +288 -0
  112. package/server/provider-credentials.ts +331 -0
  113. package/server/recent-projects-store.ts +98 -0
  114. package/server/redact-secrets.ts +71 -0
  115. package/server/repository-presence.ts +267 -0
  116. package/server/routes/account.ts +357 -0
  117. package/server/routes/agents.ts +60 -0
  118. package/server/routes/assets.ts +154 -0
  119. package/server/routes/build.ts +13 -0
  120. package/server/routes/collaboration.ts +595 -0
  121. package/server/routes/configurations.ts +419 -0
  122. package/server/routes/context.ts +264 -0
  123. package/server/routes/control-plane.ts +1811 -0
  124. package/server/routes/logs.ts +272 -0
  125. package/server/routes/project-identity.ts +302 -0
  126. package/server/routes/project-open.ts +429 -0
  127. package/server/routes/project-source.ts +686 -0
  128. package/server/routes/project-state.ts +383 -0
  129. package/server/routes/relay.ts +1029 -0
  130. package/server/routes/route-helpers.ts +29 -0
  131. package/server/routes/served-modules.ts +138 -0
  132. package/server/routes/session-tabs.ts +196 -0
  133. package/server/routes/settings.ts +121 -0
  134. package/server/routes/share-control.ts +486 -0
  135. package/server/routes/themes.ts +116 -0
  136. package/server/routes/tools.ts +230 -0
  137. package/server/routes/worktrees.ts +595 -0
  138. package/server/scoped-game-css.ts +461 -0
  139. package/server/server-utils.ts +1194 -0
  140. package/server/session-product.ts +112 -0
  141. package/server/session-registry.ts +230 -0
  142. package/server/share-claims.ts +138 -0
  143. package/server/share-host.ts +526 -0
  144. package/server/share-session-gateway.ts +1362 -0
  145. package/server/share-tunnel.ts +123 -0
  146. package/server/spawn-opener.ts +74 -0
  147. package/server/support/play/log-format.ts +76 -0
  148. package/server/support/play/session-record.ts +199 -0
  149. package/server/support/project/build-discipline.ts +718 -0
  150. package/server/support/project/inspection-node.ts +119 -0
  151. package/server/support/project/log-naming.ts +54 -0
  152. package/server/support/project/provenance.ts +290 -0
  153. package/server/support/project/run-name.ts +18 -0
  154. package/server/support/project/session-journal.ts +830 -0
  155. package/server/support/project/shared.ts +327 -0
  156. package/server/tab-bootstrap.ts +62 -0
  157. package/server/tab-heartbeat.ts +477 -0
  158. package/server/tab-lifecycle.ts +550 -0
  159. package/server/tab-presence.ts +1508 -0
  160. package/server/team-agent-mirror.ts +95 -0
  161. package/server/twin-auth.ts +138 -0
  162. package/server/vendored-lock-recorder.ts +968 -0
  163. package/server/worktree-identity.ts +121 -0
  164. package/server/worktree-management.ts +398 -0
  165. package/server/worktree-retention.d.mts +13 -0
  166. package/server/worktree-retention.mjs +205 -0
  167. package/src/EditorContext.tsx +169 -0
  168. package/src/account.ts +333 -0
  169. package/src/action-registry.ts +532 -0
  170. package/src/active-product.ts +74 -0
  171. package/src/active-project.ts +155 -0
  172. package/src/adapter-editor-config.ts +25 -0
  173. package/src/adapter-observation.ts +49 -0
  174. package/src/animation/stage-transport.ts +379 -0
  175. package/src/animation/three-clips-subject.ts +172 -0
  176. package/src/api/asset-library-wire.ts +45 -0
  177. package/src/api/assets.ts +365 -0
  178. package/src/api/base.ts +10 -0
  179. package/src/api/build.ts +99 -0
  180. package/src/api/git-wire.ts +56 -0
  181. package/src/api/logs.ts +92 -0
  182. package/src/api/project-identity.ts +74 -0
  183. package/src/api/project-open.ts +355 -0
  184. package/src/api/project-source.ts +162 -0
  185. package/src/api/project-state.ts +107 -0
  186. package/src/api/relay.ts +268 -0
  187. package/src/api/settings.ts +36 -0
  188. package/src/api/themes.ts +45 -0
  189. package/src/api/worktrees.ts +257 -0
  190. package/src/asset-compare-core.ts +171 -0
  191. package/src/asset-compare.ts +294 -0
  192. package/src/asset-editor-context.tsx +100 -0
  193. package/src/asset-events.ts +97 -0
  194. package/src/asset-inspector-actions.ts +87 -0
  195. package/src/asset-preview-framing.ts +357 -0
  196. package/src/asset-preview.ts +2802 -0
  197. package/src/asset-selection-viewer-registry.ts +113 -0
  198. package/src/asset-selection.ts +133 -0
  199. package/src/asset-workflow/asset-capabilities.ts +344 -0
  200. package/src/asset-workflow/asset-import-jobs.ts +106 -0
  201. package/src/asset-workflow/asset-ledger-backend.ts +126 -0
  202. package/src/asset-workflow/asset-ledger.ts +156 -0
  203. package/src/asset-workflow/asset-materialization-report.ts +140 -0
  204. package/src/asset-workflow/asset-pack-manifest.ts +320 -0
  205. package/src/asset-workflow/asset-types.ts +142 -0
  206. package/src/asset-workflow/asset-workflow-quality.ts +61 -0
  207. package/src/asset-workflow/audio-preview-player.ts +193 -0
  208. package/src/asset-workflow/audio-waveform.ts +22 -0
  209. package/src/asset-workflow/cloud-asset-client.ts +263 -0
  210. package/src/asset-workflow/folder-preview.ts +345 -0
  211. package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
  212. package/src/asset-workflow/image-view-scale.ts +32 -0
  213. package/src/asset-workflow/import-contract.ts +124 -0
  214. package/src/asset-workflow/ledger-write-lock.ts +244 -0
  215. package/src/asset-workflow/model-inspection.ts +818 -0
  216. package/src/asset-workflow/pixi-spritesheet.ts +197 -0
  217. package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
  218. package/src/asset-workflow/project-asset-commands.ts +23 -0
  219. package/src/asset-workflow/project-asset-health.ts +139 -0
  220. package/src/asset-workflow/project-asset-operations.ts +154 -0
  221. package/src/asset-workflow/project-asset-roots.ts +68 -0
  222. package/src/asset-workflow/project-content.ts +288 -0
  223. package/src/asset-workflow/project-source-index.ts +550 -0
  224. package/src/asset-workflow/thumbnail-system.ts +256 -0
  225. package/src/authoring/active-adapter.ts +199 -0
  226. package/src/authoring/active-systems.ts +422 -0
  227. package/src/authoring/adapter-key.ts +18 -0
  228. package/src/authoring/authoring-asset-url.ts +27 -0
  229. package/src/authoring/bootstrap-state.ts +49 -0
  230. package/src/authoring/boundary-authoring-adapter.ts +184 -0
  231. package/src/authoring/breakpoint-state.ts +43 -0
  232. package/src/authoring/canvas-scene-guides.ts +76 -0
  233. package/src/authoring/component-instance-root.ts +171 -0
  234. package/src/authoring/composite-authoring-adapter.ts +2110 -0
  235. package/src/authoring/consumer-actions.ts +520 -0
  236. package/src/authoring/css-numeric-style.ts +97 -0
  237. package/src/authoring/design-time-layers.ts +849 -0
  238. package/src/authoring/design-time-mount-registry.ts +235 -0
  239. package/src/authoring/design-time-settle.ts +343 -0
  240. package/src/authoring/edit-mode-authoring.ts +619 -0
  241. package/src/authoring/eyedropper-session.ts +60 -0
  242. package/src/authoring/instance-source-menu-register.ts +13 -0
  243. package/src/authoring/instance-source-menu.ts +135 -0
  244. package/src/authoring/layered-pick.ts +183 -0
  245. package/src/authoring/live-gesture-lock.ts +50 -0
  246. package/src/authoring/live-object-transform.ts +62 -0
  247. package/src/authoring/mount-failure-report.ts +154 -0
  248. package/src/authoring/mounted-root-subjects.ts +144 -0
  249. package/src/authoring/no-authoring-adapter.ts +55 -0
  250. package/src/authoring/null-inspection-subjects.tsx +75 -0
  251. package/src/authoring/object3d-document-persistence.ts +106 -0
  252. package/src/authoring/object3d-document-session-registry.ts +120 -0
  253. package/src/authoring/object3d-document-session.ts +1326 -0
  254. package/src/authoring/object3d-gesture-controller.ts +113 -0
  255. package/src/authoring/panel-authoring.ts +121 -0
  256. package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
  257. package/src/authoring/prefab-instance-section-model.ts +55 -0
  258. package/src/authoring/project-authoring-session.ts +105 -0
  259. package/src/authoring/provenance.ts +99 -0
  260. package/src/authoring/quarks-particle-systems.ts +19 -0
  261. package/src/authoring/react-canvas-navigation.ts +255 -0
  262. package/src/authoring/react-design-canvas-style.ts +20 -0
  263. package/src/authoring/react-story-board.ts +937 -0
  264. package/src/authoring/selection-scope.ts +195 -0
  265. package/src/authoring/shell-document-ops.ts +169 -0
  266. package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
  267. package/src/authoring/shell-viewport-policy.ts +48 -0
  268. package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
  269. package/src/authoring/stories-scope.ts +35 -0
  270. package/src/authoring/story-board-chrome-fit.ts +107 -0
  271. package/src/authoring/story-board-presentation.ts +111 -0
  272. package/src/authoring/three-projection-core.ts +226 -0
  273. package/src/authoring/viewport-pick-context.ts +40 -0
  274. package/src/authoring/viewport-raycast.ts +240 -0
  275. package/src/authoring/viewport-tool-context.ts +73 -0
  276. package/src/authoring/world-canvas-viewport-state.ts +35 -0
  277. package/src/authoring/world-hidden-viewport.ts +152 -0
  278. package/src/authoring/world-pan-state.ts +198 -0
  279. package/src/authoring/world-session-state.ts +101 -0
  280. package/src/authoring/write-pipe.ts +173 -0
  281. package/src/availability-tick.ts +66 -0
  282. package/src/bitmap-label.ts +120 -0
  283. package/src/blender-tab-metrics.ts +161 -0
  284. package/src/board-open-actions.ts +20 -0
  285. package/src/boot-routing.ts +391 -0
  286. package/src/build-identity.ts +15 -0
  287. package/src/bytes-codec.ts +62 -0
  288. package/src/camera-authoring.ts +175 -0
  289. package/src/cancellation-reason.ts +58 -0
  290. package/src/canvas-preview-frames.ts +482 -0
  291. package/src/capture-camera-pose.ts +77 -0
  292. package/src/chrome-registry.ts +159 -0
  293. package/src/chrome-slot-registry.ts +91 -0
  294. package/src/collaboration-client.ts +264 -0
  295. package/src/collaboration-presence.ts +41 -0
  296. package/src/command-dispatch.ts +19 -0
  297. package/src/command-listener.ts +2743 -0
  298. package/src/command-registry.ts +70 -0
  299. package/src/component-board-registry.ts +205 -0
  300. package/src/component-states-registry.ts +200 -0
  301. package/src/components/AgentPresentationNotice.tsx +75 -0
  302. package/src/components/AlignToolbar.tsx +204 -0
  303. package/src/components/AppRoot.tsx +394 -0
  304. package/src/components/ApplicationMenus.tsx +415 -0
  305. package/src/components/AssetBrowser.tsx +2843 -0
  306. package/src/components/AssetEditorShell.tsx +216 -0
  307. package/src/components/AssetInspectorToolSection.tsx +124 -0
  308. package/src/components/BoardRulers.tsx +354 -0
  309. package/src/components/CameraInfo.tsx +81 -0
  310. package/src/components/CanvasSceneViewport.tsx +556 -0
  311. package/src/components/CapabilityCoverageSection.tsx +185 -0
  312. package/src/components/CenterDocuments.tsx +22 -0
  313. package/src/components/ChromeSlot.tsx +20 -0
  314. package/src/components/CodeView.tsx +470 -0
  315. package/src/components/CollaborationHeaderControl.css +74 -0
  316. package/src/components/CompactInspectorCard.tsx +190 -0
  317. package/src/components/CompactInspectorShell.tsx +39 -0
  318. package/src/components/ConsolePanel.css +55 -0
  319. package/src/components/ConsolePanel.tsx +270 -0
  320. package/src/components/DefaultEditorLayout.tsx +106 -0
  321. package/src/components/DocumentHeaderStrip.tsx +96 -0
  322. package/src/components/DocumentShelfRail.tsx +45 -0
  323. package/src/components/DocumentThumbnail.tsx +345 -0
  324. package/src/components/EditorLeaseGuard.tsx +372 -0
  325. package/src/components/ErrorBanner.tsx +123 -0
  326. package/src/components/FolderPreviewTile.tsx +159 -0
  327. package/src/components/GameHierarchy.tsx +3842 -0
  328. package/src/components/GameplaySessionTimeline.tsx +295 -0
  329. package/src/components/InspectionProjection.tsx +968 -0
  330. package/src/components/Inspector.tsx +233 -0
  331. package/src/components/InspectorCanvasPreview.tsx +35 -0
  332. package/src/components/InspectorFieldsSection.tsx +290 -0
  333. package/src/components/InspectorObjectPreview.tsx +57 -0
  334. package/src/components/InspectorStoriesSection.tsx +92 -0
  335. package/src/components/InspectorToolSection.tsx +96 -0
  336. package/src/components/InspectorTransformSection.tsx +245 -0
  337. package/src/components/LightExplorerPanel.tsx +433 -0
  338. package/src/components/MediaProperties.tsx +145 -0
  339. package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
  340. package/src/components/Object3DDocumentToolbar.css +100 -0
  341. package/src/components/Object3DDocumentToolbar.tsx +454 -0
  342. package/src/components/Object3DDocumentViewport.tsx +58 -0
  343. package/src/components/ProjectHeader.css +617 -0
  344. package/src/components/ProjectHeader.tsx +328 -0
  345. package/src/components/ProjectLayout.tsx +249 -0
  346. package/src/components/ReactCanvasControls.tsx +284 -0
  347. package/src/components/RootSelectionOverlay.tsx +3162 -0
  348. package/src/components/RootTextEditor.tsx +79 -0
  349. package/src/components/SaveStatus.tsx +70 -0
  350. package/src/components/StageHost.tsx +1954 -0
  351. package/src/components/StageOverlays.tsx +21 -0
  352. package/src/components/StartupErrorScreen.tsx +76 -0
  353. package/src/components/StartupLoadingScreen.tsx +65 -0
  354. package/src/components/StatsOverlay.tsx +78 -0
  355. package/src/components/SurfaceStateOverlay.tsx +24 -0
  356. package/src/components/ToolContributionSurfaces.tsx +65 -0
  357. package/src/components/ToolHost.tsx +370 -0
  358. package/src/components/ToolObject3DPreview.tsx +39 -0
  359. package/src/components/Toolbar.tsx +595 -0
  360. package/src/components/TransientHint.tsx +44 -0
  361. package/src/components/TransportStrip.tsx +174 -0
  362. package/src/components/VersionControlSection.tsx +470 -0
  363. package/src/components/VgaiLogo.css +83 -0
  364. package/src/components/VgaiLogo.tsx +35 -0
  365. package/src/components/ViewportControlsHint.tsx +60 -0
  366. package/src/components/ViewportFurniture.tsx +401 -0
  367. package/src/components/ViewportOverlay.tsx +145 -0
  368. package/src/components/ViewportOverlaysMenu.tsx +153 -0
  369. package/src/components/ViewportShadingMenu.tsx +300 -0
  370. package/src/components/ViewportViewMenu.tsx +101 -0
  371. package/src/components/WorkspaceDocumentSurface.tsx +204 -0
  372. package/src/components/WorkspaceUtilitySurface.tsx +22 -0
  373. package/src/components/WorktreeSwitcher.css +239 -0
  374. package/src/components/WorktreeSwitcher.tsx +890 -0
  375. package/src/components/account-documents.tsx +1162 -0
  376. package/src/components/asset-documents.tsx +812 -0
  377. package/src/components/asset-editor-persistence.ts +216 -0
  378. package/src/components/asset-selection-section.tsx +535 -0
  379. package/src/components/asset-thumbnails.tsx +312 -0
  380. package/src/components/asset-viewers/AudioViewer.tsx +201 -0
  381. package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
  382. package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
  383. package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  384. package/src/components/asset-viewers/ImageViewer.tsx +300 -0
  385. package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
  386. package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
  387. package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
  388. package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
  389. package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
  390. package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
  391. package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
  392. package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
  393. package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
  394. package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
  395. package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  396. package/src/components/asset-viewers/VideoViewer.tsx +101 -0
  397. package/src/components/asset-viewers/shader-source.ts +144 -0
  398. package/src/components/asset-workflow.css +731 -0
  399. package/src/components/board-guides.ts +150 -0
  400. package/src/components/compact-inspector.css +539 -0
  401. package/src/components/core-utilities.tsx +90 -0
  402. package/src/components/editor-notifications.css +40 -0
  403. package/src/components/engine-workspace.css +274 -0
  404. package/src/components/inspector-preview-section.tsx +238 -0
  405. package/src/components/inspector-property-grouping.ts +64 -0
  406. package/src/components/inspector-revert-label.ts +20 -0
  407. package/src/components/inspector-selection.ts +42 -0
  408. package/src/components/inspector-stories-gating.ts +171 -0
  409. package/src/components/inspector-transform-subject.ts +11 -0
  410. package/src/components/inspector-transform.ts +75 -0
  411. package/src/components/kind-documents.tsx +500 -0
  412. package/src/components/palette-action-publisher.tsx +140 -0
  413. package/src/components/primitives/DraftColorInput.tsx +74 -0
  414. package/src/components/product-shell.css +1829 -0
  415. package/src/components/project-tool-documents.tsx +410 -0
  416. package/src/components/scene-documents.tsx +223 -0
  417. package/src/components/stage-keyboard.tsx +37 -0
  418. package/src/components/stage-overlay-set.tsx +107 -0
  419. package/src/components/stage-presence-markers.ts +478 -0
  420. package/src/components/standard-viewport-dressing.ts +417 -0
  421. package/src/components/status-contributions.tsx +403 -0
  422. package/src/components/tool-documents.tsx +309 -0
  423. package/src/components/tool-schema-form.tsx +262 -0
  424. package/src/components/use-after-paint.ts +41 -0
  425. package/src/components/use-project-image-assets.ts +86 -0
  426. package/src/components/viewport-header-controls.css +90 -0
  427. package/src/components/viewport-surface-status.tsx +55 -0
  428. package/src/components/workspace-history.ts +32 -0
  429. package/src/components/workspace-static-panel-registry.tsx +152 -0
  430. package/src/components/workspace-surfaces.css +621 -0
  431. package/src/components/world-documents.tsx +586 -0
  432. package/src/components/world-overlay-gestures.ts +1694 -0
  433. package/src/composite-screenshot.ts +1641 -0
  434. package/src/console-sync.ts +131 -0
  435. package/src/constraint-helper.ts +338 -0
  436. package/src/content-entry-source-registry.ts +184 -0
  437. package/src/coverage/authoring-seam-evidence.ts +300 -0
  438. package/src/coverage/canvas-reveal.ts +192 -0
  439. package/src/coverage/design-time-surfaces.ts +101 -0
  440. package/src/coverage/live-seam-evidence.ts +11 -0
  441. package/src/coverage/ontology-invariants.ts +466 -0
  442. package/src/coverage/session-vitals.ts +501 -0
  443. package/src/coverage/system-seam-evidence.ts +72 -0
  444. package/src/crash-null-boundary.ts +36 -0
  445. package/src/creation-site-edit.ts +1479 -0
  446. package/src/creation-site-registry.ts +160 -0
  447. package/src/delegate-harness-registry.ts +143 -0
  448. package/src/document-context-registry.ts +177 -0
  449. package/src/document-open-registry.ts +200 -0
  450. package/src/document-preview-source.ts +20 -0
  451. package/src/document-renderer-session.ts +138 -0
  452. package/src/editor-api.ts +46 -0
  453. package/src/editor-chrome-capture.ts +139 -0
  454. package/src/editor-commands.ts +164 -0
  455. package/src/editor-console.ts +563 -0
  456. package/src/editor-current-view.ts +82 -0
  457. package/src/editor-document-probe.ts +881 -0
  458. package/src/editor-git-client.ts +115 -0
  459. package/src/editor-host-door.ts +462 -0
  460. package/src/editor-hotkeys.ts +842 -0
  461. package/src/editor-lease-view.ts +39 -0
  462. package/src/editor-lease.ts +415 -0
  463. package/src/editor-mode.ts +19 -0
  464. package/src/editor-notifications.ts +140 -0
  465. package/src/editor-presence.ts +563 -0
  466. package/src/editor-presentation-activity.ts +50 -0
  467. package/src/editor-presentation-notice.ts +42 -0
  468. package/src/editor-runtime.tsx +145 -0
  469. package/src/editor-server-response.ts +86 -0
  470. package/src/editor-session-attribution.ts +75 -0
  471. package/src/editor-session-mode.ts +54 -0
  472. package/src/editor-shell-store.ts +1304 -0
  473. package/src/editor-state-facets.ts +74 -0
  474. package/src/editor-styles.css +33 -0
  475. package/src/editor-view-presentation.ts +810 -0
  476. package/src/editor-viewport.ts +5302 -0
  477. package/src/entity-lod.ts +31 -0
  478. package/src/entity-object.ts +91 -0
  479. package/src/files/file-provider.ts +62 -0
  480. package/src/files/project-files.ts +264 -0
  481. package/src/finders/index.ts +136 -0
  482. package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
  483. package/src/frame/bridge.tsx +1408 -0
  484. package/src/frame/product.ts +77 -0
  485. package/src/gameplay-dom-recording.ts +319 -0
  486. package/src/gameplay-export-state.ts +14 -0
  487. package/src/gameplay-replay.ts +417 -0
  488. package/src/gameplay-session-time.ts +9 -0
  489. package/src/gameplay-sessions.ts +204 -0
  490. package/src/harness-chat-types.ts +253 -0
  491. package/src/hierarchy-component-marks.ts +298 -0
  492. package/src/hierarchy-drop.ts +91 -0
  493. package/src/hierarchy-expansion-state.ts +80 -0
  494. package/src/hierarchy-header-slot.ts +52 -0
  495. package/src/hierarchy-internals.ts +197 -0
  496. package/src/hierarchy-kind-icon.ts +217 -0
  497. package/src/hierarchy-mark-reader.ts +73 -0
  498. package/src/hierarchy-menu-registry.ts +67 -0
  499. package/src/hierarchy-node-rows.ts +307 -0
  500. package/src/hierarchy-panel-view.ts +280 -0
  501. package/src/hierarchy-projection.ts +76 -0
  502. package/src/hierarchy-row-cache.ts +243 -0
  503. package/src/hierarchy-row-model.ts +308 -0
  504. package/src/hierarchy-rows.ts +11 -0
  505. package/src/hierarchy-walk.ts +86 -0
  506. package/src/history/editor-session.ts +25 -0
  507. package/src/history/history-commands.ts +147 -0
  508. package/src/history/history-delegate.ts +163 -0
  509. package/src/history/history-limit-notices.ts +43 -0
  510. package/src/history/history-service.ts +1173 -0
  511. package/src/history/persistence-coordinator.ts +35 -0
  512. package/src/history/project-file-history.ts +386 -0
  513. package/src/history/project-root-history-backends.ts +139 -0
  514. package/src/history/resource-registry.ts +209 -0
  515. package/src/history/snapshot-store.ts +103 -0
  516. package/src/history/source-history-backend.ts +546 -0
  517. package/src/history/types.ts +124 -0
  518. package/src/hmr-registration-group.ts +67 -0
  519. package/src/hmr-stable-react-context.ts +23 -0
  520. package/src/hotkeys.ts +188 -0
  521. package/src/inference-diagnostics.ts +69 -0
  522. package/src/initial-project.ts +80 -0
  523. package/src/inspection/active-subject.ts +578 -0
  524. package/src/inspection/active-surface.ts +142 -0
  525. package/src/inspection/compose.ts +1064 -0
  526. package/src/inspection/display.ts +170 -0
  527. package/src/inspection/document-subject.ts +109 -0
  528. package/src/inspection/game-subject.ts +85 -0
  529. package/src/inspection/model.ts +542 -0
  530. package/src/inspection/null-subject.ts +115 -0
  531. package/src/inspection/serialize.ts +357 -0
  532. package/src/inspection/use-active-inspection.ts +180 -0
  533. package/src/inspector-presentation.ts +201 -0
  534. package/src/inspector-section-registry.ts +221 -0
  535. package/src/instance-source-actions.ts +163 -0
  536. package/src/instanced-presentation.ts +164 -0
  537. package/src/js-heap.ts +71 -0
  538. package/src/key-actions.ts +91 -0
  539. package/src/keymap-presets.ts +401 -0
  540. package/src/layout-policy.ts +31 -0
  541. package/src/learn-links.ts +73 -0
  542. package/src/light-explorer-model.ts +134 -0
  543. package/src/live-canvas-frame.ts +55 -0
  544. package/src/live-document.ts +279 -0
  545. package/src/live-module-source.ts +230 -0
  546. package/src/live-session-registry.ts +220 -0
  547. package/src/live-transition.ts +633 -0
  548. package/src/manifest-project.ts +107 -0
  549. package/src/model-thumbnail.ts +523 -0
  550. package/src/native-selection-style.ts +202 -0
  551. package/src/object3d-document-write-policy.ts +137 -0
  552. package/src/packaged-runtime.ts +108 -0
  553. package/src/palettes/maya.palette.json +57 -0
  554. package/src/palettes/substance.palette.json +57 -0
  555. package/src/pasteboard-module.ts +81 -0
  556. package/src/performance-profiler.ts +367 -0
  557. package/src/performance-sources.ts +69 -0
  558. package/src/play-boot-phase.ts +145 -0
  559. package/src/presentation-surface.ts +248 -0
  560. package/src/project-adapter.ts +1143 -0
  561. package/src/project-asset-refresh.ts +26 -0
  562. package/src/project-declaration-refresh.ts +31 -0
  563. package/src/project-local-state.ts +118 -0
  564. package/src/project-manager.ts +243 -0
  565. package/src/project-module-changes.ts +163 -0
  566. package/src/project-module-split.ts +266 -0
  567. package/src/project-provenance.ts +115 -0
  568. package/src/project-ready.ts +42 -0
  569. package/src/project-session-reset.ts +67 -0
  570. package/src/project-shape.ts +68 -0
  571. package/src/project-tool-discovery.ts +66 -0
  572. package/src/project-tools.ts +107 -0
  573. package/src/project-work-types.ts +149 -0
  574. package/src/projection/three.ts +898 -0
  575. package/src/projection/types.ts +44 -0
  576. package/src/readiness.ts +113 -0
  577. package/src/reflection-probe-helper.ts +142 -0
  578. package/src/reported-play-state.ts +90 -0
  579. package/src/resolve-relative-specifier.ts +33 -0
  580. package/src/scene-document-plan.ts +315 -0
  581. package/src/scene-framing.ts +315 -0
  582. package/src/scene-live-open.ts +210 -0
  583. package/src/scene-view-fog.ts +89 -0
  584. package/src/scoped-game-css.ts +152 -0
  585. package/src/session-orphan-record.ts +193 -0
  586. package/src/session-tombstone.ts +126 -0
  587. package/src/settings/settings-provider.ts +82 -0
  588. package/src/settings-store.ts +345 -0
  589. package/src/shared-view-restore.ts +42 -0
  590. package/src/shell-store-door.ts +45 -0
  591. package/src/source-conflict.ts +122 -0
  592. package/src/spatial-handle-visuals.ts +332 -0
  593. package/src/stage-context.ts +341 -0
  594. package/src/stage-store-registry.ts +63 -0
  595. package/src/stale-chunk-recovery.ts +34 -0
  596. package/src/state-report-deferral.ts +73 -0
  597. package/src/storage/host-files-storage.ts +97 -0
  598. package/src/storage/http-storage.ts +174 -0
  599. package/src/storage/index.ts +75 -0
  600. package/src/storage/mem-storage.ts +149 -0
  601. package/src/storage/path-lock.ts +44 -0
  602. package/src/storage/paths.ts +26 -0
  603. package/src/storage/types.ts +116 -0
  604. package/src/stories/StoryComponentThumbnail.tsx +184 -0
  605. package/src/stories/StoryPreviewMount.tsx +306 -0
  606. package/src/stories/component-content-source.tsx +106 -0
  607. package/src/stories/component-states-source.ts +78 -0
  608. package/src/stories/compose-project-stories.ts +255 -0
  609. package/src/stories/pixi-story-model.ts +30 -0
  610. package/src/stories/prefabs-finder.ts +54 -0
  611. package/src/stories/prefabs-from-stories.ts +182 -0
  612. package/src/stories/project-story-discovery.ts +78 -0
  613. package/src/stories/project-story-regions.ts +24 -0
  614. package/src/stories/story-actions.ts +54 -0
  615. package/src/stories/story-capture-command.ts +124 -0
  616. package/src/stories/story-capture.ts +584 -0
  617. package/src/stories/story-declared-medium.ts +126 -0
  618. package/src/stories/story-discovery.ts +176 -0
  619. package/src/stories/story-document-openers.ts +36 -0
  620. package/src/stories/story-dom-runtime.ts +78 -0
  621. package/src/stories/story-grouping.ts +111 -0
  622. package/src/stories/story-lane.ts +88 -0
  623. package/src/stories/story-mount-turn.ts +27 -0
  624. package/src/stories/story-opener.ts +260 -0
  625. package/src/stories/story-pixi-preview.ts +408 -0
  626. package/src/stories/story-presentation.ts +215 -0
  627. package/src/stories/story-registry.ts +517 -0
  628. package/src/stories/story-three-preview.ts +807 -0
  629. package/src/stories/three-story-model.ts +96 -0
  630. package/src/story-three-preview-runtime.ts +56 -0
  631. package/src/surface-keyboard.ts +112 -0
  632. package/src/surface-state.ts +124 -0
  633. package/src/tab-bootstrap.js +628 -0
  634. package/src/tab-census.ts +198 -0
  635. package/src/tab-lifecycle-client.ts +196 -0
  636. package/src/theme-library.ts +844 -0
  637. package/src/theme-preference.ts +378 -0
  638. package/src/theme.css +3437 -0
  639. package/src/three-viewport/bone-selection-highlight.ts +119 -0
  640. package/src/three-viewport/camera-fit.ts +41 -0
  641. package/src/three-viewport/interactive-renderer.ts +132 -0
  642. package/src/three-viewport/selection-brackets.ts +310 -0
  643. package/src/three-viewport/selection-outline.ts +183 -0
  644. package/src/three-viewport/skeleton-helper.ts +61 -0
  645. package/src/three-viewport/source-color.ts +167 -0
  646. package/src/three-viewport/studio-environment.ts +96 -0
  647. package/src/three-viewport-presentation.ts +23 -0
  648. package/src/tool-contribution-play.ts +74 -0
  649. package/src/tool-loader.ts +1798 -0
  650. package/src/transform-mode-request.ts +57 -0
  651. package/src/transient-hint.ts +78 -0
  652. package/src/trigger-volume-helper.ts +116 -0
  653. package/src/ui-source/adapter-region-includes.ts +241 -0
  654. package/src/ui-source/ensure-import.ts +132 -0
  655. package/src/ui-source/file-region-resolver.ts +302 -0
  656. package/src/ui-source/inspect.ts +775 -0
  657. package/src/ui-source/oid-transform.ts +1845 -0
  658. package/src/ui-source/plan-csf-story.ts +196 -0
  659. package/src/ui-source/plan-extract-component.ts +421 -0
  660. package/src/ui-source/plan-fork-component.ts +621 -0
  661. package/src/ui-source/plan-named-style.ts +95 -0
  662. package/src/ui-source/plan-source-edit.ts +353 -0
  663. package/src/ui-source/r3f-contract-resolver.ts +327 -0
  664. package/src/ui-source/r3f-diagnostic-index.ts +165 -0
  665. package/src/ui-source/r3f-environment-binding.ts +133 -0
  666. package/src/ui-source/r3f-joint-binding.ts +251 -0
  667. package/src/ui-source/r3f-lod-binding.ts +91 -0
  668. package/src/ui-source/r3f-particle-binding.ts +235 -0
  669. package/src/ui-source/r3f-physics-binding.ts +483 -0
  670. package/src/ui-source/r3f-project-contracts.ts +444 -0
  671. package/src/ui-source/relative-import-specifier.ts +34 -0
  672. package/src/ui-source/reparent-guard.ts +544 -0
  673. package/src/ui-source/source-edit-request.ts +97 -0
  674. package/src/ui-source/source-write-backend.ts +618 -0
  675. package/src/ui-source/syntactic-prop-specs.ts +296 -0
  676. package/src/ui-source/tier-source-write-backend.ts +279 -0
  677. package/src/ui-source/ts-ast.ts +171 -0
  678. package/src/ui-source/utility-class-support.ts +169 -0
  679. package/src/ui-source/write-component-default.ts +133 -0
  680. package/src/ui-source/writer.ts +1989 -0
  681. package/src/viewport-activation-timings.ts +840 -0
  682. package/src/viewport-authoring-policy.ts +186 -0
  683. package/src/viewport-controls-hint.ts +57 -0
  684. package/src/viewport-door.ts +237 -0
  685. package/src/viewport-shading-boundary.ts +12 -0
  686. package/src/vite-error-surface.ts +141 -0
  687. package/src/wait-until.ts +37 -0
  688. package/src/workspace-areas.ts +156 -0
  689. package/src/workspace-aux-commands.ts +11 -0
  690. package/src/workspace-available-documents.ts +127 -0
  691. package/src/workspace-core-utilities.ts +31 -0
  692. package/src/workspace-document-ids.ts +59 -0
  693. package/src/workspace-document-registry.ts +612 -0
  694. package/src/workspace-document-restore.ts +145 -0
  695. package/src/workspace-host-commands.ts +141 -0
  696. package/src/workspace-persistence-gate.ts +40 -0
  697. package/src/workspace-play-utilities.ts +44 -0
  698. package/src/workspace-presets.ts +425 -0
  699. package/src/workspace-regions.ts +294 -0
  700. package/src/workspace-state-persistence.ts +536 -0
  701. package/src/workspace-static-panels.ts +73 -0
  702. package/src/workspace-status-registry.ts +121 -0
  703. package/src/workspace-style.ts +239 -0
  704. package/src/workspace-utility-commands.ts +74 -0
  705. package/src/workspace-utility-registry.ts +263 -0
  706. package/src/workspace-viewport-rect.ts +97 -0
  707. package/src/world-adoption.ts +115 -0
  708. package/src/world-document-routing.ts +104 -0
  709. package/vite-plugin-creation-site-write.ts +184 -0
  710. package/vite-plugin-creation-site.ts +80 -0
  711. package/vite-plugin-game-static.ts +303 -0
  712. package/vite-plugin-module-doorways.ts +336 -0
  713. package/vite-plugin-product-contributions.ts +197 -0
  714. package/vite-plugin-project-game-static.ts +125 -0
  715. package/vite-plugin-project-jsx-js.ts +65 -0
  716. package/vite-plugin-project-root-absolute-assets.ts +359 -0
  717. package/vite-plugin-shared-react.ts +420 -0
  718. package/vite-plugin-shared-three.ts +203 -0
  719. package/vite-plugin-ui-oid.ts +2106 -0
@@ -0,0 +1,31 @@
1
+ import type * as THREE from 'three';
2
+ import { isEntityObject } from './entity-object';
3
+
4
+ /**
5
+ * The selected object when it is itself a live THREE.LOD (the native R3F
6
+ * shape), otherwise the entity's live THREE.LOD preview object, or null while
7
+ * an async asset is still loading. A subtree search skips child authoring
8
+ * nodes so a nested LOD entity can never shadow this one's.
9
+ *
10
+ * Format-neutral: reads the caller's native-node membership answer and
11
+ * Three's own `isLOD` marker, never a scene descriptor. The default retains
12
+ * stamp-based compatibility for first-party callers. `editor-viewport.ts`'s
13
+ * per-frame forced-LOD-level enforcement is the only caller.
14
+ */
15
+ export function findEntityLod(
16
+ obj: THREE.Object3D,
17
+ isNestedAuthoringNode: (object: THREE.Object3D) => boolean = isEntityObject,
18
+ ): THREE.LOD | null {
19
+ // Adapter-backed worlds can expose the native LOD itself as the selected
20
+ // authored row (for example Drei Detailed), rather than wrapping it in the
21
+ // old entity preview object this helper was originally extracted for.
22
+ if ((obj as THREE.LOD).isLOD) return obj as THREE.LOD;
23
+ const stack = [...obj.children];
24
+ while (stack.length > 0) {
25
+ const node = stack.pop()!;
26
+ if (isNestedAuthoringNode(node)) continue; // nested entity subtree
27
+ if ((node as THREE.LOD).isLOD) return node as THREE.LOD;
28
+ stack.push(...node.children);
29
+ }
30
+ return null;
31
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * One answer to "which live `Object3D` is this entity id?", for every editor
3
+ * surface that needs one.
4
+ *
5
+ * There are TWO places an id can resolve, and neither is a superset of the
6
+ * other. The ACTIVE ADAPTER's `hierarchy.object3D` is authoritative: a
7
+ * source-backed component may select one identity and render its transform on a
8
+ * child, and an ADOPTED live scene (play mode) is walked by the adapter, so its
9
+ * ids exist there and nowhere else. `EditorShellStore.objectMap` is the shell's
10
+ * own map, which the adapter's answer falls back to.
11
+ *
12
+ * Asking only the store is how `editor.frame(id)` came to refuse an entity the
13
+ * same session had just selected and drawn a cage around. Measured live
14
+ * (2026-08-14, the translated platformer in play mode): `editor.status()`
15
+ * listed `r3f:world:o4a7fjmzo`, `editor.select` on it put a bracket cage on the
16
+ * coin — and `editor.frame` on that same id answered
17
+ * `Entity not found: r3f:world:o4a7fjmzo`, because the adopted play scene's
18
+ * nodes live in the adapter's walk and not in `objectMap`. A verb's EXISTENCE
19
+ * CHECK has to be the resolver its ACTION uses, or the refusal is about a
20
+ * different question than the one asked.
21
+ *
22
+ * ## The REVERSE direction lives here too, and that is the point
23
+ *
24
+ * `userData.entityId` is the stamp an adapter's walk writes when it ADMITS an
25
+ * object as an authoring node (`projection/three.ts`,
26
+ * `R3fSourceAuthoringAdapter.indexGraph`). Reading that stamp is the node → id
27
+ * half of the very same question `entityObject3D` answers id → node, so both
28
+ * halves are spelled once, here — and the surfaces that used to reach for
29
+ * `getUserData(object, 'entityId')` themselves (the viewport gizmo and its
30
+ * surface-snap, the raycast climb, the store's adoption index, the LOD walk)
31
+ * ask this module instead.
32
+ *
33
+ * Presence of the stamp is also the ADMISSION answer: an object the walk
34
+ * skipped (an editor helper, a library-built internal folded into its owner)
35
+ * carries none, which is exactly what {@link isEntityObject} and
36
+ * {@link nearestEntityObject} read. Do not re-derive that from a type test, a
37
+ * name convention or a layer — those disagree with the walk, and a surface that
38
+ * disagrees with the walk is the "one id, three answers" defect.
39
+ */
40
+
41
+ import type { AuthoringAdapter } from '@volter/editor-project/adapter';
42
+ import { getUserData, setUserData } from '@volter/editor-threejs/ecs/user-data';
43
+ import type * as THREE from 'three';
44
+
45
+ /** The live object `id` names, or `null` when nothing in this session answers to it. */
46
+ export function entityObject3D(
47
+ adapter: AuthoringAdapter,
48
+ objectMap: ReadonlyMap<string, THREE.Object3D>,
49
+ id: string,
50
+ ): THREE.Object3D | null {
51
+ return adapter.hierarchy.object3D?.(id) ?? objectMap.get(id) ?? null;
52
+ }
53
+
54
+ /**
55
+ * The id `object` answers to, or `undefined` when no adapter walk has admitted
56
+ * it as an authoring node.
57
+ */
58
+ export function entityIdOf(object: THREE.Object3D | null | undefined): string | undefined {
59
+ const id = getUserData(object, 'entityId');
60
+ return typeof id === 'string' && id ? id : undefined;
61
+ }
62
+
63
+ /** Whether `object` is an admitted authoring node — see {@link entityIdOf}. */
64
+ export function isEntityObject(object: THREE.Object3D | null | undefined): boolean {
65
+ return entityIdOf(object) !== undefined;
66
+ }
67
+
68
+ /**
69
+ * The nearest ancestor-or-self of `object` that is an admitted authoring node,
70
+ * or `null` when the climb reaches the top without finding one.
71
+ *
72
+ * This is what a raycast hit has to do: the ray lands on whatever geometry is
73
+ * in front, which is routinely a library-built part folded INTO a node rather
74
+ * than the node itself.
75
+ */
76
+ export function nearestEntityObject(
77
+ object: THREE.Object3D | null | undefined,
78
+ ): THREE.Object3D | null {
79
+ let cursor: THREE.Object3D | null = object ?? null;
80
+ while (cursor && !isEntityObject(cursor)) cursor = cursor.parent;
81
+ return cursor;
82
+ }
83
+
84
+ /**
85
+ * Record that `object` is the authoring node `id` — called by the adapter walk
86
+ * that MINTED the id, and by nothing else. Every reader above is the other side
87
+ * of this one write.
88
+ */
89
+ export function stampEntityId(object: THREE.Object3D, id: string): void {
90
+ setUserData(object, 'entityId', id);
91
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * THE PROJECT'S FILES, WRITTEN THROUGH THE WORKBENCH — the provider it
3
+ * installs here, and the window before it lands.
4
+ *
5
+ * `EditorHost.files` is the door (`packages/editor/src/files/`) —
6
+ * read/readBytes/write/exists/list/watch over PROJECT-RELATIVE paths, the same
7
+ * spelling the history door hands over, so both resolve against one workspace
8
+ * folder.
9
+ *
10
+ * WHAT THE PROVIDER BUYS, measured (U5): a vgai write the workbench did not
11
+ * make is an EXTERNAL change to it — Monaco reloads the file,
12
+ * `modelService.updateModel` pushes a fresh text element through `EditStack`,
13
+ * and `IUndoRedoService.pushElement` clears that resource's FUTURE, so a gizmo
14
+ * drag's redo was lost whenever a text model for that file was open. A write
15
+ * made THROUGH the workbench is the workbench's own, so no reload fires and
16
+ * the future survives. That is what this buys, and nothing else.
17
+ *
18
+ * IT ARRIVES AFTER THE MOUNT, always: a `ServicesAccessor` is valid only for
19
+ * the synchronous part of a command, so the contribution cannot build the
20
+ * provider before the mount it is handed to. Until it does, the door falls
21
+ * back to the session's transports — a write in that window is a real write
22
+ * with nowhere else to go.
23
+ */
24
+ import type { EditorHostFileEvent, EditorHostFileProvider } from '@volter/editor-sdk/host';
25
+
26
+ export type ProjectFileEvent = EditorHostFileEvent;
27
+ export type ProjectFileProvider = EditorHostFileProvider;
28
+
29
+ let provider: ProjectFileProvider | null = null;
30
+ const listeners = new Set<() => void>();
31
+
32
+ /**
33
+ * Is the provider installed? False until it lands — later than the mount,
34
+ * because a `ServicesAccessor` is valid only for a command's synchronous part,
35
+ * so the contribution hands the provider over after the editor is running. In
36
+ * that window a caller reaches the session's transports instead, which is a
37
+ * real write with nowhere else to go rather than a refusal.
38
+ */
39
+ export function filesProviderInstalled(): boolean {
40
+ return provider !== null;
41
+ }
42
+
43
+ /** The installed provider, or `null` before it lands. */
44
+ export function filesProvider(): ProjectFileProvider | null {
45
+ return provider;
46
+ }
47
+
48
+ /**
49
+ * Install how the project's files are read and written, or `null` to withdraw
50
+ * it — the provider is the workbench's, and a workbench that went away takes
51
+ * it with it.
52
+ */
53
+ export function setFilesProvider(next: ProjectFileProvider | null): void {
54
+ if (provider === next) return;
55
+ provider = next;
56
+ for (const listener of listeners) listener();
57
+ }
58
+
59
+ export function subscribeFilesProvider(listener: () => void): () => void {
60
+ listeners.add(listener);
61
+ return () => listeners.delete(listener);
62
+ }
@@ -0,0 +1,264 @@
1
+ /**
2
+ * THE ONE FILE API over the open project, in PROJECT-RELATIVE paths — the
3
+ * editor's half of `@volter/editor-sdk/host`'s `files` door (U5).
4
+ *
5
+ * Under the FRAME this is VS Code's `IFileService`/`ITextFileService` over the
6
+ * workspace folder, installed as a provider by the Code-OSS bridge. Under the
7
+ * HOST — standalone `vgai edit`, and the hosted browser build — it is today's
8
+ * transports, and this module is the ONE place that says which transport owns
9
+ * which path. That statement used to be spread across five files' doc
10
+ * comments; it is written down once, here, because the fragmentation is the
11
+ * fact U5 measured:
12
+ *
13
+ * | path class | the session's route |
14
+ * |-----------------------|------------------------------|
15
+ * | read, anything | Vite `/@fs/<root>/<path>` |
16
+ * | write `public/**` | `POST /__editor/save-file` |
17
+ * | write `.vgai/**` | `POST /__editor/vgai-file` |
18
+ * | write `src/**` source | `POST /__ui-source/apply` | the storage source-write backend |
19
+ * | list `public/**` | `GET /__editor/assets` | StorageBackend |
20
+ * | watch | `EventSource /__editor/events` | StorageBackend.watch |
21
+ *
22
+ * A path class with no host transport is REFUSED BY NAME, naming the route
23
+ * that does own it. It is not this door's business to invent a general
24
+ * project-root write route on the session: each of those routes is
25
+ * deliberately narrow (`/__editor/vgai-file` accepts only `.vgai/**`,
26
+ * `/__editor/data-file` only `src/data/**\/*.data.json`), and their own header
27
+ * comments record that as defence in depth. Under the frame the question does
28
+ * not arise — the workbench's file service owns the whole folder.
29
+ *
30
+ * `StorageBackend`'s paths are NOT this door's paths, and that difference is
31
+ * the measurement the door exists for: `HttpStorage` is rooted at
32
+ * `<project>/public/` while a project-rooted backend is rooted at the
33
+ * project root. Callers that still speak `StorageBackend` keep doing so; what
34
+ * they get under the frame is `storage/host-files-storage.ts`, a `public/`
35
+ * view onto this door.
36
+ */
37
+
38
+ import { bytesToBase64 } from '../bytes-codec';
39
+ import { getProjectDefinePath } from '../editor-mode';
40
+ import { assertEditorServerAnswered, editorServerJson } from '../editor-server-response';
41
+ import { sourceMutationAttribution } from '../editor-session-attribution';
42
+ import { filesProvider, filesProviderInstalled, type ProjectFileEvent } from './file-provider';
43
+
44
+ const BASE = '/__editor';
45
+
46
+ export interface ProjectFileEntry {
47
+ readonly name: string;
48
+ readonly path: string;
49
+ readonly type: 'file' | 'dir';
50
+ }
51
+
52
+ /** Project-relative, `/`-separated, no leading slash, no `..`. */
53
+ function normalize(path: string): string {
54
+ return path.replace(/\\/g, '/').replace(/^\/+/, '').replace(/\/+$/, '');
55
+ }
56
+
57
+ function assertContained(path: string): string {
58
+ const normalized = normalize(path);
59
+ if (!normalized || normalized.split('/').includes('..')) {
60
+ throw new Error(`projectFiles: "${path}" is not a project-relative path.`);
61
+ }
62
+ return normalized;
63
+ }
64
+
65
+ /**
66
+ * The same containment check for a DIRECTORY, where the empty string is the
67
+ * project root and therefore legal.
68
+ *
69
+ * It exists because `list` ran bare {@link normalize} while every other member
70
+ * ran {@link assertContained} — so a `..` segment reached the frame's provider
71
+ * or a session route while the same segment in a `read` was refused here.
72
+ * `normalize` strips a LEADING slash; it has never removed a `..` segment, and
73
+ * a caller reading its name could be forgiven for thinking otherwise. The
74
+ * empty string is the one thing `assertContained` rejects that a directory
75
+ * legitimately needs (it is how the project root itself is listed), which is
76
+ * why this is a second function rather than a flag.
77
+ */
78
+ function assertContainedDir(dir: string): string {
79
+ const normalized = normalize(dir);
80
+ if (normalized.split('/').includes('..')) {
81
+ throw new Error(`projectFiles: "${dir}" is not a project-relative directory.`);
82
+ }
83
+ return normalized;
84
+ }
85
+
86
+ /**
87
+ * The refusal a host-tier write to a path class no session route owns gets.
88
+ * It NAMES the owning route rather than failing generically, because the one
89
+ * thing a caller can do about it is use that route.
90
+ */
91
+ function noHostWriteRoute(path: string): Error {
92
+ return new Error(
93
+ `projectFiles.write("${path}"): the standalone editor has no general project-root write route, ` +
94
+ 'and this door does not invent one. Source files are written through `/__ui-source/apply` ' +
95
+ '(`ui-source/source-write-backend.ts`), `public/**` through `/__editor/save-file`, `.vgai/**` ' +
96
+ 'through `/__editor/vgai-file`. Under the Code-OSS frame the workbench file service owns the ' +
97
+ 'whole folder and this refusal cannot occur.',
98
+ );
99
+ }
100
+
101
+ // ---------------------------------------------------------------------------
102
+ // The HOST fill — today's transports
103
+ // ---------------------------------------------------------------------------
104
+
105
+ async function hostRead(path: string): Promise<string> {
106
+ const res = await fetch(`/@fs/${getProjectDefinePath()}/${path}`);
107
+ if (!res.ok) throw new Error(`projectFiles.read "${path}": HTTP ${res.status}`);
108
+ return res.text();
109
+ }
110
+
111
+ async function hostReadBytes(path: string): Promise<Uint8Array> {
112
+ const res = await fetch(`/@fs/${getProjectDefinePath()}/${path}`);
113
+ if (!res.ok) throw new Error(`projectFiles.readBytes "${path}": HTTP ${res.status}`);
114
+ return new Uint8Array(await res.arrayBuffer());
115
+ }
116
+
117
+ async function hostWrite(path: string, data: string | Uint8Array): Promise<void> {
118
+ if (path.startsWith('public/')) {
119
+ const body =
120
+ typeof data === 'string'
121
+ ? { path: path.slice('public/'.length), content: data, ...sourceMutationAttribution() }
122
+ : {
123
+ path: path.slice('public/'.length),
124
+ content: bytesToBase64(data),
125
+ encoding: 'base64' as const,
126
+ ...sourceMutationAttribution(),
127
+ };
128
+ const res = await fetch(`${BASE}/save-file`, {
129
+ method: 'POST',
130
+ headers: { 'Content-Type': 'application/json' },
131
+ body: JSON.stringify(body),
132
+ });
133
+ assertEditorServerAnswered(res, `Write ${path} failed`);
134
+ if (!res.ok) throw new Error(`projectFiles.write "${path}": HTTP ${res.status}`);
135
+ return;
136
+ }
137
+ if (path.startsWith('.vgai/')) {
138
+ const body =
139
+ typeof data === 'string'
140
+ ? { path, content: data, ...sourceMutationAttribution() }
141
+ : {
142
+ path,
143
+ content: bytesToBase64(data),
144
+ encoding: 'base64' as const,
145
+ ...sourceMutationAttribution(),
146
+ };
147
+ const res = await fetch(`${BASE}/vgai-file`, {
148
+ method: 'POST',
149
+ headers: { 'Content-Type': 'application/json' },
150
+ body: JSON.stringify(body),
151
+ });
152
+ assertEditorServerAnswered(res, `Write ${path} failed`);
153
+ if (!res.ok) throw new Error(`projectFiles.write "${path}": HTTP ${res.status}`);
154
+ return;
155
+ }
156
+ throw noHostWriteRoute(path);
157
+ }
158
+
159
+ async function hostExists(path: string): Promise<boolean> {
160
+ try {
161
+ const res = await fetch(`/@fs/${getProjectDefinePath()}/${path}`, { method: 'HEAD' });
162
+ // The dev server's SPA fallback answers 200 with `index.html` for a missing
163
+ // path, so `res.ok` alone cannot tell existence from absence — the same
164
+ // measured false positive `api/project-source.ts`'s `probeProjectFile`
165
+ // records. A real file never answers as an HTML DOCUMENT.
166
+ if (!res.ok) return false;
167
+ return !(res.headers.get('content-type') ?? '').toLowerCase().includes('text/html');
168
+ } catch {
169
+ return false;
170
+ }
171
+ }
172
+
173
+ interface ServerAssetEntry {
174
+ name: string;
175
+ type: 'file' | 'directory';
176
+ }
177
+
178
+ async function hostList(dir: string): Promise<readonly ProjectFileEntry[]> {
179
+ if (!dir.startsWith('public')) {
180
+ throw new Error(
181
+ `projectFiles.list("${dir}"): the standalone editor lists only \`public/**\` ` +
182
+ '(`/__editor/assets`); source trees are listed by glob through ' +
183
+ "`/__editor/source-files` (`api/project-source.ts`'s `listProjectSourceFiles`).",
184
+ );
185
+ }
186
+ const inner = dir === 'public' ? '' : dir.slice('public/'.length);
187
+ const res = await fetch(`${BASE}/assets?${new URLSearchParams({ dir: inner })}`);
188
+ const { entries } = await editorServerJson<{ entries: ServerAssetEntry[] }>(
189
+ res,
190
+ `projectFiles.list "${dir}" failed`,
191
+ );
192
+ return entries.map((entry) => ({
193
+ name: entry.name,
194
+ path: inner ? `public/${inner}/${entry.name}` : `public/${entry.name}`,
195
+ type: entry.type === 'directory' ? ('dir' as const) : ('file' as const),
196
+ }));
197
+ }
198
+
199
+ function hostWatch(listener: (event: ProjectFileEvent) => void): () => void {
200
+ const source = new EventSource(`${BASE}/events`);
201
+ const handler = (ev: MessageEvent) => {
202
+ try {
203
+ const data = JSON.parse(ev.data) as { type?: string; file?: string; path?: string };
204
+ const path = data.path ?? data.file;
205
+ if (!path) return;
206
+ listener({
207
+ type: (data.type as ProjectFileEvent['type']) ?? 'update',
208
+ path: normalize(path),
209
+ });
210
+ } catch {
211
+ // Non-JSON keepalive frame.
212
+ }
213
+ };
214
+ source.addEventListener('message', handler);
215
+ return () => {
216
+ source.removeEventListener('message', handler);
217
+ source.close();
218
+ };
219
+ }
220
+
221
+ // ---------------------------------------------------------------------------
222
+ // The door
223
+ // ---------------------------------------------------------------------------
224
+
225
+ export const projectFiles = {
226
+ /** True while the workbench's own file service is answering. A caller with
227
+ * a transport of its own (the source-write lane) reads this to decide
228
+ * whether its write would be EXTERNAL to the workbench. */
229
+ frameOwned: filesProviderInstalled,
230
+
231
+ async read(path: string): Promise<string> {
232
+ const key = assertContained(path);
233
+ return filesProvider()?.read(key) ?? hostRead(key);
234
+ },
235
+
236
+ async readBytes(path: string): Promise<Uint8Array> {
237
+ const key = assertContained(path);
238
+ const provider = filesProvider();
239
+ return provider?.readBytes ? provider.readBytes(key) : hostReadBytes(key);
240
+ },
241
+
242
+ async write(path: string, data: string | Uint8Array): Promise<void> {
243
+ const key = assertContained(path);
244
+ const provider = filesProvider();
245
+ if (provider) return provider.write(key, data);
246
+ return hostWrite(key, data);
247
+ },
248
+
249
+ async exists(path: string): Promise<boolean> {
250
+ const key = assertContained(path);
251
+ return filesProvider()?.exists(key) ?? hostExists(key);
252
+ },
253
+
254
+ async list(dir: string): Promise<readonly ProjectFileEntry[]> {
255
+ const key = assertContainedDir(dir);
256
+ const provider = filesProvider();
257
+ return provider?.list ? provider.list(key) : hostList(key);
258
+ },
259
+
260
+ watch(listener: (event: ProjectFileEvent) => void): () => void {
261
+ const provider = filesProvider();
262
+ return provider?.watch ? provider.watch(listener) : hostWatch(listener);
263
+ },
264
+ };
@@ -0,0 +1,136 @@
1
+ /**
2
+ * THE FINDER NAMESPACE — host-owned discovery algorithms an adapter SELECTS.
3
+ *
4
+ * ARCHITECTURE-CORE §The editor protocol, "Zero inference": what zero
5
+ * inference forbids is the ENGINE running a finder nobody selected. A
6
+ * convention (`src/scenes/`, a story registration) is legitimate exactly when
7
+ * it is an adapter's declared finder parameter, and illegitimate as implicit
8
+ * engine behavior.
9
+ *
10
+ * That is enforced MECHANICALLY, not by policy: everything under this
11
+ * directory has exactly ONE sanctioned importer — the editor's adapter loader
12
+ * (`packages/editor/src/project-adapter.ts`) — and
13
+ * `packages/engine/test/finder-import-boundary.test.ts` fails by name when any
14
+ * other engine/editor file imports it. Do not add a second importer; make the
15
+ * loader answer instead.
16
+ *
17
+ * Dependency direction is one-way: finders import their parameter types from
18
+ * `../adapter-module`, and `adapter-module.ts` imports nothing from here. That
19
+ * is what keeps a game's `vgai.adapter.ts` free of finder implementations.
20
+ */
21
+
22
+ import {
23
+ EXPORTED_COMPOSITION_REGIONS,
24
+ type FinderSelection,
25
+ type ScenesFromEntrypointSelectionParams,
26
+ } from '@volter/editor-project/adapter/adapter-module';
27
+ import type { FinderResult } from '@volter/editor-project/adapter/finders/finder-result';
28
+ import { registerFinder, runRegisteredFinder } from '@volter/editor-project/adapter/finders/registry';
29
+ import { type ZodType, z } from 'zod';
30
+ import {
31
+ type ScenesFromEntrypointSelectionInput,
32
+ scenesFromEntrypointSelection,
33
+ } from './scenes-from-entrypoint-selection';
34
+
35
+ export type { FinderResult } from '@volter/editor-project/adapter/finders/finder-result';
36
+ export type {
37
+ FinderContribution,
38
+ FinderRegistration,
39
+ } from '@volter/editor-project/adapter/finders/registry';
40
+ export {
41
+ registerContributedFinder,
42
+ registeredFinderNames,
43
+ registerFinder,
44
+ runRegisteredFinder,
45
+ } from '@volter/editor-project/adapter/finders/registry';
46
+ export type {
47
+ EntrypointSource,
48
+ ScenesFromEntrypointSelectionInput,
49
+ } from './scenes-from-entrypoint-selection';
50
+ export { scenesFromEntrypointSelection } from './scenes-from-entrypoint-selection';
51
+
52
+ /** Everything any shipped finder can be handed, gathered once by the loader. */
53
+ /** A project source the host read for a selection's `include` globs. */
54
+ export interface ProjectSourceFile {
55
+ /** Project-relative path. */
56
+ readonly path: string;
57
+ readonly source: string;
58
+ }
59
+
60
+ /** One entry of the host's project component index. */
61
+ export interface ProjectComponentRef {
62
+ readonly name: string;
63
+ /** Project-relative source path of the component's own module. */
64
+ readonly path: string;
65
+ /** Region this component's surface belongs to, when the host knows it. */
66
+ readonly region?: string | null;
67
+ }
68
+
69
+ export type FinderInput = ScenesFromEntrypointSelectionInput & {
70
+ /**
71
+ * The project's component index — what a finder joins its own discovery
72
+ * against (a prefab's source path and region).
73
+ *
74
+ * There is deliberately no `stories` here. `prefabsFromStories` used to be
75
+ * an engine finder whose story registrations the EDITOR filled, which is how
76
+ * the editor's adapter loader came to import the story registry and, through
77
+ * it, Storybook. It is a registered finder that reads its own ledger now
78
+ * (`packages/editor/src/stories/prefabs-finder.ts`): a finder's data arrives
79
+ * with the finder.
80
+ */
81
+ readonly components?: readonly ProjectComponentRef[];
82
+ /** The sources matching every selection's `include` globs — empty when
83
+ * no selection declares any. A contributed finder reads the project
84
+ * through this and {@link FinderInput.files} and nothing else. */
85
+ readonly sources?: readonly ProjectSourceFile[];
86
+ /**
87
+ * The PATHS matching those same globs — every one of them, including the
88
+ * files `sources` has no text for.
89
+ *
90
+ * A finder over BINARY documents needs this and could not use `sources`:
91
+ * `@volter/editor-blender`'s `modelsFromBlendFiles` lists `.blend` files, and there
92
+ * is nothing in a `.blend` a text walk could honestly read — the entry IS
93
+ * the file. Handing it a decoded binary instead would have been the shim.
94
+ */
95
+ readonly files?: readonly string[];
96
+ };
97
+
98
+ /**
99
+ * Run one adapter-declared selection. The switch is exhaustive over
100
+ * {@link FinderSelection}: a new finder that forgets a case fails to COMPILE
101
+ * here rather than silently contributing nothing.
102
+ */
103
+ export function runFinderSelection(selection: FinderSelection, input: FinderInput): FinderResult {
104
+ return runRegisteredFinder(selection, input);
105
+ }
106
+
107
+ // The engine's own finders register here, schemas beside them: what an
108
+ // adapter may select by name is exactly what this registry holds.
109
+ const ScenesFromEntrypointSelectionSchema = z
110
+ .object({
111
+ finder: z.literal('scenesFromEntrypointSelection'),
112
+ regions: z
113
+ .union([z.array(z.string().min(1)).min(1), z.literal(EXPORTED_COMPOSITION_REGIONS)])
114
+ .describe('Region ids whose entrypoints carry the selection, or the rule form'),
115
+ selection: z
116
+ .string()
117
+ .min(1)
118
+ .optional()
119
+ .describe(
120
+ "Identifier of the entrypoint's module-level scene selection table; omit for a " +
121
+ 'single-composition entrypoint',
122
+ ),
123
+ })
124
+ .strict()
125
+ .refine((value) => value.selection === undefined || Array.isArray(value.regions), {
126
+ message:
127
+ 'scenesFromEntrypointSelection: `selection` names an identifier in ONE entrypoint’s ' +
128
+ `source, so it cannot be paired with the \`${EXPORTED_COMPOSITION_REGIONS}\` rule — ` +
129
+ 'name the region explicitly (`regions: ["<rootId>"]`).',
130
+ });
131
+ registerFinder<ScenesFromEntrypointSelectionParams, FinderInput>({
132
+ name: 'scenesFromEntrypointSelection',
133
+ schema:
134
+ ScenesFromEntrypointSelectionSchema as unknown as ZodType<ScenesFromEntrypointSelectionParams>,
135
+ run: scenesFromEntrypointSelection,
136
+ });