@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,294 @@
1
+ /**
2
+ * B8.4 — the Asset Lab COMPARE surface (`vgai screenshot <model.glb>
3
+ * --compare <ref.glb>`): renders the project asset AND a caller-supplied reference GLB
4
+ * with matched orthographic front + side framing, then scores their
5
+ * silhouettes (IoU) and composes review overlays, so an agent can
6
+ * numerically converge a procedural character toward a reference.
7
+ *
8
+ * Framing is DELIBERATELY bounding-box based (equal-height normalization,
9
+ * shared ground plane, centered footprint) rather than the humanoid shot
10
+ * set's Mixamo-skeleton anchors: the reference may carry any rig (UE joint
11
+ * names, no rig at all), and the bone-anchored path throws on missing joints
12
+ * by design. Both models are yaw-normalized to FACE the front camera —
13
+ * forward read from GLB `extras`/`userData.forward` when present (our
14
+ * generated rigs persist `[0,0,-1]`), else the glTF +Z convention, with an
15
+ * explicit reference override for models whose extras lie.
16
+ *
17
+ * Pure scoring math lives in `asset-compare-core.ts` (unit-tested in node);
18
+ * this module owns only loading, scene assembly, and WebGL capture. Fixed
19
+ * cameras + fixed resolution + flat unlit override ⇒ identical IoU numbers
20
+ * across runs (a stated acceptance gate).
21
+ */
22
+
23
+ import { markHostRenderer } from '@volter/editor-threejs/viewport/renderer-ownership';
24
+ import * as THREE from 'three';
25
+ import {
26
+ ASSET_COMPARE_VIEWS,
27
+ type AssetCompareView,
28
+ COMPARE_FRAME_CENTER_Y,
29
+ COMPARE_FRAME_HALF_HEIGHT,
30
+ forwardYawRadians,
31
+ maskIoU,
32
+ normalizedPlacement,
33
+ overlayRgba,
34
+ silhouetteMaskFromRgba,
35
+ } from './asset-compare-core';
36
+ import {
37
+ checkedDimension,
38
+ createAssetPreviewSnapshot,
39
+ disposeAssetPreviewSnapshot,
40
+ disposeProjectAssetModel,
41
+ loadProjectAssetModel,
42
+ measureAssetPreview,
43
+ parseGlbBytesModel,
44
+ pngBase64,
45
+ readModelForward,
46
+ } from './asset-preview';
47
+
48
+ export type { AssetCompareView } from './asset-compare-core';
49
+ // The forward detection moved to `asset-preview.ts` (the shot sets need it
50
+ // too); re-exported here so compare-mode consumers keep their import path.
51
+ export { readModelForward } from './asset-preview';
52
+
53
+ export interface AssetCompareImage {
54
+ base64: string;
55
+ mimeType: 'image/png';
56
+ }
57
+
58
+ export interface AssetCompareViewResult {
59
+ view: AssetCompareView;
60
+ /** Silhouette intersection-over-union in [0, 1]. */
61
+ iou: number;
62
+ /** Both silhouettes in distinct colors (orange asset / cyan ref / white agreement). */
63
+ overlay: AssetCompareImage;
64
+ /** The asset's own silhouette (white on black), as captured for scoring. */
65
+ asset: AssetCompareImage;
66
+ /** The reference's silhouette (white on black), as captured for scoring. */
67
+ ref: AssetCompareImage;
68
+ }
69
+
70
+ export interface AssetCompareCapture {
71
+ width: number;
72
+ height: number;
73
+ views: AssetCompareViewResult[];
74
+ }
75
+
76
+ export interface AssetCompareOptions {
77
+ width?: number;
78
+ height?: number;
79
+ /** Override the reference GLB's forward vector (its facing in the ground
80
+ * plane). Defaults to the GLB's own `userData.forward` extras, else +Z. */
81
+ refForward?: [number, number, number];
82
+ }
83
+
84
+ const SILHOUETTE_BACKGROUND = 0x000000;
85
+ const SILHOUETTE_FOREGROUND = 0xffffff;
86
+ const COMPARE_CAMERA_DISTANCE = 10;
87
+
88
+ /** The base64-GLB decoder moved to `asset-preview.ts` (`parseGlbBytesModel`)
89
+ * when the module-look lane needed the same wire-carried bytes; this keeps
90
+ * compare's own error wording. */
91
+ function parseRefGlb(base64: string): Promise<THREE.Object3D> {
92
+ return parseGlbBytesModel(base64, 'Compare reference GLB');
93
+ }
94
+
95
+ /** Snapshot + face-the-camera yaw + equal-height ground-aligned placement,
96
+ * as one disposable wrapper ready to drop into a silhouette scene. */
97
+ function buildNormalizedSubject(
98
+ source: THREE.Object3D,
99
+ forward: [number, number, number],
100
+ ): { wrapper: THREE.Object3D; dispose: () => void } {
101
+ const snapshot = createAssetPreviewSnapshot(source);
102
+ const pivot = new THREE.Group();
103
+ pivot.rotation.y = forwardYawRadians(forward);
104
+ pivot.add(snapshot);
105
+ const wrapper = new THREE.Group();
106
+ wrapper.add(pivot);
107
+ wrapper.updateWorldMatrix(true, true);
108
+ const bounds = measureAssetPreview(wrapper, 'front');
109
+ const min: [number, number, number] = [
110
+ bounds.center.x - bounds.size.x / 2,
111
+ bounds.center.y - bounds.size.y / 2,
112
+ bounds.center.z - bounds.size.z / 2,
113
+ ];
114
+ const max: [number, number, number] = [
115
+ bounds.center.x + bounds.size.x / 2,
116
+ bounds.center.y + bounds.size.y / 2,
117
+ bounds.center.z + bounds.size.z / 2,
118
+ ];
119
+ const placement = normalizedPlacement(min, max);
120
+ wrapper.scale.setScalar(placement.scale);
121
+ wrapper.position.set(...placement.position);
122
+ wrapper.updateWorldMatrix(true, true);
123
+ return { wrapper, dispose: () => disposeAssetPreviewSnapshot(snapshot) };
124
+ }
125
+
126
+ function compareCamera(view: AssetCompareView, aspect: number): THREE.OrthographicCamera {
127
+ const halfHeight = COMPARE_FRAME_HALF_HEIGHT;
128
+ const halfWidth = halfHeight * aspect;
129
+ const camera = new THREE.OrthographicCamera(
130
+ -halfWidth,
131
+ halfWidth,
132
+ halfHeight,
133
+ -halfHeight,
134
+ 0.01,
135
+ COMPARE_CAMERA_DISTANCE * 4,
136
+ );
137
+ const direction = view === 'front' ? new THREE.Vector3(0, 0, 1) : new THREE.Vector3(1, 0, 0);
138
+ camera.position
139
+ .set(0, COMPARE_FRAME_CENTER_Y, 0)
140
+ .addScaledVector(direction, COMPARE_CAMERA_DISTANCE);
141
+ camera.up.set(0, 1, 0);
142
+ camera.lookAt(0, COMPARE_FRAME_CENTER_Y, 0);
143
+ camera.updateProjectionMatrix();
144
+ camera.updateMatrixWorld(true);
145
+ return camera;
146
+ }
147
+
148
+ interface SilhouetteShot {
149
+ image: AssetCompareImage;
150
+ mask: Uint8Array;
151
+ }
152
+
153
+ /**
154
+ * Compare an already-loaded asset model against an already-loaded reference:
155
+ * the shared capture core behind both the asset-path and entity entry
156
+ * points. Neither input is mutated (both are snapshotted).
157
+ */
158
+ export function captureAssetComparePreview(
159
+ assetSource: THREE.Object3D,
160
+ refSource: THREE.Object3D,
161
+ options: AssetCompareOptions = {},
162
+ ): AssetCompareCapture {
163
+ const width = checkedDimension(options.width);
164
+ const height = checkedDimension(options.height);
165
+ const aspect = width / height;
166
+ const disposers: Array<() => void> = [];
167
+ let renderer: THREE.WebGLRenderer | null = null;
168
+ try {
169
+ const asset = buildNormalizedSubject(assetSource, readModelForward(assetSource));
170
+ disposers.push(asset.dispose);
171
+ const ref = buildNormalizedSubject(
172
+ refSource,
173
+ options.refForward ?? readModelForward(refSource),
174
+ );
175
+ disposers.push(ref.dispose);
176
+
177
+ const override = new THREE.MeshBasicMaterial({ color: SILHOUETTE_FOREGROUND });
178
+ disposers.push(() => override.dispose());
179
+ const sceneFor = (subject: THREE.Object3D): THREE.Scene => {
180
+ const scene = new THREE.Scene();
181
+ scene.background = new THREE.Color(SILHOUETTE_BACKGROUND);
182
+ scene.overrideMaterial = override;
183
+ scene.add(subject);
184
+ return scene;
185
+ };
186
+ const assetScene = sceneFor(asset.wrapper);
187
+ const refScene = sceneFor(ref.wrapper);
188
+
189
+ // Antialiasing off: silhouette masks want a crisp, deterministic
190
+ // coverage decision per pixel, not blended edge ramps.
191
+ const activeRenderer = markHostRenderer(
192
+ new THREE.WebGLRenderer({
193
+ antialias: false,
194
+ alpha: false,
195
+ preserveDrawingBuffer: true,
196
+ }),
197
+ );
198
+ renderer = activeRenderer;
199
+ activeRenderer.setPixelRatio(1);
200
+ activeRenderer.toneMapping = THREE.NoToneMapping;
201
+ activeRenderer.setClearColor(SILHOUETTE_BACKGROUND, 1);
202
+ activeRenderer.setSize(width, height, false);
203
+
204
+ const readCanvas = document.createElement('canvas');
205
+ readCanvas.width = width;
206
+ readCanvas.height = height;
207
+ const readContext = readCanvas.getContext('2d');
208
+ if (!readContext) throw new Error('Unable to create the compare readback canvas.');
209
+
210
+ const captureSilhouette = (
211
+ scene: THREE.Scene,
212
+ camera: THREE.Camera,
213
+ label: string,
214
+ view: AssetCompareView,
215
+ ): SilhouetteShot => {
216
+ activeRenderer.render(scene, camera);
217
+ readContext.clearRect(0, 0, width, height);
218
+ readContext.drawImage(activeRenderer.domElement, 0, 0);
219
+ const rgba = readContext.getImageData(0, 0, width, height).data;
220
+ const mask = silhouetteMaskFromRgba(rgba, width * height);
221
+ if (!mask.some((value) => value !== 0)) {
222
+ throw new Error(
223
+ `Compare ${view} view rendered an empty ${label} silhouette — nothing to score.`,
224
+ );
225
+ }
226
+ return {
227
+ image: { base64: pngBase64(readCanvas), mimeType: 'image/png' },
228
+ mask,
229
+ };
230
+ };
231
+
232
+ const overlayCanvas = document.createElement('canvas');
233
+ overlayCanvas.width = width;
234
+ overlayCanvas.height = height;
235
+ const overlayContext = overlayCanvas.getContext('2d');
236
+ if (!overlayContext) throw new Error('Unable to create the compare overlay canvas.');
237
+
238
+ const views: AssetCompareViewResult[] = [];
239
+ for (const view of ASSET_COMPARE_VIEWS) {
240
+ const camera = compareCamera(view, aspect);
241
+ const assetShot = captureSilhouette(assetScene, camera, 'asset', view);
242
+ const refShot = captureSilhouette(refScene, camera, 'reference', view);
243
+ const stats = maskIoU(assetShot.mask, refShot.mask);
244
+ overlayContext.putImageData(
245
+ new ImageData(overlayRgba(assetShot.mask, refShot.mask), width, height),
246
+ 0,
247
+ 0,
248
+ );
249
+ views.push({
250
+ view,
251
+ iou: stats.iou,
252
+ overlay: { base64: pngBase64(overlayCanvas), mimeType: 'image/png' },
253
+ asset: assetShot.image,
254
+ ref: refShot.image,
255
+ });
256
+ }
257
+ return { width, height, views };
258
+ } finally {
259
+ renderer?.dispose();
260
+ renderer?.forceContextLoss();
261
+ for (const dispose of disposers.reverse()) dispose();
262
+ }
263
+ }
264
+
265
+ /** The `--asset <path> --compare` entry point: loads the project GLB the
266
+ * same bounded/validated way the other asset-path captures do, parses the
267
+ * relayed reference GLB bytes, and scores them. */
268
+ export async function captureModelComparePreview(
269
+ assetPath: string,
270
+ refGlbBase64: string,
271
+ options: AssetCompareOptions = {},
272
+ ): Promise<AssetCompareCapture> {
273
+ const model = await loadProjectAssetModel(assetPath);
274
+ try {
275
+ return await captureEntityComparePreview(model, refGlbBase64, options);
276
+ } finally {
277
+ disposeProjectAssetModel(model);
278
+ }
279
+ }
280
+
281
+ /** The `--entity <id> --compare` entry point (also the shared tail of the
282
+ * asset-path leg): parses the reference and runs the capture core. */
283
+ export async function captureEntityComparePreview(
284
+ entity: THREE.Object3D,
285
+ refGlbBase64: string,
286
+ options: AssetCompareOptions = {},
287
+ ): Promise<AssetCompareCapture> {
288
+ const refModel = await parseRefGlb(refGlbBase64);
289
+ try {
290
+ return captureAssetComparePreview(entity, refModel, options);
291
+ } finally {
292
+ disposeProjectAssetModel(refModel);
293
+ }
294
+ }
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Context contributed by the active typed Asset Editor to the existing editor
3
+ * shell. Asset documents own content; the workspace owns placement. Keeping
4
+ * this as a tiny external store lets the status bar and the workspace's
5
+ * inspection surface resolution know WHICH document is active without an
6
+ * Asset Editor recreating those panes inside the center.
7
+ *
8
+ * It carries FACTS ONLY — id, title, type, status. Never markup: an open
9
+ * asset document is a SUBJECT PRODUCER, and what it produces goes through the
10
+ * one composer into the one inspector box like everything else. A React node
11
+ * put on this store would be a second, invisible way for a document to render
12
+ * somewhere else, and there is exactly one.
13
+ */
14
+
15
+ import { useSyncExternalStore } from 'react';
16
+ import { createHmrRegistrationGroup } from './hmr-registration-group';
17
+ import { registerWorkspaceStatus } from './workspace-status-registry';
18
+
19
+ export interface AssetEditorContextValue {
20
+ readonly documentId: string;
21
+ readonly title: string;
22
+ readonly type: string;
23
+ readonly status?: string;
24
+ }
25
+
26
+ interface ActiveAssetEditorContext extends AssetEditorContextValue {
27
+ readonly token: symbol;
28
+ }
29
+
30
+ let active: ActiveAssetEditorContext | null = null;
31
+ let version = 0;
32
+ const listeners = new Set<() => void>();
33
+
34
+ function notifyChanged(): void {
35
+ version++;
36
+ for (const listener of listeners) listener();
37
+ }
38
+
39
+ export function subscribeAssetEditorContext(listener: () => void): () => void {
40
+ listeners.add(listener);
41
+ return () => listeners.delete(listener);
42
+ }
43
+
44
+ export function assetEditorContextVersion(): number {
45
+ return version;
46
+ }
47
+
48
+ export function getActiveAssetEditorContext(): AssetEditorContextValue | null {
49
+ return active;
50
+ }
51
+
52
+ /** Activate one document contribution. The returned disposer only clears the
53
+ * exact activation it created, so an older tab unmount cannot erase a newer
54
+ * active tab's context. */
55
+ export function activateAssetEditorContext(value: AssetEditorContextValue): () => void {
56
+ const token = Symbol(value.documentId);
57
+ active = { ...value, token };
58
+ notifyChanged();
59
+ return () => {
60
+ if (active?.token !== token) return;
61
+ active = null;
62
+ notifyChanged();
63
+ };
64
+ }
65
+
66
+ export function AssetEditorStatus() {
67
+ useSyncExternalStore(subscribeAssetEditorContext, assetEditorContextVersion);
68
+ const context = getActiveAssetEditorContext();
69
+ return context?.status ? (
70
+ <span className="vgai-status-copy" data-testid="status-asset-editor" data-status-tone="muted">
71
+ {context.status}
72
+ </span>
73
+ ) : null;
74
+ }
75
+
76
+ const registrationGroup = createHmrRegistrationGroup(
77
+ import.meta.hot,
78
+ 'asset-editor-shell-contributions',
79
+ );
80
+
81
+ export function ensureAssetEditorShellContributionsRegistered(): void {
82
+ registrationGroup.ensure((track) => {
83
+ track(
84
+ registerWorkspaceStatus({
85
+ id: 'asset-editor-status',
86
+ name: 'Asset editor',
87
+ align: 'left',
88
+ order: 40,
89
+ Content: AssetEditorStatus,
90
+ }),
91
+ );
92
+ });
93
+ }
94
+
95
+ ensureAssetEditorShellContributionsRegistered();
96
+
97
+ export function __resetAssetEditorContextForTest(): void {
98
+ active = null;
99
+ notifyChanged();
100
+ }
@@ -0,0 +1,97 @@
1
+ import { connectEvents } from './editor-api';
2
+ import { announceAssetReload, evictLoaderCaches } from './project-asset-refresh';
3
+
4
+ export interface AssetMovedEvent {
5
+ oldPath: string;
6
+ newPath: string;
7
+ updatedFiles: string[];
8
+ }
9
+
10
+ export interface AssetsChangedEvent {
11
+ readonly paths?: readonly string[];
12
+ }
13
+
14
+ /**
15
+ * Connect to the editor server's SSE endpoint for asset events.
16
+ * Returns a cleanup function to disconnect.
17
+ */
18
+ export function connectAssetEvents(
19
+ onAssetMoved: (event: AssetMovedEvent) => void,
20
+ onAssetsChanged: (event: AssetsChangedEvent) => void = () => {},
21
+ ): () => void {
22
+ // Browser mode (Phase A2): no Node dev server / SSE. A rename can't be
23
+ // reconstructed from self-derived watch events — a move surfaces as an
24
+ // unlinked `remove` + `create` with no old→new pairing — so asset-move sync
25
+ // stays a server-only signal (revisit with A4's external-change detection).
26
+ const source = connectEvents();
27
+
28
+ source.addEventListener('asset-moved', (e: MessageEvent) => {
29
+ try {
30
+ const data = JSON.parse(e.data) as AssetMovedEvent;
31
+ onAssetMoved(data);
32
+ } catch {
33
+ /* ignore malformed events */
34
+ }
35
+ });
36
+ source.addEventListener('assets-changed', async (event: MessageEvent) => {
37
+ let detail: AssetsChangedEvent;
38
+ try {
39
+ detail = JSON.parse(event.data) as AssetsChangedEvent;
40
+ } catch {
41
+ detail = {};
42
+ }
43
+ const paths =
44
+ detail.paths?.map((path) => `/${path.replace(/^\/?public\//, '').replace(/^\//, '')}`) ?? [];
45
+ await evictLoaderCaches(paths);
46
+ announceAssetReload(paths);
47
+ onAssetsChanged(detail);
48
+ });
49
+
50
+ return () => source.close();
51
+ }
52
+
53
+ export function connectToolFileEvents(onChanged: () => void): () => void {
54
+ const source = connectEvents();
55
+ source.addEventListener('tool-files-changed', () => onChanged());
56
+ return () => source.close();
57
+ }
58
+
59
+ /** Root declarations affect project configuration and adapter capabilities. */
60
+ export function connectProjectDeclarationEvents(onChanged: () => void): () => void {
61
+ const source = connectEvents();
62
+ source.addEventListener('project-declarations-changed', onChanged);
63
+ return () => source.close();
64
+ }
65
+
66
+ /**
67
+ * Connect to the editor server's SSE endpoint for project STORY file
68
+ * add/unlink events (C3, spec §9). Mirrors `connectToolFileEvents` for
69
+ * `*.stories.tsx` / `*.stories.ts` anywhere under `src/` — the React hierarchy's
70
+ * `refreshProjectStories()` is a cheap full rescan, same discipline as
71
+ * `refreshProjectTools`.
72
+ */
73
+ /**
74
+ * The editor server's `source-files-changed`: any `src/` file that is neither
75
+ * a tool nor a story — the files contributed FINDERS read (a models project's
76
+ * `src/models/*.ts`). Carries the project-relative path; the browser lane
77
+ * cannot name one and reports `''`.
78
+ */
79
+ export function connectSourceFileEvents(onChanged: (path: string) => void): () => void {
80
+ const source = connectEvents();
81
+ source.addEventListener('source-files-changed', (event) => {
82
+ let path = '';
83
+ try {
84
+ path = String((JSON.parse((event as MessageEvent).data) as { path?: string }).path ?? '');
85
+ } catch {
86
+ /* a payload without a path still means "something changed" */
87
+ }
88
+ onChanged(path);
89
+ });
90
+ return () => source.close();
91
+ }
92
+
93
+ export function connectStoryFileEvents(onChanged: () => void): () => void {
94
+ const source = connectEvents();
95
+ source.addEventListener('story-files-changed', () => onChanged());
96
+ return () => source.close();
97
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * The verbs an `asset.inspector` contribution offers for the asset it is
3
+ * currently showing — published BY the section, because the section is what
4
+ * knows.
5
+ *
6
+ * WHY NOT A STATIC EXPORT. The first shape of this was `export const
7
+ * actions(asset)`, resolved synchronously beside `match(asset)`. It could
8
+ * only filter on the path, while the section itself decides structurally —
9
+ * the Edit Mesh door imports the module and calls `build()` — so the panel
10
+ * and `inspect().quickActions` disagreed: measured 2026-09-03, every `src/**`
11
+ * script offered "Edit mesh" through the control API while the human saw the
12
+ * button on mesh modules alone. A verb the human cannot see is exactly what
13
+ * `editor.inspect()` promises never to report, so the declaration moved to
14
+ * where the answer is.
15
+ *
16
+ * The section calls `props.setActions(...)` when it knows (and `[]` when it
17
+ * knows the answer is no); this store keys the list by contribution and
18
+ * asset, so a stale answer for a previous selection can never be served, and
19
+ * bumps a version `inspection/use-active-inspection.ts` subscribes to, the
20
+ * same way the section registry does.
21
+ */
22
+ import type { ToolAssetInspectorAction } from '@volter/editor-sdk/contributions';
23
+
24
+ interface Published {
25
+ readonly assetPath: string;
26
+ readonly actions: readonly ToolAssetInspectorAction[];
27
+ }
28
+
29
+ const published = new Map<string, Published>();
30
+ let version = 0;
31
+ const listeners = new Set<() => void>();
32
+
33
+ function changed(): void {
34
+ version += 1;
35
+ for (const listener of listeners) listener();
36
+ }
37
+
38
+ /** Publish (or clear) one contribution's verbs for the asset it is showing. */
39
+ export function setAssetInspectorActions(
40
+ contributionId: string,
41
+ assetPath: string,
42
+ actions: readonly ToolAssetInspectorAction[],
43
+ ): void {
44
+ const current = published.get(contributionId);
45
+ if (
46
+ current &&
47
+ current.assetPath === assetPath &&
48
+ current.actions.length === actions.length &&
49
+ current.actions.every((action, i) => action === actions[i])
50
+ ) {
51
+ return;
52
+ }
53
+ published.set(contributionId, { assetPath, actions });
54
+ changed();
55
+ }
56
+
57
+ /** Forget a contribution's verbs (its section unmounted). */
58
+ export function clearAssetInspectorActions(contributionId: string): void {
59
+ if (!published.delete(contributionId)) return;
60
+ changed();
61
+ }
62
+
63
+ /** Every verb published FOR this asset, in contribution registration order.
64
+ * A list published for a different asset is ignored rather than served. */
65
+ export function assetInspectorActionsFor(assetPath: string): readonly ToolAssetInspectorAction[] {
66
+ const out: ToolAssetInspectorAction[] = [];
67
+ for (const entry of published.values()) {
68
+ if (entry.assetPath !== assetPath) continue;
69
+ out.push(...entry.actions);
70
+ }
71
+ return out;
72
+ }
73
+
74
+ export function subscribeAssetInspectorActions(listener: () => void): () => void {
75
+ listeners.add(listener);
76
+ return () => listeners.delete(listener);
77
+ }
78
+
79
+ export function assetInspectorActionsVersion(): number {
80
+ return version;
81
+ }
82
+
83
+ /** Test seam, mirroring the other module-scope stores. */
84
+ export function __resetAssetInspectorActionsForTest(): void {
85
+ published.clear();
86
+ version = 0;
87
+ }