@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,578 @@
1
+ /**
2
+ * "What is the inspector looking at right now?" — the LIVE half of the
3
+ * serialized projection (`inspection/serialize.ts` is the pure half; design:
4
+ * `docs/ARCHITECTURE-CORE.md` §Editor chrome, "The Inspection Model"; build
5
+ * ledger: `docs/WORK.md` §Inspection Model program, W4).
6
+ *
7
+ * `components/Inspector.tsx` answers this question every render, for the
8
+ * column and the card. This module answers the SAME question, with the SAME
9
+ * calls in the SAME order, for the agent surface (`editor.inspect`) — because
10
+ * "the agent reads what the human sees" is only true if both go through
11
+ * `composeInspectionSubject` with identically-resolved inputs. Every step is
12
+ * shared code, not a re-derivation: `activeInspectionSurface`,
13
+ * `resolvePanelAuthoring`, `resolveInspectionSubjectId`, `matchedInspectorSections`,
14
+ * `describeNullInspectionSubject`, `resolveComposeStoriesInput`.
15
+ *
16
+ * The two do not differ ANYWHERE any more. An asset document is the three
17
+ * paradigm scoped to a subtree, so clicking a part inside one composes that
18
+ * part's subject through the document's own adapter exactly as clicking a
19
+ * node in the scene composes that node's, and the document's own identity
20
+ * floor arrives through the same no-selection seam every other surface uses
21
+ * (`authoring/null-inspection-subjects.tsx` reads what the document published
22
+ * to `inspection/document-subject.ts`).
23
+ *
24
+ * It is a FUNCTION over live state, like `inspection/active-surface.ts`: no
25
+ * cache, no subscription, no store. The answer is composed at the moment it
26
+ * is asked for.
27
+ */
28
+
29
+ import type { AuthoringAdapter } from '@volter/editor-project/adapter';
30
+ import { CompositeAuthoringAdapter } from '../authoring/composite-authoring-adapter';
31
+ import type { Object3DDocumentSession } from '../authoring/object3d-document-session';
32
+ import { object3DDocumentSession } from '../authoring/object3d-document-session-registry';
33
+ import { resolvePanelAuthoring } from '../authoring/panel-authoring';
34
+ import { LIVE_ONLY_ACK, type WriteAck } from '../authoring/write-pipe';
35
+ import { openEntityAssetDocument } from '../components/asset-documents';
36
+ import { describeAssetSelectionSubject } from '../components/asset-selection-section';
37
+ import { ingestCoverageSection } from '../components/CapabilityCoverageSection';
38
+ import { resolveInspectionSubjectId } from '../components/inspector-selection';
39
+ import { resolveComposeStoriesInput } from '../components/inspector-stories-gating';
40
+ import { kindDocumentEntry } from '../components/kind-documents';
41
+ import type { EditorShellStore } from '../editor-shell-store';
42
+ import { entityObject3D } from '../entity-object';
43
+ import { inspectorPresentationOverride } from '../inspector-presentation';
44
+ import { matchedInspectorSections } from '../inspector-section-registry';
45
+ import { liveCoverage } from '../live-session-registry';
46
+ import { documentContributionForKind } from '../tool-loader';
47
+ import { GAME_DOCUMENT_ID } from '../workspace-document-ids';
48
+ import {
49
+ activeWorkspaceDocument,
50
+ activeWorkspaceDocumentId,
51
+ type WorkspaceDocumentSelection,
52
+ } from '../workspace-document-registry';
53
+ import { activeChromeRegions } from '../workspace-regions';
54
+ import { activeInspectionSurface } from './active-surface';
55
+ import {
56
+ composeInspectionSubject,
57
+ composeNullInspectionSubject,
58
+ type OwnedInspectorRail,
59
+ } from './compose';
60
+ import {
61
+ type InspectionDisplay,
62
+ inspectorBelongsToAnotherDocument,
63
+ resolveInspectionDisplay,
64
+ } from './display';
65
+ import { GAME_SUBJECT_ID } from './game-subject';
66
+ import {
67
+ type FieldDescriptor,
68
+ fieldReadonlyReason,
69
+ type InspectionFieldIo,
70
+ type InspectionSubject,
71
+ type InspectionSurfaceKind,
72
+ } from './model';
73
+ import { describeNullInspectionSubject } from './null-subject';
74
+ import { NO_INSPECTION, type SerializedInspection, serializeInspectionSubject } from './serialize';
75
+
76
+ /** A composed subject plus "is there an inspector at all?" — everything the
77
+ * one compose call site produces, before any projection decision. */
78
+ export interface ComposedInspection {
79
+ readonly subject: InspectionSubject;
80
+ /** A selection, or the surface's own `describeSubject(null)` answer, or a
81
+ * contribution that matched the empty selection (the asset browser's
82
+ * transient selection is one). `false` means NOTHING renders. */
83
+ readonly available: boolean;
84
+ }
85
+
86
+ /** One capture function per live native document. Inspector composition is a
87
+ * pure read and may run for unrelated shell updates; keeping this callback
88
+ * stable prevents those updates from retriggering an expensive GPU readback.
89
+ * `previewKey` still requests a fresh frame when the actual selection changes. */
90
+ const object3DDocumentCaptures = new WeakMap<
91
+ Object3DDocumentSession,
92
+ (size: number) => Promise<string | null>
93
+ >();
94
+
95
+ function object3DDocumentCapture(
96
+ session: Object3DDocumentSession,
97
+ ): (size: number) => Promise<string | null> {
98
+ const existing = object3DDocumentCaptures.get(session);
99
+ if (existing) return existing;
100
+ const capture = async (size: number) => session.captureImage(size);
101
+ object3DDocumentCaptures.set(session, capture);
102
+ return capture;
103
+ }
104
+
105
+ interface NativeCanvasPreviewAdapter extends AuthoringAdapter {
106
+ previewImage(id: string, width: number, height: number): Promise<string | null>;
107
+ }
108
+
109
+ function hasNativeCanvasPreview(adapter: AuthoringAdapter): adapter is NativeCanvasPreviewAdapter {
110
+ return typeof (adapter as Partial<NativeCanvasPreviewAdapter>).previewImage === 'function';
111
+ }
112
+
113
+ /** Resolve the native canvas-preview owner behind a selected id, including a
114
+ * manifest composite. Capability presence is enough; importing the concrete
115
+ * Pixi adapter here made every Three-only editor boot initialize Pixi. */
116
+ function canvasPreviewFor(
117
+ adapter: AuthoringAdapter,
118
+ nodeId: string | null,
119
+ surface: InspectionSurfaceKind | undefined,
120
+ ): ((size: number) => Promise<string | null>) | null {
121
+ if (!nodeId) return null;
122
+ // Asset Lab already owns the canonical native viewport. Re-mounting the
123
+ // selected Object3D inside Inspector duplicates its scene, animation mixer
124
+ // and render loop (and a lone SkinnedMesh cannot own its sibling bones).
125
+ // Capture the existing viewport once instead: honest native pixels, no
126
+ // second continuously-rendered rig, and no fabricated preview hierarchy.
127
+ if (surface === 'asset-lab') {
128
+ const documentId = activeWorkspaceDocumentId();
129
+ const session = documentId ? object3DDocumentSession(documentId) : null;
130
+ return session ? object3DDocumentCapture(session) : null;
131
+ }
132
+ let candidate = adapter;
133
+ if (adapter instanceof CompositeAuthoringAdapter) {
134
+ const worldId = adapter.ownerOf(nodeId);
135
+ candidate =
136
+ adapter.childAdapters().find((child) => child.worldId === worldId)?.adapter ?? adapter;
137
+ }
138
+ return hasNativeCanvasPreview(candidate)
139
+ ? (size) => candidate.previewImage(nodeId, size, size)
140
+ : null;
141
+ }
142
+
143
+ /**
144
+ * WHOSE RAIL IS THIS? — the active document's own package's, when that
145
+ * document declared `export const inspectorRail = 'owned'` (owner ruling,
146
+ * WORK.md §Blender in the tab is Blender, "Inspection parity", I2 decision 1).
147
+ *
148
+ * The one case shipped today is the Model document: Blender's Properties
149
+ * editor draws the tabs `ED_buttons_tabs_list` returns and nothing else, so
150
+ * the host's Preview / Transform / generic Object / Geometry / Materials
151
+ * blocks stand down beside Blender's sixteen. The resolution is a lookup, not
152
+ * a policy: a kind document's entry names its kind, the kind names its
153
+ * contribution (`tool-loader.ts`'s `documentContributionForKind`), and the
154
+ * contribution says whether it owns the rail and which built-ins it keeps.
155
+ *
156
+ * Spread into the compose input, so a document that owns nothing contributes
157
+ * no key at all and composition is byte-identical to before this existed.
158
+ */
159
+ function ownedInspectorRail(): { rail: OwnedInspectorRail } | null {
160
+ const documentId = activeWorkspaceDocumentId();
161
+ if (documentId === null) return null;
162
+ const entry = kindDocumentEntry(documentId);
163
+ if (entry === undefined) return null;
164
+ const contribution = documentContributionForKind(entry.kind);
165
+ if (contribution === undefined || contribution.inspectorRail !== 'owned') return null;
166
+ return {
167
+ rail: { owner: contribution.owner, builtins: contribution.inspectorBuiltins ?? [] },
168
+ };
169
+ }
170
+
171
+ /**
172
+ * The ONE compose call site for the live shell — the whole of "resolve the
173
+ * four channels for THIS binding and hand them to `inspection/compose.ts`".
174
+ *
175
+ * Two callers, and they differ only in where the binding comes from:
176
+ * {@link describeActiveInspectionSubject} resolves it from live state, and
177
+ * `components/Inspector.tsx`'s bounded design-system host is handed one. They
178
+ * used to be two copies of this block; keeping the copies in step was
179
+ * discipline, and the point of the model is that it should be structure.
180
+ */
181
+ export function composeInspectionForBinding(input: {
182
+ readonly store: EditorShellStore;
183
+ readonly adapter: AuthoringAdapter;
184
+ readonly documentSelection: WorkspaceDocumentSelection | null;
185
+ /** Absent in a bounded host: it names no surface, so its subject carries no
186
+ * per-surface affinity and its projection offers no preference switch. */
187
+ readonly surface?: InspectionSurfaceKind | undefined;
188
+ }): ComposedInspection {
189
+ const { store, adapter, documentSelection, surface } = input;
190
+ // PRODUCER SELECTION, and the only one: a single click in the Assets
191
+ // browser names its own subject, so the asset is what the box shows — not a
192
+ // section bolted onto whatever was selected before it.
193
+ const assetSubject = describeAssetSelectionSubject();
194
+ if (assetSubject !== null) {
195
+ return {
196
+ subject: composeNullInspectionSubject({ nullSubject: assetSubject, surface }),
197
+ available: true,
198
+ };
199
+ }
200
+ const nodeId = resolveInspectionSubjectId(documentSelection, store.selectedEntityIds, adapter);
201
+ const node = nodeId ? adapter.hierarchy.node(nodeId) : null;
202
+ // A selected id the current adapter's hierarchy cannot resolve matches NO
203
+ // contribution, and is not the null selection either. This occurs briefly
204
+ // during Edit↔Play ownership handoff; do not route the stale id into the
205
+ // adapter's inspector (which correctly refuses ids no current root owns).
206
+ if (nodeId !== null && node === null) {
207
+ return {
208
+ subject: composeNullInspectionSubject({ nullSubject: null, surface }),
209
+ available: false,
210
+ };
211
+ }
212
+ const onEdit = () => store.notifyIngestEdit();
213
+ // The null subject is resolved BEFORE the contributions, because it is an
214
+ // input to matching them: with nothing selected every surface hands a
215
+ // matcher the same `(null, adapter)`, so the subject's id is the only thing
216
+ // that says WHICH empty state this is (`inspector-section-registry.ts`'s
217
+ // `InspectorSectionMatchContext`). Resolving it after meant a contribution
218
+ // scoped to one empty-state subject appeared in all of them.
219
+ const nullSubject = nodeId
220
+ ? null
221
+ : describeNullInspectionSubject({ adapter, surface, store, onEdit });
222
+ const contributions = nodeId
223
+ ? node
224
+ ? matchedInspectorSections(node, adapter)
225
+ : []
226
+ : matchedInspectorSections(null, adapter, { nullSubjectId: nullSubject?.id ?? null });
227
+ const subject = composeInspectionSubject({
228
+ adapter,
229
+ nodeId,
230
+ node,
231
+ surface,
232
+ contributions,
233
+ ...(nodeId ? {} : { nullSubject }),
234
+ // Outside Asset Lab the Inspector mounts an isolated native snapshot.
235
+ // Asset Lab already owns that native viewport, so `canvasPreviewFor`
236
+ // supplies a one-shot capture instead of a second live render loop.
237
+ previewObject:
238
+ (nodeId === null || surface === 'asset-lab'
239
+ ? null
240
+ : entityObject3D(adapter, store.objectMap, nodeId)) ?? null,
241
+ canvasPreview: canvasPreviewFor(adapter, nodeId, surface),
242
+ assetDocument:
243
+ nodeId && store.objectMap.has(nodeId)
244
+ ? { open: () => openEntityAssetDocument(store, nodeId) }
245
+ : null,
246
+ stories: resolveComposeStoriesInput(adapter, node, nodeId),
247
+ // A DOCUMENT WHOSE PACKAGE OWNS ITS PROPERTIES RAIL stands the shell's own
248
+ // sections down (`inspection/compose.ts`, `OwnedInspectorRail`).
249
+ ...(ownedInspectorRail() ?? {}),
250
+ // The box describes ONE node; a gizmo drag moves every selected one.
251
+ // Say how many, so a three-object drag is not headed by a single name
252
+ // (`InspectionSubject.alsoSelected`). Only the SHARED store selection
253
+ // counts: a document that supplies its own selection is answering for
254
+ // itself and the scene's selection is not what its reader is looking at.
255
+ ...(documentSelection === null && nodeId !== null && store.selectedEntityIds.size > 1
256
+ ? { alsoSelected: store.selectedEntityIds.size - 1 }
257
+ : {}),
258
+ onEdit,
259
+ });
260
+ return {
261
+ subject,
262
+ available: nodeId !== null || nullSubject !== null || contributions.length > 0,
263
+ };
264
+ }
265
+
266
+ /**
267
+ * The subject showing right now, resolved into the ONE
268
+ * {@link InspectionDisplay} every consumer reads: the composed subject, the
269
+ * surface it belongs to, whether there is an inspector at all, and which
270
+ * projection is showing it. `components/Inspector.tsx` renders it,
271
+ * the workspace host gates the dock panel and the floating card
272
+ * on it, and `inspectActiveSubject` serializes it — all from this one call,
273
+ * so no consumer can reach a different answer (see `inspection/display.ts`).
274
+ */
275
+ export function describeActiveInspectionSubject(store: EditorShellStore): InspectionDisplay {
276
+ const surface = activeInspectionSurface(store);
277
+ const { adapter, documentSelection } = resolvePanelAuthoring(store);
278
+ const composed = composeInspectionForBinding({
279
+ store,
280
+ adapter,
281
+ documentSelection,
282
+ surface,
283
+ });
284
+ const { subject } = composed;
285
+ // DECISION (2026-08-14, owner-reported): a project-TOOL document owns its
286
+ // whole surface, so the scene's inspector must not float over it.
287
+ //
288
+ // `resolvePanelAuthoring` has no tool-document branch, so with the Data sheet
289
+ // active it falls through to the scene's composite adapter and composes
290
+ // whatever was selected in the 3D scene BEFORE the tab switch — the compact
291
+ // card then renders over a document that is not its subject's (measured
292
+ // live: active document `tool:data-tables.document`, `editor.inspect()`
293
+ // answering `world:world` at surface `three`, presentation `card`).
294
+ //
295
+ // The test is the same POSITIVE shape `active-surface.ts` uses for Asset Lab:
296
+ // does the ACTIVE tool document publish its own inspection context? A tool
297
+ // document that does (the humanoid builder's Object3D preview publishes a
298
+ // `WorkspaceDocumentSelection`) keeps its inspector, because that inspector
299
+ // IS the document's. One that does not is being described by another
300
+ // document's selection, and per the inspector doctrine — "with nothing
301
+ // selected the inspector shows nothing" — nothing is what it gets.
302
+ const available =
303
+ composed.available &&
304
+ (subject.id !== GAME_SUBJECT_ID || subject.sections.length > 0) &&
305
+ !inspectorBelongsToAnotherDocument({
306
+ activeDocumentKind: activeWorkspaceDocument()?.descriptor.kind ?? null,
307
+ documentSelection,
308
+ });
309
+ const report = activeWorkspaceDocumentId() === GAME_DOCUMENT_ID ? liveCoverage() : null;
310
+ if (report) {
311
+ const coverage = ingestCoverageSection(report);
312
+ const coverageSubject: InspectionSubject = available
313
+ ? {
314
+ ...subject,
315
+ sections: [
316
+ ...subject.sections.filter((section) => section.id !== coverage.id),
317
+ coverage,
318
+ ].sort((a, b) => a.order - b.order),
319
+ }
320
+ : {
321
+ id: `ingest:${report.summary.worldId}`,
322
+ title: 'Ingested game',
323
+ identity: null,
324
+ hint: 'This mount exposes no editable scene subject. Coverage below says exactly which editor seams it did earn.',
325
+ presentation: subject.presentation,
326
+ quickActions: [],
327
+ related: [],
328
+ sections: [coverage],
329
+ };
330
+ return resolveInspectionDisplay({
331
+ subject: coverageSubject,
332
+ surface,
333
+ available: true,
334
+ override: inspectorPresentationOverride(surface),
335
+ workspaceDefault: activeChromeRegions().inspector ?? null,
336
+ });
337
+ }
338
+ return resolveInspectionDisplay({
339
+ subject,
340
+ surface,
341
+ available,
342
+ override: inspectorPresentationOverride(surface),
343
+ workspaceDefault: activeChromeRegions().inspector ?? null,
344
+ });
345
+ }
346
+
347
+ /**
348
+ * The active inspection subject as JSON — the whole of `editor.inspect`'s
349
+ * browser side.
350
+ *
351
+ * It reads the SAME `available` flag the dock and the card gate on, so the
352
+ * wire cannot claim a subject the human is not being shown: with nothing
353
+ * selected on a surface that has no empty-state subject, the box unmounts and
354
+ * this answers {@link NO_INSPECTION}. Serializing the composed subject anyway
355
+ * would report a placeholder nobody is looking at as though it were the
356
+ * inspector's contents — the fabrication the anti-shim rule names, on the one
357
+ * surface that exists to be believed.
358
+ */
359
+ export function inspectActiveSubject(store: EditorShellStore): SerializedInspection {
360
+ const { subject, surface, presentation, available } = describeActiveInspectionSubject(store);
361
+ if (!available) return NO_INSPECTION;
362
+ return serializeInspectionSubject(subject, { surface, presentation });
363
+ }
364
+
365
+ /** Run one verb from the active Inspector's own composed subject.
366
+ *
367
+ * This is the action counterpart to {@link setActiveInspectionField}: the
368
+ * control plane resolves the same action the human projection renders and
369
+ * awaits that action's own completion. It deliberately takes no entity id —
370
+ * the active Inspector subject is the address, just as it is for field edits.
371
+ */
372
+ export async function runActiveInspectionAction(
373
+ store: EditorShellStore,
374
+ actionId: string,
375
+ ): Promise<SerializedInspection> {
376
+ const { subject, available } = describeActiveInspectionSubject(store);
377
+ if (!available) throw new Error('No Inspector subject is active.');
378
+ const matches = subject.quickActions.filter((action) => action.id === actionId);
379
+ if (matches.length !== 1) {
380
+ const availableActions = subject.quickActions.map((action) => action.id);
381
+ throw new Error(
382
+ matches.length === 0
383
+ ? `Inspector action ${JSON.stringify(actionId)} is not available. ` +
384
+ (availableActions.length > 0
385
+ ? `Available actions: ${availableActions.join(', ')}.`
386
+ : 'This subject exposes no actions.')
387
+ : `Inspector action id ${JSON.stringify(actionId)} is ambiguous (${matches.length} matches).`,
388
+ );
389
+ }
390
+ const action = matches[0];
391
+ if (!action || action.disabled) {
392
+ throw new Error(`Inspector action ${JSON.stringify(actionId)} is disabled.`);
393
+ }
394
+ await action.run();
395
+ return inspectActiveSubject(store);
396
+ }
397
+
398
+ function assertInspectionFieldValue(field: FieldDescriptor, value: unknown): void {
399
+ const invalid = (expected: string): never => {
400
+ throw new Error(`Inspector field ${JSON.stringify(field.path)} expects ${expected}.`);
401
+ };
402
+ if (field.type === 'number' && (typeof value !== 'number' || !Number.isFinite(value))) {
403
+ invalid('a finite number');
404
+ }
405
+ if (field.type === 'boolean' && typeof value !== 'boolean') invalid('a boolean');
406
+ if (
407
+ (field.type === 'string' ||
408
+ field.type === 'color' ||
409
+ field.type === 'asset' ||
410
+ field.type === 'enum') &&
411
+ typeof value !== 'string'
412
+ ) {
413
+ invalid('a string');
414
+ }
415
+ if (
416
+ field.type === 'vec3' &&
417
+ (!Array.isArray(value) ||
418
+ value.length !== 3 ||
419
+ value.some((component) => typeof component !== 'number' || !Number.isFinite(component)))
420
+ ) {
421
+ invalid('three finite numbers');
422
+ }
423
+ if (field.type === 'enum' && field.options && !field.options.includes(value)) {
424
+ throw new Error(
425
+ `Inspector field ${JSON.stringify(field.path)} accepts: ${field.options.map(String).join(', ')}.`,
426
+ );
427
+ }
428
+ }
429
+
430
+ /**
431
+ * Write one field through the same live Inspector IO the human projection uses,
432
+ * and report WHERE THAT WRITE went.
433
+ *
434
+ * The destination is not decoration. With no persistence route open — the
435
+ * structural lane over a fiber world, or an ingest root that is playing rather
436
+ * than held — the write lands on the live object, journals live-only and
437
+ * changes no byte. That is the product working as designed, but silence about
438
+ * it is indistinguishable from a write that vanished, and a caller diffing the
439
+ * tree to find out will call the healthy case a defect. So `persisted: false`
440
+ * is an ANSWER.
441
+ *
442
+ * THE ACK COMES FROM THE WRITE, not from the surface. It is whatever the
443
+ * persistence pipe returned to the provider that performed THIS edit
444
+ * (`authoring/write-pipe.ts`), handed straight up through `io.set`. Reading a
445
+ * destination off the ACTIVE ADAPTER afterwards is what this replaced: the
446
+ * composite joined only its persist-capable children, so a three-root edit
447
+ * acked the DOM root's file with `persisted: true` — measured on the vendored
448
+ * racing game. An io that performed no persisted write returns nothing, and
449
+ * the live-only floor below is the honest answer for it; there is deliberately
450
+ * no fallback that reads a destination from anywhere else.
451
+ */
452
+ export async function setActiveInspectionField(
453
+ store: EditorShellStore,
454
+ path: string,
455
+ value: unknown,
456
+ ): Promise<{ subject: SerializedInspection; write: WriteAck }> {
457
+ const match = resolveWritableField(store, path);
458
+ assertInspectionFieldValue(match.field, value);
459
+ const write = (await match.io.set(path, value)) ?? LIVE_ONLY_ACK;
460
+ return { subject: inspectActiveSubject(store), write };
461
+ }
462
+
463
+ /** One editable path in the active Inspector, with the io that owns it. */
464
+ interface FieldMatch {
465
+ readonly field: FieldDescriptor;
466
+ readonly io: InspectionFieldIo;
467
+ }
468
+
469
+ /**
470
+ * Resolve ONE writable field of the active subject — the shared front half of
471
+ * every field door (`set` and `remove`), so the two cannot disagree about which
472
+ * io owns a path or about what "no such field" means.
473
+ */
474
+ function resolveWritableField(store: EditorShellStore, path: string): FieldMatch {
475
+ const { subject, available } = describeActiveInspectionSubject(store);
476
+ if (!available) throw new Error('No Inspector subject is active.');
477
+ const subjectMatches = (subject.editable?.fields ?? [])
478
+ .filter((field) => field.path === path)
479
+ .map((field) => ({ field, io: subject.editable!.io }));
480
+ const sectionMatches = subject.sections.flatMap((section) => {
481
+ // A custom body's `editable` is the same (fields, io) pair a fields body
482
+ // is, declared by a section that draws its own chrome — the Transform
483
+ // section is the shipped one. Reading them together is what keeps ONE
484
+ // write path per field.
485
+ const body = section.body;
486
+ const editable =
487
+ body.kind === 'fields'
488
+ ? { fields: body.fields, io: body.io }
489
+ : body.kind === 'custom'
490
+ ? body.editable
491
+ : undefined;
492
+ if (!editable) return [];
493
+ return editable.fields
494
+ .filter((field) => field.path === path)
495
+ .map((field) => ({ field, io: editable.io }));
496
+ });
497
+ const matches = [...subjectMatches, ...sectionMatches];
498
+ if (matches.length === 0) {
499
+ throw new Error(`The active Inspector has no field at ${JSON.stringify(path)}.`);
500
+ }
501
+ if (matches.length > 1) {
502
+ throw new Error(`The active Inspector exposes ${JSON.stringify(path)} more than once.`);
503
+ }
504
+ const match = matches[0]!;
505
+ if (match.field.readonly) {
506
+ throw new Error(
507
+ `Inspector field ${JSON.stringify(path)} is read-only: ${fieldReadonlyReason(match.field)}`,
508
+ );
509
+ }
510
+ return match;
511
+ }
512
+
513
+ /**
514
+ * The refusal a caller must be able to tell apart from every other one: this
515
+ * lane cannot express byte-absence for this field, so nothing was attempted.
516
+ *
517
+ * It is NOT a failure of the removal — it is the absence of the door. The
518
+ * distinction is the whole reason the class exists: an instrument grading an
519
+ * edit/revert round trip must report a missing seam as UNVERIFIABLE and a
520
+ * removal that ran and left the bytes changed as FAILED, and prose cannot be
521
+ * matched on. `command-listener.ts` turns this into the wire's
522
+ * `code: 'REMOVAL_UNAVAILABLE'`.
523
+ */
524
+ export class InspectionRemovalUnavailableError extends Error {
525
+ constructor(message: string) {
526
+ super(message);
527
+ this.name = 'InspectionRemovalUnavailableError';
528
+ }
529
+ }
530
+
531
+ /**
532
+ * REMOVE one field's authored override through the same Inspector IO the human
533
+ * revert arrow uses, and report WHERE THAT REMOVAL went.
534
+ *
535
+ * ## Why this exists beside {@link setActiveInspectionField}
536
+ *
537
+ * `set` writes a VALUE, and a value is not the same thing as an absence. When
538
+ * an authoring gesture adds a prop the source did not carry — the append path
539
+ * in every dialect writer — reverting it through the value door writes the
540
+ * default back EXPLICITLY (`position={[0, 0, 0]}`), so the file is left one
541
+ * attribute heavier than it started. Byte-level revert is then impossible
542
+ * through the protocol, which is exactly what `scripts/doctor-walk.ts` measured
543
+ * as "BOTH product doors failed to revert" on a healthy lane.
544
+ *
545
+ * ## What it will NOT do
546
+ *
547
+ * It never falls back to a value write, and it never guesses what absence means
548
+ * for a dialect. Two declarations gate it, both read rather than inferred:
549
+ * the descriptor's own `resettable` (the adapter saying removal is legal here)
550
+ * and the io's `remove` (the lane saying it has a door at all). Missing either
551
+ * one raises {@link InspectionRemovalUnavailableError} — a NAMED refusal an
552
+ * instrument can grade as an unreached seam, never a silent no-op and never a
553
+ * write that pretends to be a revert.
554
+ */
555
+ export async function removeActiveInspectionField(
556
+ store: EditorShellStore,
557
+ path: string,
558
+ ): Promise<{ subject: SerializedInspection; write: WriteAck }> {
559
+ const match = resolveWritableField(store, path);
560
+ if (match.field.resettable !== true) {
561
+ throw new InspectionRemovalUnavailableError(
562
+ `Inspector field ${JSON.stringify(path)} does not declare itself removable ` +
563
+ "(`resettable`), so this lane has no way to express the property's absence. " +
564
+ 'Write a value with `set-inspection-field` instead — and note that doing so cannot ' +
565
+ 'restore byte-absence for a property an edit ADDED.',
566
+ );
567
+ }
568
+ if (!match.io.remove) {
569
+ throw new InspectionRemovalUnavailableError(
570
+ `The Inspector io that owns ${JSON.stringify(path)} implements no removal door, so the ` +
571
+ "property's authored override cannot be dropped through this editor. The dialect writer " +
572
+ 'that owns this source edit owns removal too; until it does, an edit/revert round trip ' +
573
+ 'over this lane is unverifiable at byte level.',
574
+ );
575
+ }
576
+ const write = (await match.io.remove(path)) ?? LIVE_ONLY_ACK;
577
+ return { subject: inspectActiveSubject(store), write };
578
+ }