@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,357 @@
1
+ /**
2
+ * The SERIALIZED projection of the inspection model — Layer 3's fourth
3
+ * projection, and the agent surface (design: `docs/ARCHITECTURE-CORE.md`
4
+ * §Editor chrome, "The Inspection Model" … "and later a serialized export
5
+ * (`editor.inspect`) — the Figma-Inspect analog and the agent surface";
6
+ * build ledger: `docs/WORK.md` §Inspection Model program, W4).
7
+ *
8
+ * It is the same kind of thing the column and the compact card are: a DUMB
9
+ * projection that reads identity/order/title/body off an
10
+ * {@link InspectionSubject} and knows nothing about content. The only thing
11
+ * it does that the visual projections do not is READ THE VALUES — a field
12
+ * descriptor is an address, and an agent asking "what is this thing" wants
13
+ * the value at that address, so a `fields` body is serialized through the
14
+ * section's OWN `io.get`, the same io the field rows edit through.
15
+ *
16
+ * Three rules this projection is built on:
17
+ *
18
+ * - **Opaque rendering stays opaque.** `render()` is never called and React
19
+ * is never touched. A custom body may still own the model's ordinary
20
+ * descriptor channel; those fields serialize through their existing io so
21
+ * custom chrome cannot hide scriptable paths or their refusal reasons.
22
+ * - **MIXED is a distinguished marker, not a missing value.** A field whose
23
+ * subjects disagree serializes as `{mixed: true}` with no `value` — an
24
+ * agent must be able to tell "they disagree" from "it is unset", which is
25
+ * exactly why the sentinel is in the value model at all.
26
+ * - **Icons are not data.** An `IconDefinition` is Font Awesome's render
27
+ * payload; an agent has no use for path geometry, and its `iconName` says
28
+ * nothing the section's `title` doesn't. Omitted outright.
29
+ *
30
+ * Pure and React-free: subject in, JSON-safe object out. The live half —
31
+ * "which subject is showing right now" — is `inspection/active-subject.ts`.
32
+ */
33
+
34
+ import type {
35
+ FieldDescriptor,
36
+ InspectionFieldIo,
37
+ InspectionPresentation,
38
+ InspectionSection,
39
+ InspectionSectionData,
40
+ InspectionSubject,
41
+ InspectionSurfaceKind,
42
+ } from './model';
43
+ import { fieldReadonlyReason, isMixed } from './model';
44
+
45
+ /** How deep {@link toJsonSafe} walks a structured value before giving up. A
46
+ * `json`-typed descriptor can address an arbitrary blob; three levels covers
47
+ * every shape the field vocabulary actually produces (vec3, colour tuples,
48
+ * option lists, small records) without risking an unbounded walk. */
49
+ const MAX_VALUE_DEPTH = 3;
50
+
51
+ /** One field, with the value currently at its `path`. */
52
+ export interface SerializedInspectionField {
53
+ /** The stable scriptable address — the SAME one agents script against. */
54
+ readonly path: string;
55
+ readonly label: string;
56
+ readonly type: FieldDescriptor['type'];
57
+ /** The current value, JSON-safe. Absent when the value is `undefined`
58
+ * (nothing at that address) or when `mixed` is set. */
59
+ readonly value?: unknown;
60
+ /** The subjects disagree about this field (the model's MIXED sentinel). */
61
+ readonly mixed?: true;
62
+ /** The value shown is the DECLARED DEFAULT — the document does not carry it. */
63
+ readonly defaulted?: boolean;
64
+ readonly readonly?: boolean;
65
+ /** The same adapter-authored sentence the disabled field and write refusal use. */
66
+ readonly readonlyReason?: string;
67
+ readonly resettable?: boolean;
68
+ readonly revertsTo?: string;
69
+ readonly group?: string;
70
+ readonly options?: readonly unknown[];
71
+ }
72
+
73
+ export type SerializedInspectionBody =
74
+ /** `data`, when present, is the producer's published display values riding
75
+ * BESIDE the field list (the Element section's class chips and active
76
+ * breakpoint are the shipped case): facts the section shows that are not
77
+ * themselves writable fields. */
78
+ | {
79
+ readonly kind: 'fields';
80
+ readonly fields: readonly SerializedInspectionField[];
81
+ readonly data?: Record<string, unknown>;
82
+ }
83
+ /** A block the model does not model. Named, never rendered or introspected —
84
+ * plus, when the producer published one, the body's own displayed VALUES
85
+ * (`InspectionSectionData`; the Transform section is the shipped case). */
86
+ | {
87
+ readonly kind: 'custom';
88
+ readonly id: string;
89
+ readonly title: string;
90
+ readonly data?: Record<string, unknown>;
91
+ }
92
+ /** The subject's live preview. Named opaque for the same reason a custom
93
+ * body is — there is nothing in a rendered viewport for an agent to read —
94
+ * but distinguished, because "this thing has a live preview" is a real
95
+ * fact about the subject that the section list would otherwise not carry. */
96
+ | { readonly kind: 'preview'; readonly id: string; readonly title: string };
97
+
98
+ export interface SerializedInspectionSection {
99
+ readonly id: string;
100
+ readonly title: string;
101
+ readonly order: number;
102
+ readonly description?: string;
103
+ readonly body: SerializedInspectionBody;
104
+ }
105
+
106
+ /** A subject verb, as data: what it is called and (for a toggle) its state. */
107
+ export interface SerializedInspectionAction {
108
+ readonly id: string;
109
+ readonly title: string;
110
+ readonly label?: string;
111
+ /** Toggle state, for verbs that have one. The visibility eye is the worked
112
+ * case: `visible` is lifted OUT of the descriptor grid onto the identity
113
+ * row, so this flag is the ONLY place an agent can read it — without it
114
+ * the answer would only be recoverable by prose-matching `title`. */
115
+ readonly pressed?: boolean;
116
+ readonly disabled?: boolean;
117
+ }
118
+
119
+ export interface SerializedSubjectLink {
120
+ readonly id: string;
121
+ readonly title: string;
122
+ }
123
+
124
+ export interface SerializedInspectionSubject {
125
+ readonly id: string;
126
+ readonly title: string;
127
+ /** What to CALL this thing's type (+ seam provenance). Absent when there is
128
+ * no identity row (the no-selection subject). */
129
+ readonly kindLabel?: string;
130
+ /** The identity row's own line, verbatim — for an ingest mount that is where
131
+ * the object came FROM (`Source · game.js:271`), which is the fact every
132
+ * question about writing it back starts at. */
133
+ readonly note?: string;
134
+ /** The quiet line a subject with nothing to edit explains itself with. */
135
+ readonly hint?: string;
136
+ /** How many OTHER nodes are selected alongside this one. "The agent reads
137
+ * what the human sees" is only true if the agent also learns that a gizmo
138
+ * gesture here would move more than the subject it is reading. */
139
+ readonly alsoSelected?: number;
140
+ /** Which surface this subject belongs to, and how it is presented: the
141
+ * subject's own affinity, plus the presentation ACTUALLY showing when the
142
+ * caller resolved one (`inspector-presentation.ts` — the subject cannot
143
+ * know it, since a user override lives outside the model). */
144
+ readonly presentation: {
145
+ readonly preferred: InspectionPresentation;
146
+ readonly resolved?: InspectionPresentation;
147
+ readonly surface?: InspectionSurfaceKind;
148
+ };
149
+ readonly quickActions: readonly SerializedInspectionAction[];
150
+ readonly related: readonly SerializedSubjectLink[];
151
+ readonly sections: readonly SerializedInspectionSection[];
152
+ }
153
+
154
+ /**
155
+ * NOTHING is being inspected — the wire's answer when the inspector itself is
156
+ * unmounted (owner, 2026-08-07: with nothing selected the human sees no
157
+ * inspector, and the agent surface must say the same thing).
158
+ *
159
+ * It is an explicit marker rather than `null` because absence is already
160
+ * spoken for at every hop of this wire: the browser answering nothing, the
161
+ * relay timing out, and a session with no attached tab all arrive as a
162
+ * missing value, which the operation reports as `INSPECTION_UNAVAILABLE`
163
+ * ("nobody answered"). "Somebody answered, and the answer is that there is
164
+ * nothing to inspect" is a DIFFERENT fact, and it deserves a token that
165
+ * survives the same hops — an object, which every layer already carries
166
+ * unchanged, and which prints as `{none: true}` in a `vgai eval` rather than
167
+ * as a bare `null` an agent would read as a failure.
168
+ */
169
+ export interface SerializedNoInspection {
170
+ readonly none: true;
171
+ }
172
+
173
+ /** What `editor.inspect` answers: the subject showing, or {@link NO_INSPECTION}. */
174
+ export type SerializedInspection = SerializedInspectionSubject | SerializedNoInspection;
175
+
176
+ export const NO_INSPECTION: SerializedNoInspection = Object.freeze({ none: true as const });
177
+
178
+ /** What the live shell knows that a pure subject cannot: which surface it is,
179
+ * and which projection the user is actually looking at. */
180
+ export interface SerializedInspectionContext {
181
+ readonly surface: InspectionSurfaceKind;
182
+ readonly presentation: InspectionPresentation;
183
+ }
184
+
185
+ function isPlainObject(value: object): boolean {
186
+ const proto = Object.getPrototypeOf(value) as object | null;
187
+ return proto === Object.prototype || proto === null;
188
+ }
189
+
190
+ /**
191
+ * Narrow an arbitrary property value to something that survives
192
+ * `JSON.stringify` intact.
193
+ *
194
+ * Primitives pass through; arrays and plain objects are walked to
195
+ * {@link MAX_VALUE_DEPTH}. Anything else — a live `THREE.Color`, a texture, a
196
+ * function, a DOM node — becomes `{kind:'opaque', type}` rather than being
197
+ * dropped or half-flattened: "there is a value here and it is a Texture" is
198
+ * true and useful, while an empty object would read as "an empty value" and a
199
+ * silent omission would read as "unset". Both of those are the anti-shim
200
+ * rule's fabrication, one field at a time.
201
+ */
202
+ export function toJsonSafe(value: unknown, depth = 0): unknown {
203
+ if (value === null) return null;
204
+ const type = typeof value;
205
+ if (type === 'string' || type === 'boolean') return value;
206
+ // `-0` is a finite number that does NOT survive the wire: `JSON.stringify`
207
+ // writes it as `0`, so a serialized value and its parse would differ — and
208
+ // the round trip is the property this whole projection is judged on. It
209
+ // reaches here for real (an identity quaternion converted to Euler degrees
210
+ // yields `-0` on two axes), and no reader has ever wanted the sign of zero.
211
+ if (type === 'number') {
212
+ if (!Number.isFinite(value)) return { kind: 'opaque', type: 'number' };
213
+ return value === 0 ? 0 : value;
214
+ }
215
+ if (type !== 'object') return { kind: 'opaque', type };
216
+ if (depth >= MAX_VALUE_DEPTH) return { kind: 'opaque', type: constructorName(value as object) };
217
+ if (Array.isArray(value)) return value.map((item) => toJsonSafe(item, depth + 1));
218
+ const object = value as object;
219
+ if (!isPlainObject(object)) return { kind: 'opaque', type: constructorName(object) };
220
+ const out: Record<string, unknown> = {};
221
+ for (const [key, item] of Object.entries(object)) {
222
+ if (item !== undefined) out[key] = toJsonSafe(item, depth + 1);
223
+ }
224
+ return out;
225
+ }
226
+
227
+ function constructorName(value: object): string {
228
+ return (value.constructor as { name?: string } | undefined)?.name ?? 'object';
229
+ }
230
+
231
+ function serializeField(field: FieldDescriptor, io: InspectionFieldIo): SerializedInspectionField {
232
+ // Read through the SECTION's own io — the same one the field rows write
233
+ // through — so an agent's read and a human's read cannot diverge.
234
+ let raw: unknown;
235
+ try {
236
+ raw = io.get(field.path);
237
+ } catch {
238
+ // A descriptor whose backing object went away mid-read is a value we do
239
+ // not have, not a failed inspection: the rest of the subject is still
240
+ // true and reporting it is more useful than throwing the whole read away.
241
+ raw = undefined;
242
+ }
243
+ return {
244
+ path: field.path,
245
+ label: field.label,
246
+ type: field.type,
247
+ ...(isMixed(raw) ? { mixed: true as const } : {}),
248
+ ...(!isMixed(raw) && raw !== undefined ? { value: toJsonSafe(raw) } : {}),
249
+ ...(field.defaulted !== undefined ? { defaulted: field.defaulted } : {}),
250
+ ...(field.readonly !== undefined ? { readonly: field.readonly } : {}),
251
+ ...(field.readonly ? { readonlyReason: fieldReadonlyReason(field) } : {}),
252
+ ...(field.resettable !== undefined ? { resettable: field.resettable } : {}),
253
+ ...(field.revertsTo !== undefined ? { revertsTo: field.revertsTo } : {}),
254
+ ...(field.group !== undefined ? { group: field.group } : {}),
255
+ ...(field.options !== undefined
256
+ ? { options: field.options.map((option) => toJsonSafe(option)) }
257
+ : {}),
258
+ };
259
+ }
260
+
261
+ /** A custom body's published values, narrowed to the wire. Keys are the
262
+ * producer's own vocabulary; this projection reads none of them. */
263
+ function serializeSectionData(data: InspectionSectionData): Record<string, unknown> {
264
+ const out: Record<string, unknown> = {};
265
+ for (const [key, value] of Object.entries(data)) {
266
+ if (value !== undefined) out[key] = toJsonSafe(value);
267
+ }
268
+ return out;
269
+ }
270
+
271
+ function serializeBody(section: InspectionSection): SerializedInspectionBody {
272
+ const body = section.body;
273
+ if (body.kind === 'fields') {
274
+ return { kind: 'fields', fields: body.fields.map((field) => serializeField(field, body.io)) };
275
+ }
276
+ // An opaque body replaces RENDERING, never identity — so the identity the
277
+ // model kept IS the whole serialization. `render()` is not called.
278
+ //
279
+ // A custom body may ALSO have published its displayed values (P18: the
280
+ // Transform section's position/rotation/scale, which an agent could
281
+ // otherwise not read at all). They ride through untouched: the producer
282
+ // decided what the section says about itself, and a projection that
283
+ // reinterpreted it would be the content knowledge this layer removes.
284
+ if (body.kind === 'custom' && body.data !== undefined && body.editable === undefined) {
285
+ return {
286
+ kind: 'custom',
287
+ id: section.id,
288
+ title: section.title,
289
+ data: serializeSectionData(body.data),
290
+ };
291
+ }
292
+ // A custom body whose values ARE an ordinary descriptor channel is a FIELD
293
+ // LIST on this wire. Nothing here is rendered, so `custom` would be naming
294
+ // chrome the reader cannot see while hiding the one thing it can use: the
295
+ // whole react/DOM lane draws its own widgets over `STYLE_PROPERTIES`, so
296
+ // every section reported `kind: 'custom'` and `editor.inspect()` enumerated
297
+ // ZERO fields for a DOM element — 55 authorable style properties, reachable
298
+ // only by a caller that already knew their names. Identity is untouched:
299
+ // `SerializedInspectionSection` carries the id/title/order above.
300
+ if (body.kind === 'custom' && body.editable !== undefined) {
301
+ const editable = body.editable;
302
+ return {
303
+ kind: 'fields',
304
+ fields: editable.fields.map((field) => serializeField(field, editable.io)),
305
+ // Published display values ride beside the fields (see the wire type):
306
+ // dropping them when a body had BOTH halves would make adding a write
307
+ // door silently delete the read-only facts the section also shows.
308
+ ...(body.data !== undefined ? { data: serializeSectionData(body.data) } : {}),
309
+ };
310
+ }
311
+ return { kind: body.kind, id: section.id, title: section.title };
312
+ }
313
+
314
+ function serializeSection(section: InspectionSection): SerializedInspectionSection {
315
+ return {
316
+ id: section.id,
317
+ title: section.title,
318
+ order: section.order,
319
+ ...(section.description !== undefined ? { description: section.description } : {}),
320
+ body: serializeBody(section),
321
+ };
322
+ }
323
+
324
+ /**
325
+ * One inspection subject, as JSON.
326
+ *
327
+ * `context` is optional so the function stays testable as pure data-in/
328
+ * data-out; the live shell always passes it, because "which surface, and
329
+ * which projection is actually showing" is the one thing about a subject that
330
+ * the subject itself cannot answer.
331
+ */
332
+ export function serializeInspectionSubject(
333
+ subject: InspectionSubject,
334
+ context?: SerializedInspectionContext,
335
+ ): SerializedInspectionSubject {
336
+ return {
337
+ id: subject.id,
338
+ title: subject.title,
339
+ ...(subject.identity?.kindLabel ? { kindLabel: subject.identity.kindLabel } : {}),
340
+ ...(subject.identity?.note ? { note: subject.identity.note.text } : {}),
341
+ ...(subject.hint ? { hint: subject.hint } : {}),
342
+ ...(subject.alsoSelected ? { alsoSelected: subject.alsoSelected } : {}),
343
+ presentation: {
344
+ preferred: subject.presentation.preferred,
345
+ ...(context ? { resolved: context.presentation, surface: context.surface } : {}),
346
+ },
347
+ quickActions: subject.quickActions.map((action) => ({
348
+ id: action.id,
349
+ title: action.title,
350
+ ...(action.label !== undefined ? { label: action.label } : {}),
351
+ ...(action.pressed !== undefined ? { pressed: action.pressed } : {}),
352
+ ...(action.disabled !== undefined ? { disabled: action.disabled } : {}),
353
+ })),
354
+ related: subject.related.map(({ id, title }) => ({ id, title })),
355
+ sections: subject.sections.map(serializeSection),
356
+ };
357
+ }
@@ -0,0 +1,180 @@
1
+ /**
2
+ * `useActiveInspection` — the ONE reactive entry point to the inspection
3
+ * model, and the reason the dock and the inspector cannot disagree about
4
+ * which projection is showing.
5
+ *
6
+ * ## Why a hook and not "call the same function"
7
+ *
8
+ * Before this module, `components/Inspector.tsx` and
9
+ * the workspace host both resolved the active surface and then
10
+ * its presentation — the same expression, over DIFFERENT subscription sets. The inspector subscribed to
11
+ * the active adapter (`adapter.subscribe`); the dock did not. So when the
12
+ * active adapter changed under a document swap, the inspector re-rendered
13
+ * with the new surface and the dock kept the old one: the card floated over
14
+ * a dom document whose subject wanted the column, and the
15
+ * `workspace:inspector` panel never existed (measured live, 2026-08-06).
16
+ *
17
+ * Sharing a function is discipline; sharing a hook is structure. Every store
18
+ * the resolution reads is subscribed to HERE, once, so a consumer cannot
19
+ * under-subscribe — there is no per-consumer subscription list left to drift.
20
+ * The value returned is the whole {@link InspectionDisplay}
21
+ * (`inspection/display.ts`): the composed subject, its surface, whether an
22
+ * inspector exists, and which projection shows it, all derived from that one
23
+ * subject.
24
+ *
25
+ * It is not a store: it holds nothing. Every listed store already exists and
26
+ * already notifies; this hook only makes sure the same set backs every
27
+ * consumer of the resolution.
28
+ */
29
+
30
+ import { useEffect, useReducer, useRef, useSyncExternalStore } from 'react';
31
+ import { assetEditorContextVersion, subscribeAssetEditorContext } from '../asset-editor-context';
32
+ import {
33
+ assetInspectorActionsVersion,
34
+ subscribeAssetInspectorActions,
35
+ } from '../asset-inspector-actions';
36
+ import { assetSelectionVersion, subscribeAssetSelection } from '../asset-selection';
37
+ import { activeAuthoringVersion, subscribeActiveAuthoring } from '../authoring/active-adapter';
38
+ import { resolvePanelAuthoring } from '../authoring/panel-authoring';
39
+ import { recordAuthoringConsumerUse } from '../coverage/authoring-seam-evidence';
40
+ import { documentContextVersion, subscribeDocumentContexts } from '../document-context-registry';
41
+ import type { EditorShellStore } from '../editor-shell-store';
42
+ import {
43
+ inspectorPresentationVersion,
44
+ subscribeInspectorPresentation,
45
+ } from '../inspector-presentation';
46
+ import {
47
+ inspectorSectionRegistryVersion,
48
+ subscribeInspectorSectionRegistry,
49
+ } from '../inspector-section-registry';
50
+ import { subscribeToolContributionPlay, toolContributionPlayKey } from '../tool-contribution-play';
51
+ import {
52
+ subscribeWorkspaceDocuments,
53
+ workspaceDocumentRegistryVersion,
54
+ } from '../workspace-document-registry';
55
+ import { chromeRegionsVersion, subscribeChromeRegions } from '../workspace-regions';
56
+ import { describeActiveInspectionSubject } from './active-subject';
57
+ import type { InspectionDisplay } from './display';
58
+ import {
59
+ documentInspectionSubjectVersion,
60
+ subscribeDocumentInspectionSubject,
61
+ } from './document-subject';
62
+
63
+ /**
64
+ * The active inspection display, re-derived whenever anything it reads
65
+ * changes. Consumers: the inspector projections (`components/Inspector.tsx`),
66
+ * the workspace's physical gating (the workspace host) and the
67
+ * floating card's own chrome (`components/CompactInspectorCard.tsx`).
68
+ */
69
+ export function useActiveInspection(store: EditorShellStore): InspectionDisplay {
70
+ // 1. Selection, the scene, and reflected edits. Exact membership-only
71
+ // changes for an unrelated runtime object cannot change the active subject;
72
+ // selected replacement and conservative structural changes advance the
73
+ // shell snapshot at the store boundary.
74
+ useSyncExternalStore(store.subscribe, store.getShellSnapshot, store.getShellSnapshot);
75
+ // 2. Which document is active (the surface's first input).
76
+ useSyncExternalStore(
77
+ subscribeWorkspaceDocuments,
78
+ workspaceDocumentRegistryVersion,
79
+ workspaceDocumentRegistryVersion,
80
+ );
81
+ // 3. The adapter override slot — an ingest/document swap installs another.
82
+ useSyncExternalStore(subscribeActiveAuthoring, activeAuthoringVersion, activeAuthoringVersion);
83
+ // Play publishes the Game subject after async authoring setup has already
84
+ // notified the shell. Observe that publication even while no section is mounted.
85
+ useSyncExternalStore(
86
+ subscribeToolContributionPlay,
87
+ toolContributionPlayKey,
88
+ toolContributionPlayKey,
89
+ );
90
+ // 4. The user's per-surface presentation preference.
91
+ useSyncExternalStore(
92
+ subscribeInspectorPresentation,
93
+ inspectorPresentationVersion,
94
+ inspectorPresentationVersion,
95
+ );
96
+ // 4b. The active workspace's docked-layout choice beneath it
97
+ // (`workspace-regions.ts`) — a workspace switch re-lays the column.
98
+ useSyncExternalStore(subscribeChromeRegions, chromeRegionsVersion, chromeRegionsVersion);
99
+ // 5. Section contributions (project tools register asynchronously / on HMR).
100
+ useSyncExternalStore(
101
+ subscribeInspectorSectionRegistry,
102
+ inspectorSectionRegistryVersion,
103
+ inspectorSectionRegistryVersion,
104
+ );
105
+ // 5b. The verbs `asset.inspector` sections publish for the selected asset.
106
+ // They resolve asynchronously (the Edit Mesh door imports the module
107
+ // before it knows), so the subject that carries them has to re-derive
108
+ // when they land — exactly like (5).
109
+ useSyncExternalStore(
110
+ subscribeAssetInspectorActions,
111
+ assetInspectorActionsVersion,
112
+ assetInspectorActionsVersion,
113
+ );
114
+ // 6. The asset browser's transient selection — a contribution matches on it.
115
+ useSyncExternalStore(subscribeAssetSelection, assetSelectionVersion, assetSelectionVersion);
116
+ // 7. The open Asset Lab document — the `asset-lab` surface's own subject.
117
+ useSyncExternalStore(
118
+ subscribeAssetEditorContext,
119
+ assetEditorContextVersion,
120
+ assetEditorContextVersion,
121
+ );
122
+ // 7b. What the ACTIVE document says it is. A document whose own subject
123
+ // changes under a pick the adapters never see (the component boards)
124
+ // has no other way into this resolution.
125
+ useSyncExternalStore(
126
+ subscribeDocumentInspectionSubject,
127
+ documentInspectionSubjectVersion,
128
+ documentInspectionSubjectVersion,
129
+ );
130
+ // 7c. What the active document's PUBLISHED CONTEXT answers, when the package
131
+ // driving it says that moved (`document-context-registry.ts`'s
132
+ // `notifyDocumentContextChanged`, the SDK's `documents.contextChanged`).
133
+ // A context is a live handle: `@volter/editor-blender` reads the engine through
134
+ // its RNA door and the answer decides which Properties TABS a datablock
135
+ // has, and nothing in a host store moves when that answer lands.
136
+ useSyncExternalStore(subscribeDocumentContexts, documentContextVersion, documentContextVersion);
137
+ // 8. The adapter's OWN truth (hierarchy/props changes, and the mount that
138
+ // makes a root's adapter resolvable in the first place — the
139
+ // notification the dock was missing).
140
+ const [, forceAdapterUpdate] = useReducer((value: number) => value + 1, 0);
141
+ const { adapter } = resolvePanelAuthoring(store);
142
+ const observedStoreVersions = useRef({
143
+ broad: store.getSnapshot(),
144
+ shell: store.getShellSnapshot(),
145
+ });
146
+ observedStoreVersions.current = {
147
+ broad: store.getSnapshot(),
148
+ shell: store.getShellSnapshot(),
149
+ };
150
+ useEffect(() => {
151
+ const subscribe = adapter.subscribe;
152
+ if (!subscribe) return;
153
+ return recordAuthoringConsumerUse({
154
+ adapter,
155
+ seam: 'editor.subscribe',
156
+ stage: 'effect',
157
+ detail: 'the active Inspector subscribed to adapter-owned changes',
158
+ run: () =>
159
+ subscribe.call(adapter, () => {
160
+ const previous = observedStoreVersions.current;
161
+ const next = {
162
+ broad: store.getSnapshot(),
163
+ shell: store.getShellSnapshot(),
164
+ };
165
+ observedStoreVersions.current = next;
166
+ // A store-backed adapter reports through the same notification that
167
+ // already reaches the selector above. An exact object-map-only
168
+ // change advances only `broad` and cannot affect the selected
169
+ // subject; a shell change is already scheduled by the direct store
170
+ // subscription. A genuine adapter-only event advances neither and
171
+ // still owns this explicit re-render path (notably replaceChild).
172
+ if (next.broad === previous.broad && next.shell === previous.shell) {
173
+ forceAdapterUpdate();
174
+ }
175
+ }),
176
+ });
177
+ }, [adapter, store]);
178
+
179
+ return describeActiveInspectionSubject(store);
180
+ }