@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,202 @@
1
+ /**
2
+ * Theme-backed renderer selection ink shared by the native Three and Pixi
3
+ * views. CSS can consume `var(--vgai-accent)` directly; WebGL cannot, so this
4
+ * module resolves the inherited token to the integer both renderers speak.
5
+ */
6
+
7
+ import { EDITOR_THEME_CLASS, graphiteDarkEditorTheme } from '@volter/editor-sdk/widgets';
8
+
9
+ /** Import/SSR fallback: Graphite Dark's canonical blue accent. */
10
+ export const DEFAULT_NATIVE_SELECTION_COLOR = 0x579eff;
11
+
12
+ export interface NativeSelectionColors {
13
+ readonly visible: number;
14
+ readonly hidden: number;
15
+ }
16
+
17
+ function rgbHex(red: number, green: number, blue: number): number {
18
+ return (red << 16) | (green << 8) | blue;
19
+ }
20
+
21
+ function parseNormalizedColor(value: string): number | null {
22
+ const hex = /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.exec(value.trim())?.[1];
23
+ if (hex) {
24
+ const opaque = hex.length === 3 ? [...hex].map((digit) => `${digit}${digit}`).join('') : hex;
25
+ return Number.parseInt(opaque.slice(0, 6), 16);
26
+ }
27
+ const rgb =
28
+ /^rgba?\(\s*(\d+(?:\.\d+)?)\s*(?:,\s*|\s+)(\d+(?:\.\d+)?)\s*(?:,\s*|\s+)(\d+(?:\.\d+)?)/i.exec(
29
+ value.trim(),
30
+ );
31
+ if (!rgb) return null;
32
+ const channels = rgb.slice(1, 4).map((channel) => Math.round(Number(channel)));
33
+ if (channels.some((channel) => channel < 0 || channel > 255)) return null;
34
+ return rgbHex(channels[0]!, channels[1]!, channels[2]!);
35
+ }
36
+
37
+ /** Normalize any browser-valid CSS color (custom palettes may use HSL/names). */
38
+ function parseCssColor(value: string): number | null {
39
+ const direct = parseNormalizedColor(value);
40
+ if (direct !== null || typeof document === 'undefined') return direct;
41
+ if (typeof CSS !== 'undefined' && !CSS.supports('color', value)) return null;
42
+ const context = document.createElement('canvas').getContext('2d');
43
+ if (!context) return null;
44
+ context.fillStyle = '#010203';
45
+ context.fillStyle = value;
46
+ return parseNormalizedColor(String(context.fillStyle));
47
+ }
48
+
49
+ function themeRoot(element?: Element | null): Element | null {
50
+ if (typeof document === 'undefined') return null;
51
+ return (
52
+ element?.closest(`.${EDITOR_THEME_CLASS}`) ?? document.querySelector(`.${EDITOR_THEME_CLASS}`)
53
+ );
54
+ }
55
+
56
+ function dimColor(color: number): number {
57
+ const red = Math.round(((color >> 16) & 0xff) * 0.42);
58
+ const green = Math.round(((color >> 8) & 0xff) * 0.42);
59
+ const blue = Math.round((color & 0xff) * 0.42);
60
+ return rgbHex(red, green, blue);
61
+ }
62
+
63
+ /** Current palette accent, with a same-hue dim variant for occluded 3D edges. */
64
+ function themeToken(root: Element | null, name: string): string {
65
+ return root && typeof getComputedStyle !== 'undefined'
66
+ ? getComputedStyle(root).getPropertyValue(name).trim()
67
+ : '';
68
+ }
69
+
70
+ /** The palette's selection colour: its viewport group's when it carries one
71
+ * (Blender's orange), the accent otherwise. */
72
+ export function nativeSelectionColors(element?: Element | null): NativeSelectionColors {
73
+ const root = themeRoot(element);
74
+ const raw = themeToken(root, '--vgai-viewport-selection') || themeToken(root, '--vgai-accent');
75
+ const visible =
76
+ parseCssColor(raw || graphiteDarkEditorTheme.color.accent.default) ??
77
+ DEFAULT_NATIVE_SELECTION_COLOR;
78
+ return { visible, hidden: dimColor(visible) };
79
+ }
80
+
81
+ /** The palette's VIEWPORT GROUP (`EditorTheme.color.viewport`), each member
82
+ * `null` when the palette carries none — the viewport keeps its own then. */
83
+ export interface NativeViewportLook {
84
+ readonly background: number | null;
85
+ readonly grid: number | null;
86
+ readonly axisX: number | null;
87
+ readonly axisY: number | null;
88
+ readonly active: number | null;
89
+ }
90
+
91
+ /**
92
+ * Whether the ACTIVE LOOK declares a `color.viewport` group at all — the
93
+ * question "is the backdrop the look's, or the editor's own?"
94
+ * (ARCHITECTURE-CORE §A model is data: a data subject opens in an isolation
95
+ * scene whose story is the studio, and the studio's backdrop is the editor's;
96
+ * a look that paints the viewport itself — Blender's flat grey — has already
97
+ * answered, and the studio must not paint over it).
98
+ *
99
+ * `background` alone is the whole test because the group is ALL-OR-NOTHING:
100
+ * `EditorTheme.color.viewport` makes every member required, and a palette
101
+ * DOCUMENT that carries a partial group is rejected by name at parse
102
+ * (`theme-library.ts`'s viewport reconstruction). So the group is present
103
+ * exactly when this token paints.
104
+ */
105
+ export function lookDeclaresViewportColors(element?: Element | null): boolean {
106
+ return nativeViewportLook(element).background !== null;
107
+ }
108
+
109
+ export function nativeViewportLook(element?: Element | null): NativeViewportLook {
110
+ const root = themeRoot(element);
111
+ const read = (name: string): number | null => {
112
+ const raw = themeToken(root, name);
113
+ return raw ? parseCssColor(raw) : null;
114
+ };
115
+ return {
116
+ background: read('--vgai-viewport-background'),
117
+ grid: read('--vgai-viewport-grid'),
118
+ axisX: read('--vgai-viewport-axis-x'),
119
+ axisY: read('--vgai-viewport-axis-y'),
120
+ active: read('--vgai-viewport-active'),
121
+ };
122
+ }
123
+
124
+ /**
125
+ * THE LOOK'S TRANSFORM-GIZMO SIZE, in px per gizmo unit
126
+ * (`EditorTheme.density.viewport.gizmoSize`), or `null` when the look names
127
+ * none — which is every look but Blender's, and means "keep three's own
128
+ * viewport-relative handle".
129
+ *
130
+ * Read off the emitted token for the same reason the colours above are: WebGL
131
+ * cannot consume a CSS variable, and the theme object reaching the viewport
132
+ * would be a second source for a value the stylesheet already carries.
133
+ * `editor-viewport.ts` is the one caller and it says what it does with the
134
+ * number; nothing here knows about three's units.
135
+ */
136
+ export function nativeViewportGizmoSize(element?: Element | null): number | null {
137
+ const raw = themeToken(themeRoot(element), '--vgai-viewport-gizmo-size');
138
+ if (!raw) return null;
139
+ const value = Number.parseFloat(raw);
140
+ return Number.isFinite(value) && value > 0 ? value : null;
141
+ }
142
+
143
+ /**
144
+ * WHICH TOOL THE LOOK'S SHELF OPENS ON
145
+ * (`EditorTheme.density.viewport.shelfTool`), or `null` when the look names
146
+ * none — which is every look but Blender's, and means the editor's own
147
+ * combined gizmo.
148
+ *
149
+ * It rides the THEME rather than the chrome regions, and that is measured
150
+ * rather than stylistic: a region crosses the Code-OSS frame's configuration
151
+ * service, which knows only the key list its generated contribution carries
152
+ * and drops anything newer until the next release is cut
153
+ * (`workspace-regions.ts`'s own note). A theme token is installed on the theme
154
+ * root by the page, so a look can add a value and use it in the same session.
155
+ */
156
+ export function nativeViewportShelfTool(element?: Element | null): 'select' | 'transform' | null {
157
+ const raw = themeToken(themeRoot(element), '--vgai-viewport-shelf-tool');
158
+ return raw === 'select' || raw === 'transform' ? raw : null;
159
+ }
160
+
161
+ /**
162
+ * WHICH AXIS THE LOOK SAYS IS UP in the world its stage presents
163
+ * (`EditorTheme.density.viewport.upAxis`), or `null` when it names none —
164
+ * which is every look but Blender's, and means three's own frame.
165
+ *
166
+ * Read off the emitted token for the same reason the two above are: WebGL
167
+ * consumes no CSS variable, and a second path from the theme object into the
168
+ * viewport would be a second source for one value. What `'z'` means in three's
169
+ * units — which handle carries which axis's colour, which side its arm is
170
+ * drawn on, and what the six navigation balls are called — is
171
+ * `editor-viewport.ts`'s to know, and it says so there.
172
+ */
173
+ export function nativeViewportUpAxis(element?: Element | null): 'y' | 'z' | null {
174
+ const raw = themeToken(themeRoot(element), '--vgai-viewport-up-axis');
175
+ return raw === 'y' || raw === 'z' ? raw : null;
176
+ }
177
+
178
+ /** WHAT A BOX SELECT MEANS in the look's stage
179
+ * (`EditorTheme.density.viewport.boxSelect`), or `null` for the editor's own
180
+ * `contain`. Blender's Select Box is `touch`; see the field's own note for
181
+ * why neither can be the other's default. */
182
+ export function nativeViewportBoxSelect(element?: Element | null): 'contain' | 'touch' | null {
183
+ const raw = themeToken(themeRoot(element), '--vgai-viewport-box-select');
184
+ return raw === 'contain' || raw === 'touch' ? raw : null;
185
+ }
186
+
187
+ /**
188
+ * Observe the one theme root's inline token update. This includes saved theme
189
+ * changes and unsaved Theme Manager previews; neither renderer has to poll
190
+ * `getComputedStyle` on every frame.
191
+ */
192
+ export function subscribeNativeSelectionTheme(
193
+ element: Element | null | undefined,
194
+ listener: () => void,
195
+ ): () => void {
196
+ listener();
197
+ const root = themeRoot(element);
198
+ if (!root || typeof MutationObserver === 'undefined') return () => {};
199
+ const observer = new MutationObserver(listener);
200
+ observer.observe(root, { attributes: true, attributeFilter: ['style'] });
201
+ return () => observer.disconnect();
202
+ }
@@ -0,0 +1,137 @@
1
+ /**
2
+ * WHAT THE ASSET LAB 3D DOCUMENT ASKS THE SHELL — the one collaborator
3
+ * `StageHost.tsx` (with its toolbar) declares and the shell
4
+ * installs at boot.
5
+ *
6
+ * ARCHITECTURE-CORE §Editor chrome, "The viewport stack is separable": a
7
+ * surface below the shell never imports the shell's transport, a world
8
+ * authoring adapter, or project discovery. The 3D document was importing four
9
+ * modules to answer three questions —
10
+ *
11
+ * · where do this document's own bytes go? (`object3d-document-persistence`
12
+ * → project file history → the resource history backend)
13
+ * · how do I replace a whole SOURCE file? (`ui-source/tier-source-write-backend`
14
+ * for the tier's recorder + `history/source-history-backend` to run it)
15
+ * · where does a thumbnail framing get recorded? (`asset-workflow/thumbnail-system`
16
+ * to read `.vgai/thumbnails.json` + `components/asset-editor-persistence`
17
+ * to write it, which reaches `editor-api.ts`)
18
+ *
19
+ * — and every one of those is TRANSPORT. Measured, those edges were 72 of the
20
+ * document's 213 files, all of them behind the server SDK barrel; the document
21
+ * itself only ever needed "hand these bytes to the project and tell me whether
22
+ * one moved".
23
+ *
24
+ * ## The default is the NO-SHELL answer, and it is deliberate
25
+ *
26
+ * {@link DEFAULT_OBJECT3D_DOCUMENT_WRITE_POLICY} is what a document mounted
27
+ * with no shell above it (a bounded host; a fixture) gets: there is no
28
+ * project to write to, so each member REFUSES by name rather than
29
+ * half-answering. Every call site here already renders a refusal — the
30
+ * document's error state, the toolbar's error banner — because the same
31
+ * refusal is what a read-only tier produced before this seam existed
32
+ * ("This editor tier cannot write project source").
33
+ *
34
+ * In the editor the shell policy is installed once by `EditorProvider`
35
+ * (`EditorContext.tsx`), beside the viewport policy and before any document
36
+ * mounts, so today's behaviour is unchanged.
37
+ */
38
+
39
+ import type {
40
+ Object3DDocumentPersistenceSession,
41
+ OpenObject3DDocumentPersistenceOptions,
42
+ } from './authoring/object3d-document-persistence';
43
+ import type { HistoryService } from './history/history-service';
44
+
45
+ /** Re-exported from its declaration site so a consumer of this seam does not
46
+ * import the persistence module (which reaches project file history) for a
47
+ * type. `import type` is erased, so this costs the closure nothing. */
48
+ export type { Object3DDocumentPersistenceSession } from './authoring/object3d-document-persistence';
49
+
50
+ /** A whole-file SOURCE replacement — the document's animation binding and its
51
+ * single-module documents both write this way. */
52
+ export interface Object3DDocumentSourceReplacement {
53
+ readonly file: string;
54
+ readonly source: string;
55
+ readonly label: string;
56
+ }
57
+
58
+ /** The camera framing `.vgai/thumbnails.json` records for one asset.
59
+ * `undefined` is the RESET — remove this asset's framing. */
60
+ export interface Object3DDocumentThumbnailFraming {
61
+ readonly position: [number, number, number];
62
+ readonly target: [number, number, number];
63
+ readonly fov?: number;
64
+ }
65
+
66
+ export interface Object3DDocumentWritePolicy {
67
+ /**
68
+ * Open the persistence baseline for a document that declares a binding.
69
+ * The session owns transaction ordering, checksum preflight and canonical
70
+ * undo/redo; the document only calls `commit`.
71
+ */
72
+ openPersistence(
73
+ options: OpenObject3DDocumentPersistenceOptions,
74
+ ): Promise<Object3DDocumentPersistenceSession>;
75
+ /**
76
+ * Replace a whole source file through the tier's recorder, in `history`.
77
+ * Resolves to whether a byte actually moved. The HISTORY lookup stays with
78
+ * the document (it holds the session's service already, and its two call
79
+ * sites word an absent one differently); what the shell owns here is the
80
+ * WRITE BACKEND — the thing a read-only tier does not have.
81
+ */
82
+ replaceSource(
83
+ history: HistoryService,
84
+ request: Object3DDocumentSourceReplacement,
85
+ ): Promise<boolean>;
86
+ /**
87
+ * Record (or clear, with `undefined`) this asset's thumbnail framing in the
88
+ * project's thumbnail manifest. Refuses loudly rather than rebuilding a
89
+ * manifest it could not read.
90
+ */
91
+ saveThumbnailFraming(
92
+ assetPath: string,
93
+ framing: Object3DDocumentThumbnailFraming | undefined,
94
+ ): Promise<void>;
95
+ }
96
+
97
+ /** The one refusal, worded for the member that raised it. Rejected rather than
98
+ * thrown so every member answers the same way; each call site is already
99
+ * inside the `await` of a try/catch that renders the message. */
100
+ function refuse<T>(what: string): Promise<T> {
101
+ return Promise.reject(new Error(`This editor tier cannot ${what}.`));
102
+ }
103
+
104
+ export const DEFAULT_OBJECT3D_DOCUMENT_WRITE_POLICY: Object3DDocumentWritePolicy = {
105
+ openPersistence: () => refuse('persist Asset Lab documents'),
106
+ // The exact wording a read-only tier produced when the document asked the
107
+ // tier recorder for a source-write backend and got none.
108
+ replaceSource: () => refuse('write project source'),
109
+ saveThumbnailFraming: () => refuse('write project thumbnail framing'),
110
+ };
111
+
112
+ let _policy: Object3DDocumentWritePolicy = DEFAULT_OBJECT3D_DOCUMENT_WRITE_POLICY;
113
+
114
+ /**
115
+ * Install the shell's composition. One owner, same rule as
116
+ * `installViewportAuthoringPolicy` and the store's `attachHistory`:
117
+ * re-installing the SAME policy is a no-op (React strict-mode double-invokes
118
+ * the provider body), a DIFFERENT one throws rather than letting two shells
119
+ * disagree about where a document's bytes go.
120
+ */
121
+ export function installObject3DDocumentWritePolicy(policy: Object3DDocumentWritePolicy): void {
122
+ if (_policy === policy) return;
123
+ if (_policy !== DEFAULT_OBJECT3D_DOCUMENT_WRITE_POLICY) {
124
+ throw new Error('An Object3D document write policy is already installed.');
125
+ }
126
+ _policy = policy;
127
+ }
128
+
129
+ /** The installed policy, or the no-shell default. */
130
+ export function object3DDocumentWritePolicy(): Object3DDocumentWritePolicy {
131
+ return _policy;
132
+ }
133
+
134
+ /** Test seam: drop the installed policy. */
135
+ export function __resetObject3DDocumentWritePolicyForTest(): void {
136
+ _policy = DEFAULT_OBJECT3D_DOCUMENT_WRITE_POLICY;
137
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Runtime detection of the PACKAGED editor server (`packages/editor/server/
3
+ * packaged.ts` — a `@vgai/editor` npm package with NO monorepo checkout on
4
+ * disk) from editor CLIENT code. Needed because a react world's mount
5
+ * (`react-mount-runtime.ts`'s `resolveReactRootMountRuntime`) must resolve its
6
+ * `react`/`react-dom/client`/`WorldProvider`-fallback wrapper from the
7
+ * PROJECT's own module graph ONLY under this runtime — see that function's
8
+ * doc comment, and `packaged.ts`'s header doc comment ("React-world OID
9
+ * authoring parity"), for the dual-React-instance bug this closes. Under
10
+ * dev, this must resolve `false` so the existing static-import path
11
+ * stays byte-unchanged (one shared Vite instance already collapses both
12
+ * react copies via `resolve.dedupe`).
13
+ *
14
+ * Reads the server's own `packaged` flag off `/__editor/project`'s response
15
+ * (computed server-side via `isMonorepoScaffoldRoot`, `server-utils.ts`)
16
+ * rather than probing a URL that only resolves in packaged mode: an
17
+ * unconditional dynamic `import()` probe would 404 (and log an
18
+ * unsuppressible browser console error) on EVERY react-world mount under
19
+ * dev — the exact reasoning `binding-resolver.ts`'s
20
+ * `loadProjectUIRegistry` doc comment already recorded for `hasUiRegistry`
21
+ * ("the client must not probe /@fs for it").
22
+ *
23
+ * A plain inline `fetch()`, not `editor-api.ts`'s `getCurrentServerProject`
24
+ * — same reasoning `loadProjectUIRegistry` documents: this module (via
25
+ * `binding-resolver.ts`) must stay importable by headless Node/vitest
26
+ * suites, and `editor-api.ts`'s module top level pulls in `./storage`.
27
+ *
28
+ * A HOST THAT SERVES NO `/__editor/project` is answered locally rather than by
29
+ * a doomed fetch: it is never the packaged runtime, because "packaged" names a
30
+ * Node host serving a project's own module graph, and a 404's console error is
31
+ * unsuppressible on every doorway of every mount. Same guard, same reason, as
32
+ * `ui-source/tier-source-write-backend.ts`'s `serverSourceWriteRoutes`.
33
+ *
34
+ * ## What is memoized, and what a FAILED probe does
35
+ *
36
+ * An ANSWER is memoized for the page — the runtime a server process runs
37
+ * under cannot change without a restart, so a settled answer is settled. A
38
+ * probe that never got an answer is NOT memoized, and does NOT resolve: it
39
+ * drops the memo and REJECTS, so the next caller asks again.
40
+ *
41
+ * Both halves were bought by one measured failure. A `.catch(() => false)`
42
+ * latch turned a single unreachable fetch — a mount landing in the window
43
+ * while `vgai edit` restarts its dev server, which it does on any
44
+ * server-file change — into a page where EVERY doorway
45
+ * (`three-ingest-runtime`, `canvas-entry-runtime`, `r3f-entry-runtime`,
46
+ * the two story runtimes, `binding-resolver`'s react
47
+ * mount) silently resolved the SHELL's namespace for the rest of the
48
+ * session. Under the packaged runtime that is the wrong graph, and the cost
49
+ * lands 10–15 seconds later as a mount failure whose message blames the
50
+ * GAME ("bundles its own (un-shared) copy of three") for a defect in this
51
+ * host — the exact mis-attribution `three-ingest-runtime.ts`'s own
52
+ * loud-throw comment already refuses to make for the sibling case.
53
+ *
54
+ * So "I don't know" is never spent as "dev". Every doorway reads this with
55
+ * `await isPackagedRuntime()` and does nothing else with the answer, so the
56
+ * rejection propagates to the mount site unchanged: nothing mounts on a
57
+ * guessed graph, the message names this host, and because the memo is
58
+ * dropped the remedy it states — retry the mount — is a real one rather
59
+ * than advice.
60
+ */
61
+
62
+ import { editorServerJson } from './editor-server-response';
63
+
64
+ let cachedIsPackaged: Promise<boolean> | null = null;
65
+
66
+ export function isPackagedRuntime(): Promise<boolean> {
67
+ if (!cachedIsPackaged) {
68
+ // The `fetch` call is INSIDE the chain so that a synchronous throw from it
69
+ // is a rejected probe like any other, rather than an exception thrown at
70
+ // whoever happened to ask first.
71
+ const probe: Promise<boolean> = Promise.resolve()
72
+ .then(() => fetch('/__editor/project'))
73
+ .then((res) =>
74
+ editorServerJson<{ project?: { packaged?: boolean } | null }>(
75
+ res,
76
+ '`/__editor/project` did not answer',
77
+ ),
78
+ )
79
+ .then((data) => Boolean(data.project?.packaged))
80
+ .catch((err: unknown) => {
81
+ if (cachedIsPackaged === probe) cachedIsPackaged = null;
82
+ throw new Error(
83
+ "This editor session's runtime is unknown — `/__editor/project` did not answer, so " +
84
+ 'which module graph a world mounts in (this shell’s, or the project’s) cannot be ' +
85
+ 'decided and nothing was mounted on a guess. This is a fault in the editor host, ' +
86
+ 'not in the game. The answer is not latched: retry the mount (reopen the project) ' +
87
+ `and the question is asked again. (${err instanceof Error ? err.message : String(err)})`,
88
+ { cause: err },
89
+ );
90
+ });
91
+ cachedIsPackaged = probe;
92
+ }
93
+ return cachedIsPackaged;
94
+ }
95
+
96
+ /** Test-only: reset the memoized result between tests (mirrors
97
+ * `setCachedProjectUIRegistry`'s test-seam shape). */
98
+ export function resetPackagedRuntimeCacheForTest(): void {
99
+ cachedIsPackaged = null;
100
+ }
101
+
102
+ /** Test-only: pre-seed the probe's answer. jsdom has no `/__editor/project` to
103
+ * ask (vitest's MODE is not `web`, so the browser short-circuit does not
104
+ * apply), and the loud unknown-runtime refusal — correct in a live session —
105
+ * is pure noise in a suite that mounts portable stories. */
106
+ export function setPackagedRuntimeForTest(packaged: boolean): void {
107
+ cachedIsPackaged = Promise.resolve(packaged);
108
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "schemaVersion": 3,
3
+ "name": "Maya",
4
+ "theme": {
5
+ "id": "maya",
6
+ "color": {
7
+ "surface": {
8
+ "shell": "#2b2b2b",
9
+ "panel": "#444444",
10
+ "chrome": "#373737",
11
+ "raised": "#4b4b4b",
12
+ "inset": "#333333",
13
+ "overlay": "rgba(55,55,55,0.94)"
14
+ },
15
+ "boundary": {
16
+ "default": "#2b2b2b",
17
+ "strong": "#5a5a5a"
18
+ },
19
+ "content": {
20
+ "primary": "#cccccc",
21
+ "muted": "#a8a8a8",
22
+ "dim": "#858585",
23
+ "onAccent": "#ffffff",
24
+ "onBright": {
25
+ "primary": "#1c1c1c",
26
+ "muted": "rgba(28,28,28,0.82)",
27
+ "dim": "rgba(28,28,28,0.7)"
28
+ }
29
+ },
30
+ "accent": {
31
+ "default": "#5285a6",
32
+ "muted": "rgba(82,133,166,0.34)"
33
+ },
34
+ "semantic": {
35
+ "danger": "#d9534f",
36
+ "dangerMuted": "rgba(217,83,79,0.28)",
37
+ "dangerFaint": "rgba(217,83,79,0.12)",
38
+ "warning": "#e0a030",
39
+ "warningMuted": "rgba(224,160,48,0.28)",
40
+ "success": "#4fd85b",
41
+ "successMuted": "rgba(79,216,91,0.28)",
42
+ "dynamic": "#e6a6ff",
43
+ "dynamicMuted": "rgba(230,166,255,0.18)",
44
+ "instance": "#4fd85b"
45
+ },
46
+ "neutralOverlay": {
47
+ "hover": "rgba(255,255,255,0.07)",
48
+ "active": "rgba(255,255,255,0.12)"
49
+ },
50
+ "scrim": "rgba(0,0,0,0.55)"
51
+ },
52
+ "typography": {
53
+ "sans": "'Helvetica Neue', Arial, system-ui, sans-serif",
54
+ "mono": "Menlo, Consolas, monospace"
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "schemaVersion": 3,
3
+ "name": "Substance",
4
+ "theme": {
5
+ "id": "substance",
6
+ "color": {
7
+ "surface": {
8
+ "shell": "#1e1e1e",
9
+ "panel": "#252525",
10
+ "chrome": "#2a2a2a",
11
+ "raised": "#2d2d2d",
12
+ "inset": "#1a1a1a",
13
+ "overlay": "rgba(37,37,37,0.94)"
14
+ },
15
+ "boundary": {
16
+ "default": "#3a3a3a",
17
+ "strong": "#4a4a4a"
18
+ },
19
+ "content": {
20
+ "primary": "#d9d9d9",
21
+ "muted": "#a6a6a6",
22
+ "dim": "#7f7f7f",
23
+ "onAccent": "#ffffff",
24
+ "onBright": {
25
+ "primary": "#1e1e1e",
26
+ "muted": "rgba(30,30,30,0.82)",
27
+ "dim": "rgba(30,30,30,0.7)"
28
+ }
29
+ },
30
+ "accent": {
31
+ "default": "#4aa3df",
32
+ "muted": "rgba(74,163,223,0.3)"
33
+ },
34
+ "semantic": {
35
+ "danger": "#e5534b",
36
+ "dangerMuted": "rgba(229,83,75,0.28)",
37
+ "dangerFaint": "rgba(229,83,75,0.12)",
38
+ "warning": "#e3a52f",
39
+ "warningMuted": "rgba(227,165,47,0.28)",
40
+ "success": "#5cc27a",
41
+ "successMuted": "rgba(92,194,122,0.28)",
42
+ "dynamic": "#4aa3df",
43
+ "dynamicMuted": "rgba(74,163,223,0.18)",
44
+ "instance": "#e98b3a"
45
+ },
46
+ "neutralOverlay": {
47
+ "hover": "rgba(255,255,255,0.06)",
48
+ "active": "rgba(255,255,255,0.11)"
49
+ },
50
+ "scrim": "rgba(0,0,0,0.62)"
51
+ },
52
+ "typography": {
53
+ "sans": "'Source Sans 3', 'Segoe UI', system-ui, sans-serif",
54
+ "mono": "'Source Code Pro', Menlo, monospace"
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Structural detection of a PASTEBOARD MODULE — an ordinary project `.tsx`
3
+ * whose default export renders the pasteboard capability's `Pasteboard`
4
+ * helper at its root (`src/lib/pasteboard/pasteboard.tsx` in the project,
5
+ * marker `data-vgai-pasteboard`). Same doctrine as `LiveModuleDocument`'s
6
+ * Object3D probe and the quarks JSON probe: detection is structural, never a
7
+ * filename convention, so a project's freely edited copy of the helper keeps
8
+ * working.
9
+ *
10
+ * The probe is a BARE UNWRAP, not a render: the default export is invoked as
11
+ * a plain function and the returned element chain is followed by invoking
12
+ * each function `type` until a host element appears, whose props either carry
13
+ * the marker or do not. This keeps the probe free of react-dom and of the
14
+ * two-React-copies trap (the editor's react-dom driving a project component
15
+ * would crash on the project React's own hook dispatcher). The CONTRACT that
16
+ * buys: the chain from the default export down to `<Pasteboard>` is hook-free
17
+ * static composition — which a pasteboard is by design. Children BELOW the
18
+ * Pasteboard root may do anything; the probe never descends past the first
19
+ * host element. A chain that throws (hooks, wrong shape) is simply not a
20
+ * pasteboard: the module falls back to the ordinary source viewer.
21
+ */
22
+
23
+ import { liveModuleImportUrl } from '@volter/editor-sdk/session/project-module-url';
24
+
25
+ const PASTEBOARD_MARKER = 'data-vgai-pasteboard';
26
+
27
+ /** Follow a React element's function-component chain to its first host
28
+ * element and answer whether that element carries the pasteboard marker. */
29
+ export function isPasteboardElementTree(value: unknown): boolean {
30
+ let current = value;
31
+ for (let depth = 0; depth < 12; depth++) {
32
+ if (!current || typeof current !== 'object') return false;
33
+ const element = current as { type?: unknown; props?: Record<string, unknown> | null };
34
+ if (typeof element.type === 'string') {
35
+ return element.props?.[PASTEBOARD_MARKER] === 'true';
36
+ }
37
+ if (typeof element.type === 'function') {
38
+ try {
39
+ current = (element.type as (props: unknown) => unknown)(element.props ?? {});
40
+ } catch {
41
+ return false;
42
+ }
43
+ continue;
44
+ }
45
+ // memo/forwardRef/fragment wrappers are outside the static-composition
46
+ // contract; an author who wants one keeps it below the Pasteboard root.
47
+ return false;
48
+ }
49
+ return false;
50
+ }
51
+
52
+ /**
53
+ * Import the module (same revisioned url the live-module probe uses, so the
54
+ * two probes share one fetch) and answer whether its DEFAULT export is a
55
+ * pasteboard component. Named exports are deliberately not considered — the
56
+ * pasteboard contract is "the file IS the canvas", and a file whose canvas is
57
+ * a side export has no one subject.
58
+ */
59
+ export async function probePasteboardModule(
60
+ projectRoot: string,
61
+ modulePath: string,
62
+ revision: number,
63
+ ): Promise<boolean> {
64
+ let namespace: Record<string, unknown>;
65
+ try {
66
+ namespace = (await import(
67
+ /* @vite-ignore */ liveModuleImportUrl(projectRoot, modulePath, revision)
68
+ )) as Record<string, unknown>;
69
+ } catch {
70
+ return false;
71
+ }
72
+ const candidate = namespace['default'];
73
+ if (typeof candidate !== 'function') return false;
74
+ let element: unknown;
75
+ try {
76
+ element = (candidate as (props: Record<string, unknown>) => unknown)({});
77
+ } catch {
78
+ return false;
79
+ }
80
+ return isPasteboardElementTree(element);
81
+ }