@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,367 @@
1
+ export interface PerformanceTiming {
2
+ readonly name: string;
3
+ readonly ms: number;
4
+ /**
5
+ * Offset (ms) from THIS frame's start (`frameStart`) at which the timing
6
+ * began — a MEASURED value (e.g. a phase's `phaseStart - frameStart`), never
7
+ * synthesized. Present on per-frame phase timings (W4b, so a Chrome trace
8
+ * can place each phase span under its frame at the real offset). OMITTED on
9
+ * cross-frame aggregate rollups (`PerformanceSnapshot.phases`/`systems`/
10
+ * `components`), where no single start point exists — absent, never a
11
+ * fabricated 0.
12
+ */
13
+ readonly startMs?: number;
14
+ }
15
+
16
+ /**
17
+ * One MEASURED span within a frame (W4b) — a system or component invocation,
18
+ * with the phase it ran in and its measured start offset from `frameStart`.
19
+ * Distinct from {@link PerformanceTiming}: a span is a single timed
20
+ * invocation carrying `phase` + always-present `startMs` (the trace/flame
21
+ * unit), whereas a `PerformanceTiming` may be a cross-frame rollup.
22
+ */
23
+ export interface PerformanceSpan {
24
+ readonly name: string;
25
+ readonly phase: string;
26
+ /** Measured offset (ms) from `frameStart` at which this span began. */
27
+ readonly startMs: number;
28
+ readonly ms: number;
29
+ }
30
+
31
+ /** Renderer counters accumulated over a frame (from `renderer.info`). */
32
+ export interface PerformanceRenderStats {
33
+ readonly gpuMs: number | null;
34
+ readonly drawCalls: number;
35
+ readonly triangles: number;
36
+ readonly geometries: number;
37
+ readonly textures: number;
38
+ /**
39
+ * How many top-level `renderer.render()` submissions the last presentation
40
+ * took (`renderer.info.render.frame`'s delta across one draw) — a composer
41
+ * chain, a shadow pass and a post stack each cost one. `null` (never a
42
+ * fabricated 0, same rule as `gpuMs`) when no reporter counted them: a
43
+ * reporter that omits `renderPasses` is saying it does not know, which is
44
+ * different from saying nothing was drawn.
45
+ */
46
+ readonly renderPasses: number | null;
47
+ }
48
+
49
+ export interface PerformanceFrame {
50
+ readonly id: number;
51
+ readonly timestamp: number;
52
+ readonly intervalMs: number;
53
+ readonly cpuMs: number;
54
+ readonly phases: readonly PerformanceTiming[];
55
+ /**
56
+ * Per-invocation system spans measured this frame (W4b). Ordered by
57
+ * `startMs` (execution order), NOT accumulated — a system that ran twice
58
+ * (two substeps) appears twice. Empty when the profiler saw no named
59
+ * systems this frame.
60
+ */
61
+ readonly systems: readonly PerformanceSpan[];
62
+ /**
63
+ * Per-invocation component spans measured this frame (W4b) — populated ONLY
64
+ * while `recording` (component timing is gated on recording, matching
65
+ * `beginComponent`/`endComponent`). Empty otherwise.
66
+ */
67
+ readonly components: readonly PerformanceSpan[];
68
+ /**
69
+ * Renderer counters reported during this frame (W4b) — a snapshot of the
70
+ * accumulated `reportRender` totals taken at `endFrame`. `gpuMs` is `null`
71
+ * when no GPU timer reported (headless/SwiftShader), never a fabricated 0.
72
+ */
73
+ readonly render: PerformanceRenderStats;
74
+ }
75
+
76
+ export interface PerformanceSnapshot {
77
+ readonly enabled: boolean;
78
+ readonly recording: boolean;
79
+ readonly fps: number;
80
+ readonly cpuMs: number;
81
+ readonly p95Ms: number;
82
+ readonly p99Ms: number;
83
+ readonly frames: readonly PerformanceFrame[];
84
+ readonly phases: readonly PerformanceTiming[];
85
+ readonly systems: readonly PerformanceTiming[];
86
+ readonly components: readonly PerformanceTiming[];
87
+ readonly render: PerformanceRenderStats;
88
+ }
89
+
90
+ const now = () => globalThis.performance?.now() ?? Date.now();
91
+
92
+ function percentile(sorted: readonly number[], fraction: number): number {
93
+ if (sorted.length === 0) return 0;
94
+ return sorted[Math.min(sorted.length - 1, Math.floor((sorted.length - 1) * fraction))] ?? 0;
95
+ }
96
+
97
+ /** Game-owned, bounded external store for browser-native performance diagnostics. */
98
+ export function createPerformanceProfiler(initiallyEnabled = false) {
99
+ const listeners = new Set<() => void>();
100
+ const frames: PerformanceFrame[] = [];
101
+ const currentPhases = new Map<string, { ms: number; startMs: number }>();
102
+ const currentSystems = new Map<string, number>();
103
+ const currentComponents = new Map<string, number>();
104
+ // Per-frame span logs (W4b) — cleared each beginFrame, snapshotted into the
105
+ // frame at endFrame. Distinct from the accumulate-by-name aggregate maps
106
+ // above (which back the cross-frame snapshot rollups): these preserve every
107
+ // individual invocation and its measured start offset, for the trace.
108
+ let frameSystems: PerformanceSpan[] = [];
109
+ let frameComponents: PerformanceSpan[] = [];
110
+ let enabled = initiallyEnabled;
111
+ // The header's always-visible FPS sparkline needs frame INTERVALS without
112
+ // turning on the full profiler. Full profiling measures phases/systems,
113
+ // issues GPU timer queries at render sites, and intentionally warns about
114
+ // overhead; a glanceable heartbeat must not silently opt the user into all
115
+ // of that work. `telemetryEnabled` records only the frame envelope.
116
+ let telemetryEnabled = false;
117
+ let recording = false;
118
+ let frameId = 0;
119
+ let frameStart = 0;
120
+ let lastFrameStart = 0;
121
+ /**
122
+ * Phase start times, innermost last. A STACK rather than the single slot
123
+ * this used to be, because phases NEST: the three adapter brackets its CPU
124
+ * render submission as its own phase (`render.submit`,
125
+ * `dev/render-vitals.ts`) from inside the frame's enclosing `render` phase.
126
+ * With one slot the inner `beginPhase()` overwrote the outer's start, so the
127
+ * outer `endPhase('render')` measured only the tail after the inner phase —
128
+ * silently under-reporting the very phase the inner one was decomposing.
129
+ * Balanced callers are unaffected; `endPhase` with an empty stack falls back
130
+ * to `frameStart` rather than a stale start from a previous frame.
131
+ */
132
+ const phaseStack: number[] = [];
133
+ let systemStart = 0;
134
+ let componentStart = 0;
135
+ let render: PerformanceRenderStats = {
136
+ gpuMs: null,
137
+ drawCalls: 0,
138
+ triangles: 0,
139
+ geometries: 0,
140
+ textures: 0,
141
+ renderPasses: null,
142
+ };
143
+ let snapshot: PerformanceSnapshot = {
144
+ enabled,
145
+ recording,
146
+ fps: 0,
147
+ cpuMs: 0,
148
+ p95Ms: 0,
149
+ p99Ms: 0,
150
+ frames: [],
151
+ phases: [],
152
+ systems: [],
153
+ components: [],
154
+ render,
155
+ };
156
+
157
+ function publish(): void {
158
+ const latest = frames.at(-1);
159
+ // Frame-only subscribers need no percentile work. Keep this window stable
160
+ // so a retained snapshot's first percentile read still describes its frames.
161
+ const snapshotFrames = frames.slice();
162
+ let sortedIntervals: number[] | undefined;
163
+ const readPercentile = (fraction: number): number => {
164
+ sortedIntervals ??= snapshotFrames
165
+ .map((frame) => frame.intervalMs)
166
+ .filter((value) => value > 0)
167
+ .sort((a, b) => a - b);
168
+ return percentile(sortedIntervals, fraction);
169
+ };
170
+ snapshot = {
171
+ enabled,
172
+ recording,
173
+ fps: latest?.intervalMs ? 1000 / latest.intervalMs : 0,
174
+ cpuMs: latest?.cpuMs ?? 0,
175
+ get p95Ms() {
176
+ return readPercentile(0.95);
177
+ },
178
+ get p99Ms() {
179
+ return readPercentile(0.99);
180
+ },
181
+ frames: snapshotFrames,
182
+ phases: latest?.phases ?? [],
183
+ systems: [...currentSystems].map(([name, ms]) => ({ name, ms })).sort((a, b) => b.ms - a.ms),
184
+ components: [...currentComponents]
185
+ .map(([name, ms]) => ({ name, ms }))
186
+ .sort((a, b) => b.ms - a.ms),
187
+ render,
188
+ };
189
+ for (const listener of listeners) listener();
190
+ }
191
+
192
+ return {
193
+ get enabled() {
194
+ return enabled;
195
+ },
196
+ set enabled(value: boolean) {
197
+ if (enabled === value) return;
198
+ enabled = value;
199
+ if (value && !telemetryEnabled) lastFrameStart = 0;
200
+ publish();
201
+ },
202
+ get telemetryEnabled() {
203
+ return telemetryEnabled;
204
+ },
205
+ set telemetryEnabled(value: boolean) {
206
+ if (telemetryEnabled === value) return;
207
+ const wasInactive = !enabled && !telemetryEnabled;
208
+ telemetryEnabled = value;
209
+ if (value && wasInactive) lastFrameStart = 0;
210
+ publish();
211
+ },
212
+ get recording() {
213
+ return recording;
214
+ },
215
+ startRecording() {
216
+ const wasInactive = !enabled && !telemetryEnabled;
217
+ enabled = true;
218
+ if (wasInactive) lastFrameStart = 0;
219
+ recording = true;
220
+ frames.length = 0;
221
+ publish();
222
+ },
223
+ stopRecording() {
224
+ recording = false;
225
+ publish();
226
+ },
227
+ clear() {
228
+ frames.length = 0;
229
+ publish();
230
+ },
231
+ beginFrame() {
232
+ if (!enabled && !telemetryEnabled) return;
233
+ currentPhases.clear();
234
+ currentSystems.clear();
235
+ currentComponents.clear();
236
+ frameSystems = [];
237
+ frameComponents = [];
238
+ // A frame that threw mid-phase leaves entries on the stack; a fresh
239
+ // frame starts from nothing rather than inheriting them.
240
+ phaseStack.length = 0;
241
+ render = {
242
+ gpuMs: null,
243
+ drawCalls: 0,
244
+ triangles: 0,
245
+ geometries: 0,
246
+ textures: 0,
247
+ renderPasses: null,
248
+ };
249
+ frameStart = now();
250
+ },
251
+ beginPhase() {
252
+ if (!enabled) return;
253
+ phaseStack.push(now());
254
+ },
255
+ endPhase(name: string) {
256
+ if (!enabled) return;
257
+ // See `phaseStack`: pop restores the ENCLOSING phase's own start, so a
258
+ // nested bracket measures itself without truncating its parent.
259
+ const phaseStart = phaseStack.pop() ?? frameStart;
260
+ const elapsed = now() - phaseStart;
261
+ const existing = currentPhases.get(name);
262
+ // Accumulate ms across re-entries of the same phase, but keep the FIRST
263
+ // measured start offset (earliest entry) as the span's startMs.
264
+ currentPhases.set(name, {
265
+ ms: (existing?.ms ?? 0) + elapsed,
266
+ startMs: existing?.startMs ?? phaseStart - frameStart,
267
+ });
268
+ if (recording)
269
+ performance.measure(`vgai.phase.${name}`, { start: phaseStart, duration: elapsed });
270
+ },
271
+ systemObserver: {
272
+ beginSystem() {
273
+ if (!enabled) return;
274
+ systemStart = now();
275
+ },
276
+ endSystem(scope: string, phase: string, name: string) {
277
+ if (!enabled) return;
278
+ const end = now();
279
+ const key = `${scope} / ${phase} / ${name}`;
280
+ currentSystems.set(key, (currentSystems.get(key) ?? 0) + end - systemStart);
281
+ frameSystems.push({
282
+ name: key,
283
+ phase,
284
+ startMs: systemStart - frameStart,
285
+ ms: end - systemStart,
286
+ });
287
+ },
288
+ },
289
+ beginComponent() {
290
+ if (!recording) return;
291
+ componentStart = now();
292
+ },
293
+ endComponent(name: string, phase = '') {
294
+ if (!recording) return;
295
+ const end = now();
296
+ currentComponents.set(name, (currentComponents.get(name) ?? 0) + end - componentStart);
297
+ frameComponents.push({
298
+ name,
299
+ phase,
300
+ startMs: componentStart - frameStart,
301
+ ms: end - componentStart,
302
+ });
303
+ },
304
+ reportRender(stats: {
305
+ gpuMs: number | null;
306
+ drawCalls: number;
307
+ triangles: number;
308
+ geometries: number;
309
+ textures: number;
310
+ /** Omit when this reporter does not count passes — see
311
+ * {@link PerformanceRenderStats.renderPasses}. */
312
+ renderPasses?: number;
313
+ }) {
314
+ if (!enabled) return;
315
+ render = {
316
+ gpuMs: stats.gpuMs ?? render.gpuMs,
317
+ drawCalls: render.drawCalls + stats.drawCalls,
318
+ triangles: render.triangles + stats.triangles,
319
+ geometries: render.geometries + stats.geometries,
320
+ textures: render.textures + stats.textures,
321
+ renderPasses:
322
+ stats.renderPasses === undefined
323
+ ? render.renderPasses
324
+ : (render.renderPasses ?? 0) + stats.renderPasses,
325
+ };
326
+ },
327
+ endFrame() {
328
+ if (!enabled && !telemetryEnabled) return;
329
+ const timestamp = now();
330
+ const intervalMs = lastFrameStart === 0 ? 0 : frameStart - lastFrameStart;
331
+ lastFrameStart = frameStart;
332
+ const frame: PerformanceFrame = {
333
+ id: ++frameId,
334
+ timestamp,
335
+ intervalMs,
336
+ cpuMs: timestamp - frameStart,
337
+ phases: [...currentPhases]
338
+ .map(([name, { ms, startMs }]) => ({ name, ms, startMs }))
339
+ .sort((a, b) => b.ms - a.ms),
340
+ systems: frameSystems.slice(),
341
+ components: frameComponents.slice(),
342
+ render: { ...render },
343
+ };
344
+ frames.push(frame);
345
+ if (frames.length > 600) frames.splice(0, frames.length - 600);
346
+ if (recording)
347
+ performance.measure('vgai.frame', { start: frameStart, duration: frame.cpuMs });
348
+ publish();
349
+ },
350
+ subscribe(listener: () => void) {
351
+ listeners.add(listener);
352
+ return () => {
353
+ listeners.delete(listener);
354
+ };
355
+ },
356
+ getSnapshot() {
357
+ return snapshot;
358
+ },
359
+ exportJSON() {
360
+ // version 2 (W4b): frames now carry per-frame `systems`/`components`
361
+ // spans, per-frame `render` counters, and `startMs` on phase timings.
362
+ return JSON.stringify({ version: 2, capturedAt: new Date().toISOString(), frames }, null, 2);
363
+ },
364
+ };
365
+ }
366
+
367
+ export type PerformanceProfiler = ReturnType<typeof createPerformanceProfiler>;
@@ -0,0 +1,69 @@
1
+ import type { PerformanceProfiler } from './performance-profiler';
2
+
3
+ export interface EditorPerformanceSource {
4
+ readonly id: string;
5
+ readonly label: string;
6
+ readonly kind: 'scene' | 'source' | 'asset' | 'game';
7
+ readonly profiler: PerformanceProfiler;
8
+ /** Mount identity for a Game runtime source. Document identity stays
9
+ * `workspace:game`; this disambiguates the runtime inspected inside it. */
10
+ readonly instanceId?: string;
11
+ }
12
+
13
+ const sources = new Map<string, EditorPerformanceSource>();
14
+ const listeners = new Set<() => void>();
15
+ let version = 0;
16
+
17
+ function notify(): void {
18
+ version++;
19
+ for (const listener of listeners) listener();
20
+ }
21
+
22
+ /** Register one real render loop as a profiler source. */
23
+ export function registerPerformanceSource(source: EditorPerformanceSource): () => void {
24
+ sources.set(source.id, source);
25
+ notify();
26
+ return () => {
27
+ if (sources.get(source.id) !== source) return;
28
+ sources.delete(source.id);
29
+ notify();
30
+ };
31
+ }
32
+
33
+ export function performanceSourceForDocument(
34
+ documentId: string | null,
35
+ ): EditorPerformanceSource | null {
36
+ return documentId ? (sources.get(documentId) ?? null) : null;
37
+ }
38
+
39
+ /** Every registered render loop. The self-vitals checks
40
+ * (`coverage/session-vitals.ts`) ask "did the thing that is running draw a
41
+ * frame", which is a question about whichever loop exists, not about the
42
+ * document the user happens to be looking at. */
43
+ export function allPerformanceSources(): readonly EditorPerformanceSource[] {
44
+ return [...sources.values()];
45
+ }
46
+
47
+ export function performanceSourceForGameInstance(
48
+ instanceId: string | null,
49
+ ): EditorPerformanceSource | null {
50
+ if (instanceId === null) return null;
51
+ for (const source of sources.values()) {
52
+ if (source.kind === 'game' && source.instanceId === instanceId) return source;
53
+ }
54
+ return null;
55
+ }
56
+
57
+ export function subscribePerformanceSources(listener: () => void): () => void {
58
+ listeners.add(listener);
59
+ return () => listeners.delete(listener);
60
+ }
61
+
62
+ export function performanceSourcesVersion(): number {
63
+ return version;
64
+ }
65
+
66
+ export function __resetPerformanceSourcesForTest(): void {
67
+ sources.clear();
68
+ notify();
69
+ }
@@ -0,0 +1,145 @@
1
+ /**
2
+ * WHAT PLAY WAS DOING WHEN IT STOPPED ANSWERING.
3
+ *
4
+ * ## The measurement this exists for
5
+ *
6
+ * 2026-08-20, `packages/editor/scripts/scale-harness` at N=20000 on the canvas
7
+ * lane. `vgai play` burned its whole 120s budget and was refused with
8
+ *
9
+ * Command timed out — the tab is present (last heartbeat 0.8s ago) and
10
+ * did not respond.
11
+ *
12
+ * then `screenshot` (15s) and `stop` (30s) were refused with the same sentence.
13
+ * Every one of those statements was TRUE and none of them was the answer: the
14
+ * heartbeat is a WORKER, so it kept beating at 0.4s while the page's main
15
+ * thread sat inside one 199.5-second synchronous block. Four consecutive runs,
16
+ * three silent timeouts each, against a session every reader called healthy.
17
+ *
18
+ * The defect the fix closed was a quadratic name derivation
19
+ * (`@vgai/game-runtime/pixi/authoring`). The defect THIS closes is that nothing anywhere
20
+ * could say which of play's eight steps the page was in — the relay knows only
21
+ * that it asked, the tab table knows only that the tab exists, and the page
22
+ * itself, being wedged, is the one party that cannot speak.
23
+ *
24
+ * ## The mechanism
25
+ *
26
+ * A phase is published BEFORE its work starts, on the control channel, as its
27
+ * own tiny message — never folded into the state snapshot, which is the
28
+ * expensive derivation a wedged page cannot produce and which is exactly the
29
+ * thing that goes silent. So the server always holds the phase the page was
30
+ * ENTERING when it went quiet, and the relay's refusal can name it.
31
+ *
32
+ * This module is the page's half and is deliberately pure apart from one
33
+ * injected reporter: the latch, the phase vocabulary, and the sentence are all
34
+ * unit-testable without a browser.
35
+ */
36
+
37
+ /**
38
+ * The steps of a play boot, in the order `play-mode.ts` runs them.
39
+ *
40
+ * The vocabulary is shared with `play-boot-stall.ts`: the three network-shaped
41
+ * steps it already guards use the SAME wording here, so the hidden-tab stall
42
+ * message and a stuck-play refusal cannot describe the same step differently.
43
+ * The steps that guard does not wrap — the runtime mount and the authoring
44
+ * install, which must never be abandoned mid-flight — are the ones that had no
45
+ * name at all, and they are where the 199.5s block was measured.
46
+ */
47
+ export const PLAY_BOOT_PHASES = [
48
+ 'waiting for the editor to bind Play',
49
+ 'waiting for the project bootstrap to settle',
50
+ 'starting the play log session',
51
+ 'opening the Game document',
52
+ 'fetching the project manifest',
53
+ "resolving the project's root entries",
54
+ 'mounting the runtime roots',
55
+ 'installing play authoring for each root',
56
+ 'binding the editor to the running game',
57
+ ] as const;
58
+
59
+ export type PlayBootPhase = (typeof PLAY_BOOT_PHASES)[number];
60
+
61
+ /** The page's standing answer to "what is play doing right now". */
62
+ /** Any main-thread work the page announces before starting it: a play boot
63
+ * step, or a document's `building src/models/x.ts`. */
64
+ export type PagePhase = PlayBootPhase | `building ${string}`;
65
+
66
+ export interface PlayBootPhaseState {
67
+ /** The phase being ENTERED, or `null` once the boot settled either way. */
68
+ readonly phase: PagePhase | null;
69
+ /** Epoch ms the page entered it (or left the last one). */
70
+ readonly at: number;
71
+ /** This play attempt's ordinal, so a stale report is recognizable as stale. */
72
+ readonly run: number;
73
+ }
74
+
75
+ let _state: PlayBootPhaseState = { phase: null, at: 0, run: 0 };
76
+ let _report: ((state: PlayBootPhaseState) => void) | null = null;
77
+
78
+ /**
79
+ * Install the upstream reporter. Wired once at editor boot; left unset in
80
+ * tests, where the latch is read directly.
81
+ */
82
+ export function setPlayBootPhaseReporter(
83
+ report: ((state: PlayBootPhaseState) => void) | null,
84
+ ): void {
85
+ _report = report;
86
+ }
87
+
88
+ function publish(next: PlayBootPhaseState): void {
89
+ _state = next;
90
+ // A reporter that throws must never break a play boot — the phase is
91
+ // diagnostics, and diagnostics that can fail the thing they describe are
92
+ // worse than none.
93
+ try {
94
+ _report?.(next);
95
+ } catch {
96
+ /* the boot continues; the reader loses one phase line */
97
+ }
98
+ }
99
+
100
+ /** Begin a play attempt. Returns its run ordinal. */
101
+ export function beginPlayBoot(now: number = Date.now()): number {
102
+ publish({ phase: null, at: now, run: _state.run + 1 });
103
+ return _state.run;
104
+ }
105
+
106
+ /** Enter one phase. Called BEFORE the phase's work, never after it. */
107
+ export function markPlayBootPhase(phase: PlayBootPhase, now: number = Date.now()): void {
108
+ publish({ phase, at: now, run: _state.run });
109
+ }
110
+
111
+ /**
112
+ * The boot settled — started, failed, or was superseded. Clearing the phase is
113
+ * what makes a LATER stuck command ("stop", "screenshot") report honestly that
114
+ * play was not booting rather than blaming the last phase of a boot that
115
+ * finished minutes ago.
116
+ */
117
+ export function endPlayBoot(now: number = Date.now()): void {
118
+ publish({ phase: null, at: now, run: _state.run });
119
+ }
120
+
121
+ /**
122
+ * Announce main-thread work that is NOT a play boot — a model document about
123
+ * to run a module's `build()` — so a command that times out while the page is
124
+ * inside it is refused by name ("the page is still inside building
125
+ * src/models/mushroom.ts") instead of "never answered". A blind session on a
126
+ * swapped box read the generic refusal as its own module hanging and bisected
127
+ * a parameter for five minutes (2026-09-06). Returns the end call; nested
128
+ * work is not tracked — the latest announcement stands until it ends.
129
+ */
130
+ export function beginPageWork(label: `building ${string}`, now: number = Date.now()): () => void {
131
+ publish({ phase: label, at: now, run: _state.run });
132
+ return () => {
133
+ if (_state.phase === label) publish({ phase: null, at: Date.now(), run: _state.run });
134
+ };
135
+ }
136
+
137
+ export function currentPlayBootPhase(): PlayBootPhaseState {
138
+ return _state;
139
+ }
140
+
141
+ /** Test-only reset — drops the latch and the reporter. */
142
+ export function __resetPlayBootPhaseForTest(): void {
143
+ _state = { phase: null, at: 0, run: 0 };
144
+ _report = null;
145
+ }