@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,113 @@
1
+ /**
2
+ * WHO DRAWS *THIS* SELECTED ASSET — the tenth registry in the family of
3
+ * `workspace-document-restore.ts` (a kind owns its persisted state),
4
+ * `document-open-registry.ts` (a kind owns how it opens),
5
+ * `chrome-slot-registry.ts` (the host owns the place, a package owns what
6
+ * sits there), `content-entry-source-registry.ts` (the host owns the Content
7
+ * scope, a package owns why a component is content),
8
+ * `authoring/design-time-mount-registry.ts`, `component-board-registry.ts`,
9
+ * `component-states-registry.ts` and `static-panel-presentation-registry.ts`.
10
+ * Here: the host owns the Inspector's asset SECTION — the thumbnail, the
11
+ * metadata rows, the tool sections, the empty state — and a package owns the
12
+ * body for an asset the host has no way to draw.
13
+ *
14
+ * WHY IT EXISTS. `components/asset-selection-section.tsx` opened with
15
+ * `if (asset.online) { … <OnlineAssetDetail/> … }` — the Inspector knowing
16
+ * that an asset can come from an external catalog, and importing that
17
+ * catalog's whole detail view (421 lines, plus the import-job ledger it
18
+ * writes) into every editor boot, a `models` build that has no catalog
19
+ * included (WORK.md §The open-source launch, the final audit's online-library
20
+ * row). The sibling of `contentEntryForComponent`: one question — "is there a
21
+ * registered body for this subject, and what is it" — asked of a registry
22
+ * instead of answered by a branch.
23
+ *
24
+ * THE SHAPE is transcribed from `content-entry-source-registry.ts` (register /
25
+ * list / subscribe, owner-replaces-owner for an HMR re-evaluation, a stable
26
+ * EMPTY array so a reader's `useSyncExternalStore` snapshot is stable). TWO
27
+ * deliberate differences:
28
+ * - NO per-registration `subscribe` to re-fan. A content SOURCE has a ledger
29
+ * that settles asynchronously; a viewer is a pure function of the asset
30
+ * the host already re-renders on. The registry's own change signal is all
31
+ * a reader needs, and a hook with nothing to subscribe to is a name that
32
+ * got built because it was named.
33
+ * - `match(asset)` IS THE WHOLE DISCRIMINATOR. The host never asks "is this
34
+ * online" again; it asks who claims the asset. First match wins, in
35
+ * registration order, so a build with no catalog package falls through to
36
+ * the host's own generic body — which is the answer it always gave for
37
+ * every asset that was not online.
38
+ *
39
+ * NOTHING REGISTERED IS A REAL ANSWER: the generic body, exactly as before.
40
+ */
41
+
42
+ import type { ComponentType } from 'react';
43
+ import type { SelectedAsset } from './asset-selection';
44
+
45
+ export interface AssetSelectionViewerProps {
46
+ readonly asset: SelectedAsset;
47
+ }
48
+
49
+ export interface AssetSelectionViewer {
50
+ /** The viewer's id, in its own vocabulary. */
51
+ readonly id: string;
52
+ /** Which module registered it. Re-registering the same owner+id REPLACES. */
53
+ readonly owner: string;
54
+ /** Ascending; ties keep registration order. */
55
+ readonly order?: number;
56
+ /** Does this viewer claim the selected asset? The host asks; it never
57
+ * inspects the asset for a lane's own fields itself. */
58
+ readonly match: (asset: SelectedAsset) => boolean;
59
+ /** The Inspector body for a claimed asset, rendered INSTEAD of the host's
60
+ * generic one — the viewer owns everything below the section's frame,
61
+ * including any actions it wants. */
62
+ readonly View: ComponentType<AssetSelectionViewerProps>;
63
+ }
64
+
65
+ const _viewers: AssetSelectionViewer[] = [];
66
+ const listeners = new Set<() => void>();
67
+ let version = 0;
68
+
69
+ function publish(): void {
70
+ version++;
71
+ for (const listener of listeners) listener();
72
+ }
73
+
74
+ /** Install a viewer. Returns the teardown. */
75
+ export function registerAssetSelectionViewer(viewer: AssetSelectionViewer): () => void {
76
+ const stale = _viewers.findIndex((item) => item.owner === viewer.owner && item.id === viewer.id);
77
+ if (stale >= 0) _viewers.splice(stale, 1);
78
+ _viewers.push(viewer);
79
+ _viewers.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
80
+ publish();
81
+ return () => {
82
+ const at = _viewers.indexOf(viewer);
83
+ if (at < 0) return;
84
+ _viewers.splice(at, 1);
85
+ publish();
86
+ };
87
+ }
88
+
89
+ /** The first registered viewer that claims this asset, or `null` — "nobody
90
+ * registered a body for it", which is a real answer and never an error. */
91
+ export function assetSelectionViewerFor(asset: SelectedAsset): AssetSelectionViewer | null {
92
+ for (const viewer of _viewers) if (viewer.match(asset)) return viewer;
93
+ return null;
94
+ }
95
+
96
+ /** ONE subscription for the Inspector section. */
97
+ export function subscribeAssetSelectionViewers(listener: () => void): () => void {
98
+ listeners.add(listener);
99
+ return () => {
100
+ listeners.delete(listener);
101
+ };
102
+ }
103
+
104
+ export function assetSelectionViewersVersion(): number {
105
+ return version;
106
+ }
107
+
108
+ /** Test-only reset (mirrors the restore, open, chrome-slot, content-source,
109
+ * design-time-mount, component-board and static-panel registries'). */
110
+ export function __resetAssetSelectionViewersForTest(): void {
111
+ _viewers.length = 0;
112
+ publish();
113
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Asset SELECTION state (W2) — the "single click selects" half of the selection-vs-open
3
+ * contract:
4
+ *
5
+ * - single click in the Project/Assets browser SELECTS the asset and shows
6
+ * compact preview/metadata in the Inspector (the registered
7
+ * `components/asset-selection-section.tsx` section reads this store);
8
+ * - double click / Enter OPENS the full viewer as a center document
9
+ * (`components/asset-documents.tsx`);
10
+ * - drag remains a placement gesture and never touches this store.
11
+ *
12
+ * A tiny module-scope store in the house `useSyncExternalStore` shape
13
+ * (mirrors `inspector-section-registry.ts`): version counter + subscribe +
14
+ * `__resetForTest`. It deliberately does NOT touch the EditorShellStore's entity
15
+ * selection — clicking an asset must never deselect/reselect scene entities
16
+ * (§6.1 "selection never unexpectedly..."); instead the Inspector gives the
17
+ * asset domain precedence while retaining that entity selection, and the asset is auto-cleared
18
+ * when the ENTITY selection changes (the user moved on — see
19
+ * `installAssetSelectionAutoClear`).
20
+ */
21
+
22
+ import type { AssetCapabilities } from './asset-workflow/asset-capabilities';
23
+ import type { AssetKind, OnlineAssetInfo } from './editor-shell-store';
24
+
25
+ /** The §5.1 compact-selection payload — enough for the Inspector section to
26
+ * render preview + metadata without re-deriving browser state. */
27
+ export interface SelectedAsset {
28
+ /** Project serving path, or a stable `online:<source>:<id>` document key. */
29
+ readonly path: string;
30
+ /** Source-owned file name as authored (§8 — `crate.png`). */
31
+ readonly name: string;
32
+ readonly kind: AssetKind | 'component' | 'folder' | 'unknown';
33
+ /** Portable-CSF preview identity for a source-owned prefab/component. */
34
+ readonly componentPreview?: {
35
+ readonly surface: 'three' | 'canvas' | 'dom' | 'unknown';
36
+ readonly sourcePath: string;
37
+ };
38
+ /** File size in bytes when the browser knows it. */
39
+ readonly sizeBytes?: number;
40
+ readonly capabilities?: AssetCapabilities;
41
+ readonly health?: 'healthy' | 'source-only' | 'unsupported';
42
+ readonly sourcePath?: string;
43
+ readonly selectionCount?: number;
44
+ readonly selectionTotalBytes?: number;
45
+ readonly selectionFormats?: readonly string[];
46
+ readonly dependencies?: readonly string[];
47
+ readonly references?: readonly { ownerPath: string; jsonPath: string }[];
48
+ readonly healthCodes?: readonly string[];
49
+ /** Selection came from the external acquisition Library rather than the
50
+ * project's owned file tree. `online` carries the provider identity and is
51
+ * intentionally absent from project assets. */
52
+ readonly origin?: 'project' | 'library';
53
+ readonly online?: OnlineAssetInfo;
54
+ }
55
+
56
+ let _selected: SelectedAsset | null = null;
57
+ let _version = 0;
58
+ const _listeners = new Set<() => void>();
59
+
60
+ function notifyChanged(): void {
61
+ _version++;
62
+ for (const fn of _listeners) fn();
63
+ }
64
+
65
+ /** Subscribe to selection changes. Returns an unsubscribe function. */
66
+ export function subscribeAssetSelection(fn: () => void): () => void {
67
+ _listeners.add(fn);
68
+ return () => {
69
+ _listeners.delete(fn);
70
+ };
71
+ }
72
+
73
+ /** Monotonic change counter — the `getSnapshot` for `useSyncExternalStore`. */
74
+ export function assetSelectionVersion(): number {
75
+ return _version;
76
+ }
77
+
78
+ /** The currently selected asset, or `null`. */
79
+ export function getSelectedAsset(): SelectedAsset | null {
80
+ return _selected;
81
+ }
82
+
83
+ /** Select an asset (single-click). Idempotent on the same path. */
84
+ export function setSelectedAsset(asset: SelectedAsset): void {
85
+ if (_selected && JSON.stringify(_selected) === JSON.stringify(asset)) return;
86
+ _selected = asset;
87
+ notifyChanged();
88
+ }
89
+
90
+ /** Clear the asset selection (no-op when already clear). */
91
+ export function clearSelectedAsset(): void {
92
+ if (_selected === null) return;
93
+ _selected = null;
94
+ notifyChanged();
95
+ }
96
+
97
+ /** The narrow store surface the auto-clear needs (testable with a fake). */
98
+ export interface AssetSelectionAutoClearStore {
99
+ subscribe(listener: () => void): () => void;
100
+ readonly selectedEntityIds: ReadonlySet<string>;
101
+ }
102
+
103
+ function entitySelectionKey(store: AssetSelectionAutoClearStore): string {
104
+ return [...store.selectedEntityIds].sort().join('\n');
105
+ }
106
+
107
+ /**
108
+ * Auto-clear wiring (installed once per editor session by the layout): when
109
+ * the ENTITY selection changes while an asset is selected, the user has moved
110
+ * on — drop the asset selection so the Inspector goes back to being purely
111
+ * entity-contextual. The entity-selection snapshot is captured on every asset
112
+ * selection SET (not at install time), so only a change that happens AFTER
113
+ * the asset click clears it.
114
+ */
115
+ export function installAssetSelectionAutoClear(store: AssetSelectionAutoClearStore): () => void {
116
+ let snapshot = entitySelectionKey(store);
117
+ const unsubscribeSelf = subscribeAssetSelection(() => {
118
+ if (_selected) snapshot = entitySelectionKey(store);
119
+ });
120
+ const unsubscribeStore = store.subscribe(() => {
121
+ if (_selected && entitySelectionKey(store) !== snapshot) clearSelectedAsset();
122
+ });
123
+ return () => {
124
+ unsubscribeSelf();
125
+ unsubscribeStore();
126
+ };
127
+ }
128
+
129
+ /** Test-only reset (mirrors `__resetInspectorSectionRegistryForTest`). */
130
+ export function __resetAssetSelectionForTest(): void {
131
+ _selected = null;
132
+ notifyChanged();
133
+ }
@@ -0,0 +1,344 @@
1
+ export type AssetFormat =
2
+ | 'glb'
3
+ | 'gltf'
4
+ | 'fbx'
5
+ | 'obj'
6
+ | 'dae'
7
+ | 'stl'
8
+ | 'ply'
9
+ | 'spz'
10
+ | '3ds'
11
+ | 'bvh'
12
+ | 'blend'
13
+ | 'usd'
14
+ | 'usda'
15
+ | 'usdc'
16
+ | 'png'
17
+ | 'jpg'
18
+ | 'jpeg'
19
+ | 'webp'
20
+ | 'gif'
21
+ | 'svg'
22
+ | 'hdr'
23
+ | 'exr'
24
+ | 'mp4'
25
+ | 'webm'
26
+ | 'mp3'
27
+ | 'ogg'
28
+ | 'wav'
29
+ | 'flac'
30
+ | 'cube'
31
+ | 'glsl'
32
+ | 'vert'
33
+ | 'frag'
34
+ | 'ts'
35
+ | 'tsx'
36
+ | 'js'
37
+ | 'jsx'
38
+ | 'css'
39
+ | 'html'
40
+ | 'md'
41
+ | 'txt'
42
+ | 'mtl'
43
+ | 'csv'
44
+ | 'xml'
45
+ | 'yaml'
46
+ | 'yml'
47
+ | 'inputmap.json'
48
+ | 'data.json'
49
+ | 'json'
50
+ | 'unknown';
51
+
52
+ export type AssetImportStrategy =
53
+ | 'copy-runtime'
54
+ | 'convert-model'
55
+ | 'animation-source'
56
+ | 'copy-project'
57
+ | 'unsupported';
58
+
59
+ export type AssetCapabilityKind =
60
+ | 'model'
61
+ | 'image'
62
+ | 'video'
63
+ | 'audio'
64
+ | 'json'
65
+ | 'prefab'
66
+ | 'source'
67
+ | 'unknown';
68
+
69
+ export interface AssetCapabilities {
70
+ readonly format: AssetFormat;
71
+ readonly kind: AssetCapabilityKind;
72
+ readonly previewable: boolean;
73
+ readonly importable: boolean;
74
+ readonly runtimeReady: boolean;
75
+ readonly placeable: boolean;
76
+ readonly animated: boolean;
77
+ readonly importStrategy: AssetImportStrategy;
78
+ readonly editor:
79
+ | 'model'
80
+ | 'image'
81
+ | 'environment'
82
+ | 'video'
83
+ | 'audio'
84
+ | 'data'
85
+ | 'source'
86
+ | 'none';
87
+ }
88
+
89
+ const MODEL_PREVIEW_FORMATS = ['glb', 'gltf', 'fbx', 'obj', 'dae', 'stl', 'ply', '3ds'] as const;
90
+ const SOURCE_MODEL_FORMATS = ['blend', 'usd', 'usda', 'usdc'] as const;
91
+ const IMAGE_FORMATS = ['png', 'jpg', 'jpeg', 'webp', 'gif', 'svg'] as const;
92
+ const HIGH_DYNAMIC_RANGE_FORMATS = ['hdr', 'exr'] as const;
93
+ const AUDIO_FORMATS = ['mp3', 'ogg', 'wav', 'flac'] as const;
94
+ /** Clip formats a browser plays natively. Reference material (a generated
95
+ * motion study, a captured plate) is the common case, and a video is NOT a
96
+ * runtime-ready game asset: nothing in a scene places one, so `placeable`
97
+ * and `runtimeReady` stay false and the row's whole job is to be seen. */
98
+ const VIDEO_FORMATS = ['mp4', 'webm'] as const;
99
+ const COLOR_GRADE_FORMATS = ['cube'] as const;
100
+ const SHADER_SOURCE_FORMATS = ['glsl', 'vert', 'frag'] as const;
101
+ const TEXT_SOURCE_FORMATS = [
102
+ 'txt',
103
+ 'md',
104
+ 'ts',
105
+ 'tsx',
106
+ 'js',
107
+ 'jsx',
108
+ 'css',
109
+ 'html',
110
+ 'mtl',
111
+ 'csv',
112
+ 'xml',
113
+ 'yaml',
114
+ 'yml',
115
+ ] as const;
116
+
117
+ function row(
118
+ format: AssetFormat,
119
+ values: Omit<AssetCapabilities, 'format'>,
120
+ ): readonly [AssetFormat, AssetCapabilities] {
121
+ return [format, { format, ...values }];
122
+ }
123
+
124
+ const MODEL_SOURCE_BASE = {
125
+ kind: 'source',
126
+ previewable: true,
127
+ importable: true,
128
+ runtimeReady: false,
129
+ placeable: false,
130
+ animated: false,
131
+ importStrategy: 'convert-model',
132
+ editor: 'model',
133
+ } as const;
134
+
135
+ export const ASSET_CAPABILITY_REGISTRY: ReadonlyMap<AssetFormat, AssetCapabilities> = new Map([
136
+ ...MODEL_PREVIEW_FORMATS.map((format) =>
137
+ row(format, {
138
+ ...MODEL_SOURCE_BASE,
139
+ kind: format === 'glb' || format === 'gltf' ? 'model' : 'source',
140
+ runtimeReady: format === 'glb' || format === 'gltf',
141
+ placeable: format === 'glb' || format === 'gltf',
142
+ importStrategy: format === 'glb' || format === 'gltf' ? 'copy-runtime' : 'convert-model',
143
+ }),
144
+ ),
145
+ row('spz', {
146
+ kind: 'model',
147
+ previewable: true,
148
+ importable: true,
149
+ runtimeReady: true,
150
+ placeable: true,
151
+ animated: false,
152
+ importStrategy: 'copy-runtime',
153
+ editor: 'model',
154
+ }),
155
+ row('bvh', {
156
+ kind: 'source',
157
+ previewable: true,
158
+ importable: true,
159
+ runtimeReady: false,
160
+ placeable: false,
161
+ animated: true,
162
+ importStrategy: 'animation-source',
163
+ editor: 'model',
164
+ }),
165
+ ...SOURCE_MODEL_FORMATS.map((format) =>
166
+ row(format, { ...MODEL_SOURCE_BASE, previewable: false, editor: 'source' }),
167
+ ),
168
+ ...IMAGE_FORMATS.map((format) =>
169
+ row(format, {
170
+ kind: 'image',
171
+ previewable: true,
172
+ importable: true,
173
+ runtimeReady: true,
174
+ placeable: false,
175
+ animated: format === 'gif',
176
+ importStrategy: 'copy-project',
177
+ editor: 'image',
178
+ }),
179
+ ),
180
+ ...HIGH_DYNAMIC_RANGE_FORMATS.map((format) =>
181
+ row(format, {
182
+ kind: 'image',
183
+ previewable: true,
184
+ importable: true,
185
+ runtimeReady: true,
186
+ placeable: false,
187
+ animated: false,
188
+ importStrategy: 'copy-project',
189
+ editor: 'environment',
190
+ }),
191
+ ),
192
+ ...AUDIO_FORMATS.map((format) =>
193
+ row(format, {
194
+ kind: 'audio',
195
+ previewable: true,
196
+ importable: true,
197
+ runtimeReady: true,
198
+ placeable: false,
199
+ animated: false,
200
+ importStrategy: 'copy-project',
201
+ editor: 'audio',
202
+ }),
203
+ ),
204
+ ...VIDEO_FORMATS.map((format) =>
205
+ row(format, {
206
+ kind: 'video',
207
+ previewable: true,
208
+ importable: true,
209
+ runtimeReady: false,
210
+ placeable: false,
211
+ animated: true,
212
+ importStrategy: 'copy-project',
213
+ editor: 'video',
214
+ }),
215
+ ),
216
+ ...COLOR_GRADE_FORMATS.map((format) =>
217
+ row(format, {
218
+ kind: 'source',
219
+ previewable: true,
220
+ importable: true,
221
+ runtimeReady: true,
222
+ placeable: false,
223
+ animated: false,
224
+ importStrategy: 'copy-project',
225
+ editor: 'source',
226
+ }),
227
+ ),
228
+ ...SHADER_SOURCE_FORMATS.map((format) =>
229
+ row(format, {
230
+ kind: 'source',
231
+ previewable: true,
232
+ importable: true,
233
+ runtimeReady: true,
234
+ placeable: false,
235
+ animated: false,
236
+ importStrategy: 'copy-project',
237
+ editor: 'source',
238
+ }),
239
+ ),
240
+ ...TEXT_SOURCE_FORMATS.map((format) =>
241
+ row(format, {
242
+ kind: 'source',
243
+ previewable: true,
244
+ importable: true,
245
+ runtimeReady: false,
246
+ placeable: false,
247
+ animated: false,
248
+ importStrategy: 'copy-project',
249
+ editor: 'source',
250
+ }),
251
+ ),
252
+ row('inputmap.json', {
253
+ kind: 'json',
254
+ previewable: true,
255
+ importable: true,
256
+ runtimeReady: true,
257
+ placeable: false,
258
+ animated: false,
259
+ importStrategy: 'copy-project',
260
+ editor: 'data',
261
+ }),
262
+ row('data.json', {
263
+ kind: 'json',
264
+ previewable: true,
265
+ importable: true,
266
+ runtimeReady: true,
267
+ placeable: false,
268
+ animated: false,
269
+ importStrategy: 'copy-project',
270
+ editor: 'data',
271
+ }),
272
+ row('json', {
273
+ kind: 'json',
274
+ previewable: true,
275
+ importable: true,
276
+ runtimeReady: false,
277
+ placeable: false,
278
+ animated: false,
279
+ importStrategy: 'copy-project',
280
+ editor: 'data',
281
+ }),
282
+ ]);
283
+
284
+ const UNKNOWN_CAPABILITIES: AssetCapabilities = {
285
+ format: 'unknown',
286
+ kind: 'unknown',
287
+ previewable: false,
288
+ importable: false,
289
+ runtimeReady: false,
290
+ placeable: false,
291
+ animated: false,
292
+ importStrategy: 'unsupported',
293
+ editor: 'none',
294
+ };
295
+
296
+ export function assetFormatFromPath(path: string): AssetFormat {
297
+ const clean = path.split(/[?#]/, 1)[0]!.toLowerCase();
298
+ for (const compound of ['inputmap.json', 'data.json'] as const) {
299
+ if (clean.endsWith(`.${compound}`)) return compound;
300
+ }
301
+ const dot = clean.lastIndexOf('.');
302
+ const extension = dot >= 0 ? clean.slice(dot + 1) : '';
303
+ return ASSET_CAPABILITY_REGISTRY.has(extension as AssetFormat)
304
+ ? (extension as AssetFormat)
305
+ : extension === 'json'
306
+ ? 'json'
307
+ : 'unknown';
308
+ }
309
+
310
+ export function assetCapabilities(pathOrFormat: string): AssetCapabilities {
311
+ const direct = ASSET_CAPABILITY_REGISTRY.get(pathOrFormat.toLowerCase() as AssetFormat);
312
+ if (direct) return direct;
313
+ return ASSET_CAPABILITY_REGISTRY.get(assetFormatFromPath(pathOrFormat)) ?? UNKNOWN_CAPABILITIES;
314
+ }
315
+
316
+ export function supportedAssetFormats(): readonly AssetFormat[] {
317
+ return [...ASSET_CAPABILITY_REGISTRY.keys()];
318
+ }
319
+
320
+ /** Editor document kind for a capability row; null means no honest editor exists. */
321
+ export function assetDocumentKind(
322
+ capability: AssetCapabilities,
323
+ ): 'model' | 'image' | 'video' | 'audio' | 'json' | 'source' | null {
324
+ switch (capability.editor) {
325
+ case 'model':
326
+ return 'model';
327
+ case 'image':
328
+ return 'image';
329
+ case 'environment':
330
+ // Workspace persistence needs only the broad asset kind. The path and
331
+ // capability registry recover the native HDR/EXR viewer on restore.
332
+ return 'image';
333
+ case 'video':
334
+ return 'video';
335
+ case 'audio':
336
+ return 'audio';
337
+ case 'data':
338
+ return 'json';
339
+ case 'source':
340
+ return 'source';
341
+ default:
342
+ return null;
343
+ }
344
+ }
@@ -0,0 +1,106 @@
1
+ import { connectEvents } from '../editor-api';
2
+ import type { AssetImportStage } from './import-contract';
3
+
4
+ export interface AssetImportJob {
5
+ id: string;
6
+ label: string;
7
+ stage: AssetImportStage;
8
+ loaded: number;
9
+ total: number;
10
+ status: 'running' | 'imported' | 'skipped' | 'failed' | 'cancelled';
11
+ message?: string;
12
+ controller: AbortController;
13
+ retry?: () => void;
14
+ }
15
+
16
+ const jobs = new Map<string, AssetImportJob>();
17
+ const listeners = new Set<() => void>();
18
+ let version = 0;
19
+ function notify(): void {
20
+ version++;
21
+ for (const listener of listeners) listener();
22
+ }
23
+ export function assetImportJobsVersion(): number {
24
+ return version;
25
+ }
26
+ export function subscribeAssetImportJobs(listener: () => void): () => void {
27
+ listeners.add(listener);
28
+ return () => {
29
+ listeners.delete(listener);
30
+ };
31
+ }
32
+ export function assetImportJobs(): readonly AssetImportJob[] {
33
+ return [...jobs.values()];
34
+ }
35
+
36
+ export function beginAssetImportJob(id: string, label: string): AssetImportJob {
37
+ const existing = jobs.get(id);
38
+ if (existing?.status === 'running') return existing;
39
+ const job: AssetImportJob = {
40
+ id,
41
+ label,
42
+ stage: 'fetch',
43
+ loaded: 0,
44
+ total: 0,
45
+ status: 'running',
46
+ controller: new AbortController(),
47
+ };
48
+ jobs.set(id, job);
49
+ notify();
50
+ return job;
51
+ }
52
+ export function updateAssetImportJob(
53
+ id: string,
54
+ patch: Partial<Omit<AssetImportJob, 'id' | 'controller'>>,
55
+ ): void {
56
+ const job = jobs.get(id);
57
+ if (!job) return;
58
+ Object.assign(job, patch);
59
+ notify();
60
+ }
61
+ export function cancelAssetImportJob(id: string): void {
62
+ const job = jobs.get(id);
63
+ if (!job || job.status !== 'running') return;
64
+ job.controller.abort(new DOMException('Import cancelled', 'AbortError'));
65
+ job.status = 'cancelled';
66
+ job.message = 'Cancelled before project commit.';
67
+ notify();
68
+ }
69
+ export function clearFinishedAssetImportJobs(): void {
70
+ for (const [id, job] of jobs) if (job.status !== 'running') jobs.delete(id);
71
+ notify();
72
+ }
73
+ export function resetAssetImportJobs(): void {
74
+ jobs.clear();
75
+ notify();
76
+ }
77
+
78
+ /** Keep jobs progressing independently of whether the Library document is mounted. */
79
+ export function connectAssetImportProgressEvents(): () => void {
80
+ const source = connectEvents();
81
+ const listener = (event: MessageEvent) => {
82
+ try {
83
+ const update = JSON.parse(event.data as string) as {
84
+ jobId?: string;
85
+ stage?: AssetImportStage;
86
+ loaded?: number;
87
+ total?: number;
88
+ message?: string;
89
+ };
90
+ if (!update.jobId || !update.stage) return;
91
+ updateAssetImportJob(update.jobId, {
92
+ stage: update.stage,
93
+ loaded: Math.max(0, update.loaded ?? 0),
94
+ total: Math.max(0, update.total ?? 0),
95
+ ...(update.message ? { message: update.message } : {}),
96
+ });
97
+ } catch {
98
+ // Optional progress cannot break a running import.
99
+ }
100
+ };
101
+ source.addEventListener('asset-import-progress', listener);
102
+ return () => {
103
+ source.removeEventListener('asset-import-progress', listener);
104
+ source.close();
105
+ };
106
+ }