@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,501 @@
1
+ /**
2
+ * THE EDITOR WATCHES ITS OWN VITALS — the live half of
3
+ * `coverage/ontology-invariants.ts`.
4
+ *
5
+ * It reads the session's own singletons, hands the facts to the pure
6
+ * derivation, and pushes every violation into `editorConsole` as a warning
7
+ * sourced `invariant`. That is the whole integration: the console sync already
8
+ * forwards every warning to the server's unresolved-console ledger, so an
9
+ * ontology violation becomes a STANDING condition that rides the loudness
10
+ * banner on every `vgai` command until it stops recurring or somebody acks it
11
+ * by name. No new transport, no new door.
12
+ *
13
+ * ## What is measured, and what is honestly not
14
+ *
15
+ * Every fact here is read off something that already exists:
16
+ *
17
+ * - **loops** — the three runtimes the editor can enumerate (play, module,
18
+ * ingest). The row names them, so the scope of "Edit is static" is visible
19
+ * rather than implied.
20
+ * - **presented three roots** — the active authoring surface's own children
21
+ * (`authoring/mounted-root-subjects.ts`), which is what the hierarchy and
22
+ * the gizmo actually work over.
23
+ * - **frame cadence** — a rAF sampler owned by this module. Deliberately not
24
+ * the profiler's fps: the profiler measures the REGISTERED loop's callback,
25
+ * only exists while something registered one (play), and reads ~1ms while
26
+ * the tab crawls at 1.6fps because the budget went somewhere it cannot see.
27
+ * The question "is this visible tab still a direct-manipulation tool" is a
28
+ * question about the browser's frame cadence, and rAF is the instrument that
29
+ * answers it. One callback per frame, no allocation.
30
+ * - **play frames** — `PerformanceFrame.id`, a monotonic counter, off whatever
31
+ * render loop registered itself. Where no loop registered or its profiler is
32
+ * recording nothing, the fact is `null` and the row says UNMEASURED with
33
+ * that reason — never `ok`.
34
+ */
35
+
36
+ import { getAuthoringOverride } from '../authoring/active-adapter';
37
+ import { mountedRootSubjects } from '../authoring/mounted-root-subjects';
38
+ import { editorConsole } from '../editor-console';
39
+ import { editorIsPlaying } from '../editor-session-mode';
40
+ import { liveSessions } from '../live-session-registry';
41
+ import { allPerformanceSources } from '../performance-sources';
42
+ import {
43
+ anyCanvasHidesItself,
44
+ type CanvasVisibilityFact,
45
+ decideRevealFailsafe,
46
+ hiddenCanvasBreakdown,
47
+ presentingCanvasHiddenBy,
48
+ } from './canvas-reveal';
49
+ import { allDesignTimeSurfaces } from './design-time-surfaces';
50
+ import {
51
+ type DesignTimeSurfaceFact,
52
+ deriveOntologyInvariants,
53
+ formatInvariantWarning,
54
+ type OntologyFacts,
55
+ type OntologyInvariantRow,
56
+ } from './ontology-invariants';
57
+
58
+ /**
59
+ * THE SESSION'S PERIODIC SAMPLE, for anyone else who needs one.
60
+ *
61
+ * Published as `host.session.onSample` (`@volter/editor-sdk/host`). A lane with
62
+ * a periodic derivation of its own — the capability-coverage union is the
63
+ * first, and used to be a direct call in the tick below — subscribes here
64
+ * instead of starting a second interval, so the session is looked at once per
65
+ * cadence and every answer describes the same instant. Listeners run FIRST in
66
+ * the pass, which is where the coverage union sat when it was the host's.
67
+ *
68
+ * A listener that throws is not allowed to end the host's own vitals: the
69
+ * whole point of this watcher is that it cannot be turned off.
70
+ */
71
+ const _sampleListeners = new Set<() => void>();
72
+
73
+ export function onSessionSample(fn: () => void): () => void {
74
+ _sampleListeners.add(fn);
75
+ return () => {
76
+ _sampleListeners.delete(fn);
77
+ };
78
+ }
79
+
80
+ function fireSessionSample(): void {
81
+ for (const fn of [..._sampleListeners]) {
82
+ try {
83
+ fn();
84
+ } catch (error) {
85
+ editorConsole.error(`a session-sample subscriber threw: ${String(error)}`, 'invariant');
86
+ }
87
+ }
88
+ }
89
+
90
+ /** How often the vitals are derived and reported. Long enough that the check
91
+ * itself is free, short enough that a violation reaches the next `vgai`
92
+ * command a human would run. */
93
+ const SAMPLE_INTERVAL_MS = 5_000;
94
+
95
+ /** The rAF cadence sampler's window. One sample per frame, reset each interval. */
96
+ interface FrameSample {
97
+ frames: number;
98
+ since: number;
99
+ }
100
+
101
+ let _sample: FrameSample = { frames: 0, since: 0 };
102
+ let _rafHandle: number | null = null;
103
+ let _timer: ReturnType<typeof setInterval> | null = null;
104
+ let _playStartedAt: number | null = null;
105
+ let _lastRows: readonly OntologyInvariantRow[] = [];
106
+ const _pendingInvariantViolations = new Map<string, number>();
107
+
108
+ /** Why the canvas is not visible, in the measurement's own words, or `null`
109
+ * when it is. Reads the same three ways a canvas actually disappears in this
110
+ * editor: taken out of layout, styled invisible, or collapsed to nothing. */
111
+ function canvasHiddenReason(canvas: HTMLCanvasElement): string | null {
112
+ const style = window.getComputedStyle(canvas);
113
+ if (style.display === 'none') return 'display: none';
114
+ if (style.visibility === 'hidden') return 'visibility: hidden';
115
+ if (Number.parseFloat(style.opacity || '1') === 0) return 'opacity: 0';
116
+ const rect = canvas.getBoundingClientRect();
117
+ if (rect.width <= 0 || rect.height <= 0) return 'zero-size box';
118
+ return null;
119
+ }
120
+
121
+ /**
122
+ * The editor's OWN viewport canvas — the one whose visibility has a declared
123
+ * owner (`the world root's stage`'s `opacity: threejsSurface ? 1 : 0`, decided by
124
+ * `isThreejsSurfaceVisible`). Named here so the reveal failsafe can leave it
125
+ * alone; see `canvas-reveal.ts`'s header.
126
+ */
127
+ const EDITOR_VIEWPORT_CANVAS_TESTID = 'editor-canvas';
128
+
129
+ /** Which of the canvas' OWN inline style properties is what hides it, if any.
130
+ * Read off the inline `style` attribute rather than the computed value: a
131
+ * computed `visibility: hidden` inherited from an ancestor is somebody
132
+ * else's decision and must never be cleared here. */
133
+ function inlineHidingOf(canvas: HTMLCanvasElement): 'opacity' | 'visibility' | 'display' | null {
134
+ const inline = canvas.style;
135
+ if (inline.display === 'none') return 'display';
136
+ if (inline.visibility === 'hidden') return 'visibility';
137
+ if (inline.opacity !== '' && Number.parseFloat(inline.opacity) === 0) return 'opacity';
138
+ return null;
139
+ }
140
+
141
+ /** Every canvas on the page as `canvas-reveal.ts` reads them. */
142
+ function canvasFacts(): readonly CanvasVisibilityFact[] {
143
+ const canvases = [...document.querySelectorAll('canvas')];
144
+ return canvases.map((canvas, index): CanvasVisibilityFact => {
145
+ const testId = canvas.getAttribute('data-testid');
146
+ const rect = canvas.getBoundingClientRect();
147
+ return {
148
+ label: testId ?? (canvas.className || `canvas #${index}`),
149
+ area: Math.max(0, rect.width) * Math.max(0, rect.height),
150
+ hiddenBy: canvasHiddenReason(canvas),
151
+ inlineHiding: inlineHidingOf(canvas),
152
+ failsafeEligible: testId !== EDITOR_VIEWPORT_CANVAS_TESTID,
153
+ };
154
+ });
155
+ }
156
+
157
+ /** The monotonic frame id of whichever render loop is registered, or a reason
158
+ * nothing can be said. */
159
+ function playFrameFacts(): { framesDrawn: number | null; framesUnavailable: string | null } {
160
+ const sources = allPerformanceSources();
161
+ if (sources.length === 0) {
162
+ return {
163
+ framesDrawn: null,
164
+ framesUnavailable:
165
+ 'no render loop registered a performance source, so nothing counts this session’s frames',
166
+ };
167
+ }
168
+ let best: number | null = null;
169
+ for (const source of sources) {
170
+ const snapshot = source.profiler.getSnapshot();
171
+ const latest = snapshot.frames.at(-1);
172
+ if (latest) best = Math.max(best ?? 0, latest.id);
173
+ }
174
+ if (best === null) {
175
+ return {
176
+ framesDrawn: null,
177
+ framesUnavailable:
178
+ 'the registered render loop records no frames (its profiler has neither profiling nor telemetry enabled)',
179
+ };
180
+ }
181
+ return { framesDrawn: best, framesUnavailable: null };
182
+ }
183
+
184
+ /**
185
+ * The last content-clock reading per design-time surface, so the next sample can
186
+ * say whether it MOVED. A clock's absolute value means nothing on its own — the
187
+ * question is only ever "did it advance since we last looked", and comparing two
188
+ * readings is what makes camera orbit (which never touches this) irrelevant.
189
+ */
190
+ const _lastContentClock = new Map<string, number>();
191
+
192
+ /**
193
+ * The last TRANSPORT-ADVANCE reading per surface, sampled at the same instants
194
+ * as the clock above so the two answer for the same window: "content time
195
+ * moved" and "an engaged transport is what moved it"
196
+ * (`design-time-surfaces.ts` §THE TRANSPORT IS THE SANCTION).
197
+ */
198
+ const _lastTransportAdvances = new Map<string, number>();
199
+
200
+ /**
201
+ * PER SURFACE, not per Scene. Every live design-time surface — Asset Lab
202
+ * documents, story turntables, board exhibits, preview cards
203
+ * (`coverage/design-time-surfaces.ts`) — is asked for its own content clock, and
204
+ * a surface that publishes none is reported by name with that reason rather than
205
+ * assumed still.
206
+ */
207
+ function designTimeSurfaceFacts(): readonly DesignTimeSurfaceFact[] {
208
+ const live = allDesignTimeSurfaces();
209
+ const seen = new Set<string>();
210
+ const facts = live.map((surface): DesignTimeSurfaceFact => {
211
+ const { id, label } = surface;
212
+ seen.add(id);
213
+ // Sampled BEFORE the clock and carried through every return, so the
214
+ // transport reading and the clock reading always describe the same window.
215
+ let transportNow: number | null = null;
216
+ try {
217
+ transportNow = surface.transportAdvances?.() ?? null;
218
+ } catch {
219
+ transportNow = null;
220
+ }
221
+ const transportPrevious = _lastTransportAdvances.get(id);
222
+ if (transportNow === null) _lastTransportAdvances.delete(id);
223
+ else _lastTransportAdvances.set(id, transportNow);
224
+ const transportAdvanced =
225
+ transportNow === null || transportPrevious === undefined
226
+ ? {}
227
+ : { transportAdvanced: transportNow !== transportPrevious };
228
+ let reading: number | null;
229
+ try {
230
+ reading = surface.contentClock();
231
+ } catch (error) {
232
+ _lastContentClock.delete(id);
233
+ return {
234
+ id,
235
+ label,
236
+ advanced: null,
237
+ unavailable: `its content clock threw: ${String(error)}`,
238
+ ...transportAdvanced,
239
+ };
240
+ }
241
+ if (reading === null) {
242
+ _lastContentClock.delete(id);
243
+ return {
244
+ id,
245
+ label,
246
+ advanced: null,
247
+ unavailable: 'its content clock is temporarily unavailable',
248
+ ...transportAdvanced,
249
+ };
250
+ }
251
+ const now = reading;
252
+ const previous = _lastContentClock.get(id);
253
+ _lastContentClock.set(id, now);
254
+ if (previous === undefined) {
255
+ return {
256
+ id,
257
+ label,
258
+ advanced: null,
259
+ unavailable: 'first reading — nothing to compare it against yet',
260
+ ...transportAdvanced,
261
+ };
262
+ }
263
+ return { id, label, advanced: now !== previous, ...transportAdvanced };
264
+ });
265
+ for (const id of [..._lastContentClock.keys()]) if (!seen.has(id)) _lastContentClock.delete(id);
266
+ for (const id of [..._lastTransportAdvances.keys()]) {
267
+ if (!seen.has(id)) _lastTransportAdvances.delete(id);
268
+ }
269
+ return facts;
270
+ }
271
+
272
+ /** Assemble everything the checks read, from the live session. */
273
+ export function collectOntologyFacts(now: number = Date.now()): OntologyFacts {
274
+ const playing = editorIsPlaying();
275
+ const elapsed = _sample.since === 0 ? 0 : now - _sample.since;
276
+ const frames = _sample.frames;
277
+ const fps = elapsed > 0 && frames > 0 ? (frames * 1000) / elapsed : null;
278
+ const play = playing
279
+ ? {
280
+ startedMsAgo: _playStartedAt === null ? 0 : now - _playStartedAt,
281
+ ...playFrameFacts(),
282
+ }
283
+ : null;
284
+ return {
285
+ mode: playing ? 'play' : 'edit',
286
+ loops: [
287
+ ...liveSessions().map((session) => ({
288
+ name: `${session.id} session`,
289
+ running: session.mounted(),
290
+ })),
291
+ ...liveSessions().map((session) => ({
292
+ name: `${session.id} playing`,
293
+ running: session.playing(),
294
+ })),
295
+ ],
296
+ designTimeSurfaces: designTimeSurfaceFacts(),
297
+ presentedThreeRoots: getAuthoringOverride()
298
+ ? mountedRootSubjects()
299
+ .filter((root) => root.surface === 'three')
300
+ .map((root) => root.worldId)
301
+ : null,
302
+ ...(() => {
303
+ const canvases = canvasFacts();
304
+ return {
305
+ canvasHiddenBy: presentingCanvasHiddenBy(canvases),
306
+ canvasHidesItself: anyCanvasHidesItself(canvases),
307
+ hiddenCanvases: hiddenCanvasBreakdown(canvases),
308
+ };
309
+ })(),
310
+ framesProduced: _sample.since === 0 ? null : frames,
311
+ sampleWindowMs: _sample.since === 0 ? null : elapsed,
312
+ tabVisible: !document.hidden,
313
+ directManipulationExpected: navigator.webdriver !== true,
314
+ fps,
315
+ fpsUnavailable:
316
+ fps === null
317
+ ? _sample.since === 0
318
+ ? 'the frame sampler has not opened a window yet'
319
+ : 'no frame was produced in the sample window'
320
+ : null,
321
+ play,
322
+ };
323
+ }
324
+
325
+ /** The rows as the status facet serves them — always the full set, re-derived
326
+ * on read so a reader never gets a verdict older than the question. */
327
+ export function ontologyInvariantFacet(): readonly OntologyInvariantRow[] {
328
+ return deriveOntologyInvariants(collectOntologyFacts());
329
+ }
330
+
331
+ /** The rows from the last reporting pass — what the console has already said,
332
+ * for a caller that wants the reported set rather than a fresh derivation. */
333
+ export function lastReportedInvariants(): readonly OntologyInvariantRow[] {
334
+ return _lastRows;
335
+ }
336
+
337
+ /** When the all-hidden-while-drawing condition was FIRST seen, or `null` while
338
+ * the session has a presenting canvas. The failsafe's bounded window is
339
+ * measured from here, so a mount that is hidden for a moment never trips it. */
340
+ let _allHiddenSince: number | null = null;
341
+ /** Canvases this page-load already force-revealed. A failsafe is an emergency,
342
+ * never a policy: once each, then it stops (see `canvas-reveal.ts`). */
343
+ const _forceRevealed = new WeakSet<HTMLCanvasElement>();
344
+
345
+ /**
346
+ * Fire the reveal when nothing is presenting and frames are arriving anyway.
347
+ *
348
+ * The write is the narrowest one that can work: clear the ONE inline property
349
+ * on the canvas itself that the decision named. Everything else about how the
350
+ * canvas got hidden is left exactly as it was.
351
+ */
352
+ function runRevealFailsafe(facts: readonly CanvasVisibilityFact[], now: number): void {
353
+ const presenting = presentingCanvasHiddenBy(facts);
354
+ if (presenting === null || presenting === undefined) {
355
+ _allHiddenSince = null;
356
+ return;
357
+ }
358
+ if (_allHiddenSince === null) {
359
+ _allHiddenSince = now;
360
+ return;
361
+ }
362
+ const decision = decideRevealFailsafe({
363
+ canvases: facts,
364
+ framesProduced: _sample.frames,
365
+ hiddenForMs: now - _allHiddenSince,
366
+ });
367
+ if (!decision.fire) return;
368
+ const canvas = [...document.querySelectorAll('canvas')].find(
369
+ (element) =>
370
+ (element.getAttribute('data-testid') ?? element.className) === decision.target.label,
371
+ );
372
+ if (!canvas || _forceRevealed.has(canvas)) return;
373
+ _forceRevealed.add(canvas);
374
+ if (decision.target.inlineHiding === 'display') canvas.style.removeProperty('display');
375
+ if (decision.target.inlineHiding === 'visibility') canvas.style.removeProperty('visibility');
376
+ if (decision.target.inlineHiding === 'opacity') canvas.style.removeProperty('opacity');
377
+ editorConsole.error(decision.ledger, 'invariant');
378
+ }
379
+
380
+ /**
381
+ * Derive once and say every violation out loud.
382
+ *
383
+ * `editorConsole` collapses consecutive identical messages onto one entry and
384
+ * the server ledger SUMS the repeats, so a condition that keeps holding stays
385
+ * one loud, counted row rather than a flood — which is exactly why this can be
386
+ * a plain periodic check with no dedupe of its own.
387
+ */
388
+ export function reportOntologyInvariants(): readonly OntologyInvariantRow[] {
389
+ const rows = ontologyInvariantFacet();
390
+ _lastRows = rows;
391
+ for (const row of rows) {
392
+ const warning = formatInvariantWarning(row);
393
+ if (!warning) {
394
+ _pendingInvariantViolations.delete(row.id);
395
+ continue;
396
+ }
397
+ // A build, source remount, or Doctor capture can legitimately occupy two
398
+ // five-second main-thread windows while the visible editor is otherwise
399
+ // responsive. The FPS floor describes a stopped direct-manipulation tool,
400
+ // so require the condition to survive a third consecutive sample before
401
+ // filing a permanent ledger warning. The status facet remains immediate;
402
+ // only the irreversible console filing is stabilized.
403
+ if (row.id === 'visible-tab-fps-floor') {
404
+ const samples = (_pendingInvariantViolations.get(row.id) ?? 0) + 1;
405
+ _pendingInvariantViolations.set(row.id, samples);
406
+ if (samples < 3) continue;
407
+ }
408
+ editorConsole.warn(warning, 'invariant');
409
+ }
410
+ return rows;
411
+ }
412
+
413
+ /**
414
+ * Start watching. Idempotent, and it runs on EVERY realm.
415
+ *
416
+ * This used to bail on a host with no server ledger "to be loud into". That
417
+ * names a mechanism this watcher does not use. Nothing on this timer talks to
418
+ * a server:
419
+ *
420
+ * - {@link runRevealFailsafe} is a REPAIR, not a report — it clears the one
421
+ * inline property hiding a canvas. Gating it meant a blank hosted viewport
422
+ * was the one viewport that could never self-heal, which is precisely the
423
+ * realm where no `vgai` command can be run to diagnose it.
424
+ * - {@link reportOntologyInvariants} and every {@link onSessionSample}
425
+ * subscriber derive from in-memory registries and speak through
426
+ * `editorConsole`, an in-page store read by `useSyncExternalStore`. It
427
+ * renders in the editor's own Console on every realm, hosted included.
428
+ *
429
+ * The half that genuinely needs a Node host is the server-ledger PUSH, and it
430
+ * is gated where it lives (`console-sync.ts`'s `installConsoleSync`). One
431
+ * mechanism, one gate — not a second, wider gate on the watcher that merely
432
+ * shares a sentence with it.
433
+ *
434
+ * Returns the teardown so a test or a shutdown path can end it; the editor
435
+ * itself never stops watching, because a vitals check that can be turned off is
436
+ * a vitals check that will be off when it matters.
437
+ */
438
+ export function installSessionVitals(): () => void {
439
+ if (_timer !== null) return stopSessionVitals;
440
+ _sample = { frames: 0, since: Date.now() };
441
+ const tick = (): void => {
442
+ _sample.frames++;
443
+ _rafHandle = requestAnimationFrame(tick);
444
+ };
445
+ _rafHandle = requestAnimationFrame(tick);
446
+ _timer = setInterval(() => {
447
+ const playing = editorIsPlaying();
448
+ if (playing && _playStartedAt === null) _playStartedAt = Date.now();
449
+ if (!playing) _playStartedAt = null;
450
+ // EVERY periodic derivation about this session runs on THIS pass, the
451
+ // host's and a lane's alike. The capability-coverage union used to be a
452
+ // direct call here; it is `@vgai/game`'s now and subscribes through
453
+ // {@link onSessionSample}, which is why the door exists at all: one
454
+ // session, one cadence, one instant — a package timer beside this one
455
+ // would sample the same session a fraction of a second later and publish
456
+ // a second answer for one moment.
457
+ fireSessionSample();
458
+ // FIRE before reporting: the failsafe's whole point is that the row it
459
+ // would otherwise print describes a blank viewport the editor could have
460
+ // fixed. It runs on the same sample the row is derived from, so a fired
461
+ // reveal shows up as `ok` in the very next pass and as a loud ledger error
462
+ // in this one.
463
+ runRevealFailsafe(canvasFacts(), Date.now());
464
+ reportOntologyInvariants();
465
+ _sample = { frames: 0, since: Date.now() };
466
+ }, SAMPLE_INTERVAL_MS);
467
+ return stopSessionVitals;
468
+ }
469
+
470
+ /**
471
+ * Drop everything the vitals accumulated FOR THE PROJECT THAT JUST CLOSED,
472
+ * without stopping the watcher (the editor never stops watching — see
473
+ * {@link installSessionVitals}). Registered with `onProjectSessionEnd`.
474
+ *
475
+ * Every one of these is a claim about a specific project's session: the last
476
+ * invariant rows, the consecutive-violation counters that decide when a row is
477
+ * reported, the per-surface content-clock readings that decide whether a
478
+ * surface MOVED, and the play start time. Carried into the next project they
479
+ * become measurements attributed to a session that never made them — a
480
+ * violation counter two samples deep would fire on the new project's first
481
+ * sample.
482
+ */
483
+ export function resetSessionVitalsForNewProject(): void {
484
+ _sample = { frames: 0, since: _timer === null ? 0 : Date.now() };
485
+ _playStartedAt = null;
486
+ _allHiddenSince = null;
487
+ _lastRows = [];
488
+ _pendingInvariantViolations.clear();
489
+ _lastContentClock.clear();
490
+ }
491
+
492
+ export function stopSessionVitals(): void {
493
+ if (_rafHandle !== null) cancelAnimationFrame(_rafHandle);
494
+ if (_timer !== null) clearInterval(_timer);
495
+ _rafHandle = null;
496
+ _timer = null;
497
+ _sample = { frames: 0, since: 0 };
498
+ _playStartedAt = null;
499
+ _allHiddenSince = null;
500
+ _pendingInvariantViolations.clear();
501
+ }
@@ -0,0 +1,72 @@
1
+ /** Structural/operational evidence for one mounted SystemAdapters slot. */
2
+
3
+ import {
4
+ displayKeyedPhysics,
5
+ gradeSeamCarrier,
6
+ inspectSeamShape,
7
+ PHYSICS_2D_ADAPTER_SHAPE,
8
+ PHYSICS_ADAPTER_SHAPE,
9
+ type SeamEvidenceReceipt,
10
+ type SeamEvidenceVerdict,
11
+ type SeamShape,
12
+ SYSTEM_ADAPTERS_SHAPE,
13
+ SYSTEM_PROVIDER_SHAPES,
14
+ type SystemAdapters,
15
+ } from '@volter/editor-project/adapter';
16
+ import { liveSeamEvidence } from './live-seam-evidence';
17
+
18
+ const EPOCHS = new WeakMap<object, string>();
19
+ let nextEpoch = 1;
20
+
21
+ export function systemAdapterEpoch(value: object): string {
22
+ const found = EPOCHS.get(value);
23
+ if (found) return found;
24
+ const epoch = `system-${nextEpoch++}`;
25
+ EPOCHS.set(value, epoch);
26
+ return epoch;
27
+ }
28
+
29
+ export function inspectSystemAdapterSeam<K extends keyof SystemAdapters>(options: {
30
+ readonly slot: K;
31
+ readonly adapter: NonNullable<SystemAdapters[K]>;
32
+ readonly subject: string;
33
+ readonly epoch?: string | undefined;
34
+ readonly receipts?: readonly SeamEvidenceReceipt[] | undefined;
35
+ }): SeamEvidenceVerdict {
36
+ const epoch = options.epoch ?? systemAdapterEpoch(options.adapter as object);
37
+ const seam = `system.${options.slot}`;
38
+ const bag = { [options.slot]: options.adapter } as Partial<SystemAdapters>;
39
+ const nestedShape =
40
+ options.slot === 'physics'
41
+ ? displayKeyedPhysics(options.adapter as SystemAdapters['physics'])
42
+ ? PHYSICS_2D_ADAPTER_SHAPE
43
+ : PHYSICS_ADAPTER_SHAPE
44
+ : SYSTEM_PROVIDER_SHAPES[options.slot as Exclude<keyof SystemAdapters, 'physics'>];
45
+ const receipts: SeamEvidenceReceipt[] = [
46
+ ...inspectSeamShape<SystemAdapters>({
47
+ prefix: 'system',
48
+ value: bag,
49
+ shape: SYSTEM_ADAPTERS_SHAPE,
50
+ subject: options.subject,
51
+ epoch,
52
+ }).filter((receipt) => receipt.seam === seam),
53
+ ...inspectSeamShape({
54
+ prefix: seam,
55
+ value: options.adapter,
56
+ shape: nestedShape as SeamShape<object>,
57
+ subject: options.subject,
58
+ epoch,
59
+ }),
60
+ ...liveSeamEvidence.receipts({ subject: options.subject, epoch }),
61
+ ...(options.receipts ?? []),
62
+ ];
63
+
64
+ return gradeSeamCarrier({
65
+ seam,
66
+ subject: options.subject,
67
+ epoch,
68
+ required: SYSTEM_ADAPTERS_SHAPE[options.slot].required,
69
+ receipts,
70
+ shape: nestedShape as SeamShape<object>,
71
+ });
72
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The ONE crash-to-null React error boundary: a render/lifecycle throw below
3
+ * it reports through `onCaught` and unmounts the subtree (renders null) so a
4
+ * misbehaving child fails loudly WITHOUT throwing out of `root.render()` or
5
+ * taking its siblings down. Class-based by necessity — React has no hook
6
+ * equivalent for `getDerivedStateFromError`.
7
+ *
8
+ * Four copies of this exact component existed (ingest siblings, design-time
9
+ * layers, both story preview mounts) before this home; a fifth copy is the
10
+ * defect, not a convenience. Rung note: `react-error-boundary` ships this
11
+ * shape — adopting it is the right move the next time the editor's
12
+ * dependency set is being changed anyway; twelve lines did not justify a
13
+ * lockfile change on their own.
14
+ */
15
+
16
+ import { Component, type ReactNode } from 'react';
17
+
18
+ export class CrashNullBoundary extends Component<
19
+ {
20
+ onCaught: (error: unknown) => void;
21
+ /** Optional because `createElement` callers pass children VARIADICALLY. */
22
+ children?: ReactNode;
23
+ },
24
+ { crashed: boolean }
25
+ > {
26
+ override state = { crashed: false };
27
+ static getDerivedStateFromError(): { crashed: boolean } {
28
+ return { crashed: true };
29
+ }
30
+ override componentDidCatch(error: unknown): void {
31
+ this.props.onCaught(error);
32
+ }
33
+ override render(): ReactNode {
34
+ return this.state.crashed ? null : this.props.children;
35
+ }
36
+ }