@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,281 @@
1
+ import { themeVars } from '@volter/editor-sdk/widgets';
2
+ import { resolveUrl } from '@volter/editor-threejs/loader';
3
+ import { useEffect, useState } from 'react';
4
+ import { assetCapabilities } from '../../asset-workflow/asset-capabilities';
5
+ import { getCurrentProject } from '../../project-manager';
6
+ import {
7
+ projectModuleChangeMatches,
8
+ subscribeProjectModuleChange,
9
+ } from '../../project-module-changes';
10
+ import { AssetEditorShell } from '../AssetEditorShell';
11
+ import { CodeView, codeViewLanguage } from '../CodeView';
12
+ import { AudioViewer } from './AudioViewer';
13
+ import { EnvironmentAssetDocument } from './EnvironmentAssetDocument';
14
+ import { ImageViewer } from './ImageViewer';
15
+ import { JsonAssetDocument } from './JsonAssetDocument';
16
+ import { LiveModuleDocument } from './LiveModuleDocument';
17
+ import { LutAssetDocument } from './LutAssetDocument';
18
+ import { ModelAssetDocument } from './ModelAssetDocument';
19
+ import { ShaderAssetDocument } from './ShaderAssetDocument';
20
+
21
+ export type SourceAssetRoute =
22
+ | 'model'
23
+ | 'image'
24
+ | 'audio'
25
+ | 'json'
26
+ | 'environment'
27
+ | 'lut'
28
+ | 'shader'
29
+ | 'module'
30
+ | 'text'
31
+ | 'binary';
32
+
33
+ /**
34
+ * A project script the editor can EXECUTE, and therefore a candidate live
35
+ * model module (`LiveModuleDocument`). The bound is the dev server's own: only
36
+ * `src/**` scripts are classified, HMR-stamped and re-served on save
37
+ * (`server/project-hmr-files.ts`'s `classifyProjectHotUpdate` returns `ignore`
38
+ * for everything else), so a script outside `src/` could be imported once but
39
+ * never re-executed — a live document that silently stops being live. Whether
40
+ * such a module actually BUILDS an `Object3D` is decided by running it, never
41
+ * by its name.
42
+ */
43
+ function isProjectScriptPath(assetPath: string): boolean {
44
+ const clean = (assetPath.split(/[?#]/, 1)[0] ?? '').replace(/^\//, '');
45
+ return clean.startsWith('src/') && /\.(?:[cm]?[jt]sx?)$/.test(clean);
46
+ }
47
+
48
+ export function sourceAssetRoute(assetPath: string): SourceAssetRoute {
49
+ const capability = assetCapabilities(assetPath);
50
+ if (capability.editor === 'model') return 'model';
51
+ if (capability.editor === 'image') return 'image';
52
+ if (capability.editor === 'audio') return 'audio';
53
+ if (capability.editor === 'data') return 'json';
54
+ if (capability.editor === 'environment') return 'environment';
55
+ if (capability.format === 'cube') return 'lut';
56
+ if (capability.format === 'glsl' || capability.format === 'vert' || capability.format === 'frag')
57
+ return 'shader';
58
+ if (isProjectScriptPath(assetPath)) return 'module';
59
+ if (capability.editor === 'source' && capability.previewable) return 'text';
60
+ return 'binary';
61
+ }
62
+
63
+ /**
64
+ * THE FILE IS THE SUBJECT.
65
+ *
66
+ * A source/module document had no selection context of its own, and
67
+ * `waitForAssetDocumentInspector` waits for exactly that — so
68
+ * `editor.openAsset('/src/foo.ts', 'source')` opened the document, showed the
69
+ * code, and then sat until the relay's budget ran out and reported a
70
+ * `play-stall`: a timeout about the tab for a document that was already on
71
+ * screen. (The JSON route acked because `JsonAssetDocument` goes through
72
+ * `AssetEditorShell`.)
73
+ *
74
+ * There is no invented subject here and nothing new to publish: a source
75
+ * document's subject is the FILE, its identity row is the filename and the
76
+ * kind, and its note is the Info the shell already shows for every other
77
+ * asset — so it registers through the SAME holder every Asset Lab document
78
+ * uses (`AssetEditorShell` → `AssetEditorSubject`) rather than growing a
79
+ * second one.
80
+ */
81
+ function TextSourcePreview({
82
+ documentId,
83
+ assetPath,
84
+ active = true,
85
+ }: {
86
+ readonly documentId: string;
87
+ readonly assetPath: string;
88
+ readonly active?: boolean;
89
+ }) {
90
+ const [content, setContent] = useState<string | null>(null);
91
+ const [error, setError] = useState<string | null>(null);
92
+ const fileName = assetPath.split('/').pop() ?? assetPath;
93
+ useEffect(() => {
94
+ let cancelled = false;
95
+ setContent(null);
96
+ setError(null);
97
+ const path = assetPath.replace(/^\//, '');
98
+ let revision = 0;
99
+ async function read() {
100
+ const request = ++revision;
101
+ try {
102
+ const value = await fetch(resolveUrl(assetPath), { cache: 'no-store' }).then((response) => {
103
+ if (!response.ok) throw new Error(`HTTP ${response.status}`);
104
+ return response.text();
105
+ });
106
+ if (!cancelled && request === revision) {
107
+ setContent(value);
108
+ setError(null);
109
+ }
110
+ } catch (reason) {
111
+ if (!cancelled && request === revision)
112
+ setError(reason instanceof Error ? reason.message : String(reason));
113
+ }
114
+ }
115
+ const refresh = (changed: string) => {
116
+ if (projectModuleChangeMatches(changed, path)) void read();
117
+ };
118
+ const stop = subscribeProjectModuleChange(refresh);
119
+ void read();
120
+ return () => {
121
+ cancelled = true;
122
+ stop();
123
+ };
124
+ }, [assetPath]);
125
+ return (
126
+ <AssetEditorShell
127
+ documentId={documentId}
128
+ active={active}
129
+ type="source"
130
+ title={fileName}
131
+ sections={[]}
132
+ status={`source · ${assetPath}`}
133
+ fill
134
+ >
135
+ <div
136
+ style={{
137
+ padding: 12,
138
+ height: '100%',
139
+ minHeight: 0,
140
+ display: 'flex',
141
+ flexDirection: 'column',
142
+ gap: 8,
143
+ }}
144
+ >
145
+ <div
146
+ style={{
147
+ padding: 8,
148
+ // The well GROWS to the panel instead of stopping at a fixed
149
+ // budget: this document is a whole tab, and CodeView virtualizes,
150
+ // so there is nothing to buy by capping it. (It inherited a
151
+ // 560px ceiling from the small in-panel preview it was cut from,
152
+ // which left most of a full-tab source document empty.)
153
+ flex: 1,
154
+ minHeight: 0,
155
+ display: 'flex',
156
+ overflow: 'hidden',
157
+ background: themeVars.surface.inset,
158
+ border: `1px solid ${themeVars.boundary.default}`,
159
+ borderRadius: themeVars.shape.small,
160
+ }}
161
+ >
162
+ {error !== null || content === null ? (
163
+ <div
164
+ style={{
165
+ fontFamily: themeVars.typography.mono,
166
+ fontSize: 11,
167
+ lineHeight: 1.5,
168
+ color: error ? themeVars.semantic.danger : themeVars.content.muted,
169
+ padding: 4,
170
+ }}
171
+ >
172
+ {error ?? 'Loading…'}
173
+ </div>
174
+ ) : (
175
+ <CodeView
176
+ value={content}
177
+ followChanges
178
+ language={codeViewLanguage(assetPath)}
179
+ fontSize={11}
180
+ maxHeight="100%"
181
+ ariaLabel={`Source of ${assetPath}`}
182
+ />
183
+ )}
184
+ </div>
185
+ </div>
186
+ </AssetEditorShell>
187
+ );
188
+ }
189
+
190
+ /** Viewer for downloaded catalog source/animation files without a magic fallback. */
191
+ export function SourceAssetViewer({
192
+ documentId,
193
+ assetPath,
194
+ active = true,
195
+ }: {
196
+ documentId: string;
197
+ assetPath: string;
198
+ active?: boolean;
199
+ }) {
200
+ switch (sourceAssetRoute(assetPath)) {
201
+ case 'model':
202
+ return (
203
+ <ModelAssetDocument
204
+ documentId={documentId}
205
+ assetPath={assetPath}
206
+ displayName={assetPath.split('/').pop() ?? assetPath}
207
+ active={active}
208
+ />
209
+ );
210
+ case 'image':
211
+ return <ImageViewer assetPath={assetPath} />;
212
+ case 'audio':
213
+ return <AudioViewer assetPath={assetPath} />;
214
+ case 'json':
215
+ // Content-routed: a native three.quarks document opens as the particle
216
+ // editor, any other JSON keeps the generic viewer.
217
+ return (
218
+ <JsonAssetDocument
219
+ documentId={documentId}
220
+ assetPath={assetPath}
221
+ displayName={assetPath.split('/').pop() ?? assetPath}
222
+ active={active}
223
+ sections={[]}
224
+ status={`json · ${assetPath}`}
225
+ />
226
+ );
227
+ case 'environment':
228
+ return (
229
+ <EnvironmentAssetDocument documentId={documentId} assetPath={assetPath} active={active} />
230
+ );
231
+ case 'lut':
232
+ return <LutAssetDocument documentId={documentId} assetPath={assetPath} active={active} />;
233
+ case 'shader':
234
+ return <ShaderAssetDocument documentId={documentId} assetPath={assetPath} active={active} />;
235
+ case 'module': {
236
+ // Content-routed, like the quarks JSON above: a project script that
237
+ // BUILDS an Object3D opens as the live modeling document; anything else
238
+ // keeps this viewer's text preview.
239
+ const projectRoot = getCurrentProject()?.rootPath;
240
+ const preview = (
241
+ <TextSourcePreview documentId={documentId} assetPath={assetPath} active={active} />
242
+ );
243
+ if (!projectRoot) return preview;
244
+ return (
245
+ <LiveModuleDocument
246
+ documentId={documentId}
247
+ projectRoot={projectRoot}
248
+ modulePath={(assetPath.split(/[?#]/, 1)[0] ?? assetPath).replace(/^\//, '')}
249
+ displayName={assetPath.split('/').pop() ?? assetPath}
250
+ active={active}
251
+ fallback={preview}
252
+ />
253
+ );
254
+ }
255
+ case 'text':
256
+ return <TextSourcePreview documentId={documentId} assetPath={assetPath} active={active} />;
257
+ case 'binary':
258
+ // Same subject rule as the text route above — the FILE. A document that
259
+ // publishes nothing is a document `editor.openAsset` can only time out
260
+ // against, and "no renderer" is not "no identity".
261
+ return (
262
+ <AssetEditorShell
263
+ documentId={documentId}
264
+ active={active}
265
+ type="binary source"
266
+ title={assetPath.split('/').pop() ?? assetPath}
267
+ sections={[]}
268
+ status={`binary · ${assetPath}`}
269
+ >
270
+ <div style={{ padding: 16, color: themeVars.content.muted, fontSize: 12 }}>
271
+ <div style={{ color: themeVars.content.primary, fontWeight: 600, marginBottom: 6 }}>
272
+ {assetPath.split('/').pop()}
273
+ </div>
274
+ This binary source is available in the project, but it has no safe in-editor renderer.
275
+ Its file remains selectable and referenceable without being misidentified as another
276
+ format.
277
+ </div>
278
+ </AssetEditorShell>
279
+ );
280
+ }
281
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * One sprite from a packed atlas — Aseprite's cel / Unity's Sprite /
3
+ * Godot's AtlasTexture. The sheet is the source texture; this paints the
4
+ * named frame onto the untrimmed canvas at nearest-neighbor.
5
+ */
6
+ import { useEffect, useRef } from 'react';
7
+ import { integerFitScale } from '../../asset-workflow/image-view-scale';
8
+ import { type PixiSpritesheetFrame, packedFrameRect } from '../../asset-workflow/pixi-spritesheet';
9
+
10
+ export function paintSpriteFrame(
11
+ canvas: HTMLCanvasElement,
12
+ image: CanvasImageSource,
13
+ frame: PixiSpritesheetFrame,
14
+ ): void {
15
+ const destWidth = Math.max(1, frame.sourceWidth ?? frame.width);
16
+ const destHeight = Math.max(1, frame.sourceHeight ?? frame.height);
17
+ canvas.width = destWidth;
18
+ canvas.height = destHeight;
19
+ const context = canvas.getContext('2d');
20
+ if (!context) return;
21
+ context.imageSmoothingEnabled = false;
22
+ context.clearRect(0, 0, destWidth, destHeight);
23
+ const packed = packedFrameRect(frame);
24
+ if (frame.rotated) {
25
+ context.save();
26
+ context.translate(frame.trimX, frame.trimY + packed.width);
27
+ context.rotate(-Math.PI / 2);
28
+ context.drawImage(
29
+ image,
30
+ packed.x,
31
+ packed.y,
32
+ packed.width,
33
+ packed.height,
34
+ 0,
35
+ 0,
36
+ packed.width,
37
+ packed.height,
38
+ );
39
+ context.restore();
40
+ return;
41
+ }
42
+ context.drawImage(
43
+ image,
44
+ packed.x,
45
+ packed.y,
46
+ packed.width,
47
+ packed.height,
48
+ frame.trimX,
49
+ frame.trimY,
50
+ packed.width,
51
+ packed.height,
52
+ );
53
+ }
54
+
55
+ export function SpritesheetSpriteView({
56
+ sheetUrl,
57
+ frame,
58
+ scale,
59
+ maxEdge,
60
+ }: {
61
+ sheetUrl: string;
62
+ frame: PixiSpritesheetFrame;
63
+ scale?: number;
64
+ maxEdge?: number;
65
+ }) {
66
+ const canvasRef = useRef<HTMLCanvasElement>(null);
67
+ const destWidth = Math.max(1, frame.sourceWidth ?? frame.width);
68
+ const destHeight = Math.max(1, frame.sourceHeight ?? frame.height);
69
+ const resolved =
70
+ maxEdge != null ? integerFitScale(destWidth, destHeight, maxEdge, maxEdge) : (scale ?? 1);
71
+ const displayWidth = Math.max(1, Math.round(destWidth * resolved));
72
+ const displayHeight = Math.max(1, Math.round(destHeight * resolved));
73
+
74
+ useEffect(() => {
75
+ const canvas = canvasRef.current;
76
+ if (!canvas) return;
77
+ const image = new Image();
78
+ let cancelled = false;
79
+ image.onload = () => {
80
+ if (!cancelled) paintSpriteFrame(canvas, image, frame);
81
+ };
82
+ image.src = sheetUrl;
83
+ return () => {
84
+ cancelled = true;
85
+ };
86
+ }, [frame, sheetUrl]);
87
+
88
+ return (
89
+ <canvas
90
+ ref={canvasRef}
91
+ width={destWidth}
92
+ height={destHeight}
93
+ aria-hidden
94
+ style={{
95
+ width: displayWidth,
96
+ height: displayHeight,
97
+ imageRendering: 'pixelated',
98
+ display: 'block',
99
+ }}
100
+ />
101
+ );
102
+ }
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Video Asset Lab document: the clip itself, with the browser's own controls.
3
+ *
4
+ * Deliberately no custom transport, no autoplay and no muting — a reference
5
+ * clip is watched, and `<video controls>` is already the control surface every
6
+ * person on this machine knows. The bytes come from the session, which serves
7
+ * the project's own files.
8
+ */
9
+
10
+ import { Text, text } from '@volter/editor-sdk/widgets';
11
+ import { useCallback, useEffect, useState } from 'react';
12
+
13
+ export function VideoViewer({ assetPath }: { assetPath: string }) {
14
+ const [failed, setFailed] = useState(false);
15
+ const [size, setSize] = useState<{ w: number; h: number } | null>(null);
16
+ const source = assetPath;
17
+ useEffect(() => {
18
+ setFailed(false);
19
+ }, [source]);
20
+ const name = assetPath.split('/').pop() ?? assetPath;
21
+ const measure = useCallback((element: HTMLVideoElement | null) => {
22
+ if (!element) return;
23
+ if (element.error) {
24
+ setFailed(true);
25
+ return;
26
+ }
27
+ if (element.videoWidth <= 0) return;
28
+ setSize((current) =>
29
+ current && current.w === element.videoWidth && current.h === element.videoHeight
30
+ ? current
31
+ : { w: element.videoWidth, h: element.videoHeight },
32
+ );
33
+ }, []);
34
+
35
+ return (
36
+ <div
37
+ data-testid="video-asset-document"
38
+ style={{
39
+ height: '100%',
40
+ minHeight: 240,
41
+ display: 'flex',
42
+ flexDirection: 'column',
43
+ minWidth: 0,
44
+ }}
45
+ >
46
+ <div style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '6px 8px' }}>
47
+ <Text tone="dim" variant="label">
48
+ {name}
49
+ </Text>
50
+ {size && (
51
+ <Text tone="muted" variant="code">
52
+ {size.w} × {size.h}
53
+ </Text>
54
+ )}
55
+ </div>
56
+ <div
57
+ className="vgai-asset-transparency-well"
58
+ style={{
59
+ flex: 1,
60
+ minHeight: 0,
61
+ display: 'flex',
62
+ alignItems: 'center',
63
+ justifyContent: 'center',
64
+ padding: 12,
65
+ }}
66
+ >
67
+ {failed ? (
68
+ <div style={{ color: text[2], fontSize: 12, textAlign: 'center' }}>
69
+ {name} could not be played from {source}. The file may be missing, or its codec may not
70
+ be one this browser decodes.
71
+ </div>
72
+ ) : (
73
+ <video
74
+ key={source}
75
+ src={source}
76
+ controls
77
+ playsInline
78
+ preload="metadata"
79
+ // MEASURED, not just listened for: a clip whose metadata is already
80
+ // decoded when React attaches (a cached file, a reopened document)
81
+ // fires `loadedmetadata` BEFORE the listener exists, and the header
82
+ // then reported no dimensions over a video the layout had already
83
+ // sized from real ones. The ref reads the element's own state on
84
+ // attach; the event covers everything that arrives later.
85
+ //
86
+ // `measure` is STABLE and its write is a no-change guard, both for
87
+ // the same reason: an inline ref is a new function every render, so
88
+ // React detaches and re-runs it every render, and a `setSize` that
89
+ // writes a fresh object each time is then an infinite update loop.
90
+ // Measured here — it took the editor's chrome down with
91
+ // "Maximum update depth exceeded".
92
+ ref={measure}
93
+ onError={() => setFailed(true)}
94
+ onLoadedMetadata={(event) => measure(event.currentTarget)}
95
+ style={{ maxWidth: '100%', maxHeight: '100%', display: 'block' }}
96
+ />
97
+ )}
98
+ </div>
99
+ </div>
100
+ );
101
+ }
@@ -0,0 +1,144 @@
1
+ /** Native GLSL document helpers. GLSL remains the artifact; these functions
2
+ * only describe it for Asset Lab and never serialize a VGAI shader shape. */
3
+
4
+ export type ShaderStage = 'vertex' | 'fragment';
5
+
6
+ export interface ShaderUniformDescriptor {
7
+ readonly name: string;
8
+ readonly type: string;
9
+ readonly arraySize?: number | undefined;
10
+ readonly stages: readonly ShaderStage[];
11
+ }
12
+
13
+ export interface ShaderDiagnostic {
14
+ readonly stage: ShaderStage | 'program';
15
+ readonly severity: 'error' | 'warning';
16
+ readonly message: string;
17
+ readonly line?: number | undefined;
18
+ readonly column?: number | undefined;
19
+ }
20
+
21
+ const VERTEX_SUFFIXES = ['.vert', '.vert.glsl'] as const;
22
+ const FRAGMENT_SUFFIXES = ['.frag', '.frag.glsl'] as const;
23
+
24
+ function cleanPath(path: string): string {
25
+ return path.split(/[?#]/, 1)[0]!.toLowerCase();
26
+ }
27
+
28
+ export function shaderStageFromPath(path: string, source = ''): ShaderStage {
29
+ const clean = cleanPath(path);
30
+ if (VERTEX_SUFFIXES.some((suffix) => clean.endsWith(suffix))) return 'vertex';
31
+ if (FRAGMENT_SUFFIXES.some((suffix) => clean.endsWith(suffix))) return 'fragment';
32
+ return /\bgl_Position\b/.test(source) ? 'vertex' : 'fragment';
33
+ }
34
+
35
+ /** Conventional sibling only. A standalone `.glsl` file stays standalone. */
36
+ export function shaderCompanionPath(path: string): string | null {
37
+ const clean = path.split(/[?#]/, 1)[0]!;
38
+ if (/\.vert\.glsl$/i.test(clean)) return clean.replace(/\.vert\.glsl$/i, '.frag.glsl');
39
+ if (/\.frag\.glsl$/i.test(clean)) return clean.replace(/\.frag\.glsl$/i, '.vert.glsl');
40
+ if (/\.vert$/i.test(clean)) return clean.replace(/\.vert$/i, '.frag');
41
+ if (/\.frag$/i.test(clean)) return clean.replace(/\.frag$/i, '.vert');
42
+ return null;
43
+ }
44
+
45
+ function withoutComments(source: string): string {
46
+ // Preserve newlines so reflection never perturbs source-line diagnostics.
47
+ return source
48
+ .replace(/\/\*[\s\S]*?\*\//g, (comment) => comment.replace(/[^\n]/g, ' '))
49
+ .replace(/\/\/[^\n]*/g, '');
50
+ }
51
+
52
+ function declarations(source: string, stage: ShaderStage): ShaderUniformDescriptor[] {
53
+ const result: ShaderUniformDescriptor[] = [];
54
+ const pattern =
55
+ /\buniform\s+(?:(?:lowp|mediump|highp)\s+)?([A-Za-z_]\w*)\s+([A-Za-z_]\w*)\s*(?:\[\s*(\d+)\s*\])?\s*;/g;
56
+ for (const match of withoutComments(source).matchAll(pattern)) {
57
+ const type = match[1];
58
+ const name = match[2];
59
+ if (!type || !name) continue;
60
+ const arraySize = match[3] ? Number.parseInt(match[3], 10) : undefined;
61
+ result.push({ name, type, ...(arraySize ? { arraySize } : {}), stages: [stage] });
62
+ }
63
+ return result;
64
+ }
65
+
66
+ export function reflectShaderUniforms(
67
+ vertexSource: string,
68
+ fragmentSource: string,
69
+ ): ShaderUniformDescriptor[] {
70
+ const reflected = new Map<string, ShaderUniformDescriptor>();
71
+ for (const uniform of [
72
+ ...declarations(vertexSource, 'vertex'),
73
+ ...declarations(fragmentSource, 'fragment'),
74
+ ]) {
75
+ const current = reflected.get(uniform.name);
76
+ if (!current) {
77
+ reflected.set(uniform.name, uniform);
78
+ continue;
79
+ }
80
+ reflected.set(uniform.name, {
81
+ ...current,
82
+ stages: [...new Set([...current.stages, ...uniform.stages])],
83
+ });
84
+ }
85
+ return [...reflected.values()];
86
+ }
87
+
88
+ export function parseShaderDiagnostics(
89
+ log: string,
90
+ stage: ShaderDiagnostic['stage'],
91
+ ): ShaderDiagnostic[] {
92
+ const diagnostics = log
93
+ .split('\n')
94
+ .map((line) => parseDiagnosticLine(line.trim(), stage))
95
+ .filter((diagnostic): diagnostic is ShaderDiagnostic => diagnostic !== null);
96
+ if (diagnostics.length === 0 && log.trim()) {
97
+ diagnostics.push({ stage, severity: 'error', message: log.trim() });
98
+ }
99
+ return diagnostics;
100
+ }
101
+
102
+ function parseDiagnosticLine(
103
+ text: string,
104
+ stage: ShaderDiagnostic['stage'],
105
+ ): ShaderDiagnostic | null {
106
+ if (!text) return null;
107
+ const colon = text.match(/^(ERROR|WARNING):\s*\d+:(\d+)(?::|\((\d+)\):)\s*(.*)$/i);
108
+ if (colon) {
109
+ return {
110
+ stage,
111
+ severity: colon[1]!.toLowerCase() === 'warning' ? 'warning' : 'error',
112
+ line: Number.parseInt(colon[2]!, 10),
113
+ ...(colon[3] ? { column: Number.parseInt(colon[3], 10) } : {}),
114
+ message: colon[4] || text,
115
+ };
116
+ }
117
+ const paren = text.match(/^\d+:(\d+)\((\d+)\):\s*(?:(error|warning)\s*:?)?\s*(.*)$/i);
118
+ if (!paren) return null;
119
+ return {
120
+ stage,
121
+ severity: paren[3]?.toLowerCase() === 'warning' ? 'warning' : 'error',
122
+ line: Number.parseInt(paren[1]!, 10),
123
+ column: Number.parseInt(paren[2]!, 10),
124
+ message: paren[4] || text,
125
+ };
126
+ }
127
+
128
+ /** Reset driver-reported lines after Three's injected ShaderMaterial prefix. */
129
+ export function previewShaderSource(source: string): string {
130
+ return `#line 1\n${source}`;
131
+ }
132
+
133
+ export const FALLBACK_VERTEX_SHADER = `varying vec2 vUv;
134
+
135
+ void main() {
136
+ vUv = uv;
137
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
138
+ }`;
139
+
140
+ export const FALLBACK_FRAGMENT_SHADER = `varying vec2 vUv;
141
+
142
+ void main() {
143
+ gl_FragColor = vec4(vUv, 0.55, 1.0);
144
+ }`;