@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,58 @@
1
+ /**
2
+ * IS THIS REJECTION A CANCELLATION? — the one predicate, shared by the two
3
+ * page-level `unhandledrejection` listeners this editor installs
4
+ * (`editor-presence.ts`'s boot reporter and `editor-console.ts`'s
5
+ * session-lifetime capture).
6
+ *
7
+ * ## Why this is not "exempting a source"
8
+ *
9
+ * The recorded doctrine at `installEditorConsoleCapture` is that SEVERITY
10
+ * decides what reaches the ledger and never SOURCE, "because exempting a
11
+ * source would teach the gate to find less". This is not that. A cancellation
12
+ * is not a low-severity error, it is the platform's word for *an operation
13
+ * that was asked to stop and did* — the same judgement the workbench makes
14
+ * about its own (`onUnexpectedError` returns early on `isCancellationError`)
15
+ * and the same one the Fetch and Streams specs make (`AbortError`). It is
16
+ * applied identically to OUR rejections and to anyone else's: a vgai fetch
17
+ * abandoned because the document moved on is exactly as much of a non-event.
18
+ *
19
+ * ## What made it necessary
20
+ *
21
+ * MEASURED 2026-09-19, the Code-OSS frame's blind walk, beat 9: a
22
+ * `--template game` scaffold reported
23
+ * `[runtime] editor app failed to start: Canceled: Canceled` while its editor
24
+ * was running fine. Under the frame the page is a WORKBENCH, and a workbench
25
+ * raises `CancellationError` (`name === 'Canceled'`) whenever a quick input is
26
+ * dismissed or a search is superseded — none of which any page-level listener
27
+ * can attribute, because a rejection carries no author. The ledger spans two
28
+ * codebases there (docs/CODE-OSS.md, "The console ledger now spans two
29
+ * codebases"), and this is the one class of line that can be ruled on without
30
+ * asking WHOSE it is.
31
+ *
32
+ * ## Its own file, deliberately
33
+ *
34
+ * `editor-presence.ts` is the pre-React bootstrap module and is
35
+ * dependency-light on purpose (its own comments say so); importing the console
36
+ * from it would pull the console's whole closure into the page's first script.
37
+ * A five-line predicate copied into both is the duplication this codebase
38
+ * treats as a defect, so it is one module with no imports of its own.
39
+ */
40
+
41
+ /**
42
+ * True when a rejection reason means "this was cancelled", by any of the three
43
+ * spellings in play on our page:
44
+ *
45
+ * - VS Code's `CancellationError`, whose constructor sets
46
+ * `name = message = 'Canceled'`;
47
+ * - the platform's `AbortError` — a `DOMException` from `AbortSignal`, and
48
+ * what `fetch` rejects with when its signal fires;
49
+ * - the older `AbortError` shape any library may throw as a plain `Error`.
50
+ *
51
+ * Deliberately NOT a message match: a message is prose and drifts, while these
52
+ * names are contract.
53
+ */
54
+ export function isCancellationReason(reason: unknown): boolean {
55
+ if (typeof reason !== 'object' || reason === null) return false;
56
+ const name = (reason as { name?: unknown }).name;
57
+ return name === 'Canceled' || name === 'CancellationError' || name === 'AbortError';
58
+ }
@@ -0,0 +1,482 @@
1
+ /**
2
+ * CANVAS PREVIEW AND PRESENTED PIXELS — the host's Pixi pixel plumbing, over a
3
+ * live display subtree that is already there. Two jobs, one substrate:
4
+ *
5
+ * - PHOTOGRAPHING a live subtree on an independent Application, under a node
6
+ * budget, so selecting a node costs a bounded amount whatever it selected
7
+ * ({@link capturePixiDisplayObjectThumbnail}, {@link snapshotPixiPreviewSubject}).
8
+ * - Answering the composite screenshot's `canvasFrame` seam for a canvas a
9
+ * Pixi renderer owns, whose drawing buffer is gone by the time the
10
+ * compositor reads it ({@link presentedPixiFrame}, over the surfaces that
11
+ * registered themselves).
12
+ *
13
+ * Neither job knows what put the objects there. A first-party canvas world, an
14
+ * ingested game and a portable CSF story register the same way and are
15
+ * photographed the same way — which is why this is the HOST's and not the story
16
+ * estate's. It lived inside `stories/story-pixi-preview.ts` and four of its
17
+ * five callers never had a story in hand (`authoring/canvas-design-mount.ts`,
18
+ * `authoring/pixi-still-presentation.ts`, `components/world-root-stage.ts`,
19
+ * `live-canvas-frame.ts`, and the ingest lane's canvas mount); moving it out is
20
+ * the part of the CSF estate's exit to `@vgai/game` (WORK.md §The open-source
21
+ * launch, phase 1 unit 3) that does not wait on anything else.
22
+ */
23
+
24
+ import type { Application, Container, Matrix, Rectangle } from 'pixi.js';
25
+ import * as shellPixi from 'pixi.js';
26
+ type CanvasPixiNamespace = typeof shellPixi;
27
+
28
+ /** Requested presentation size for a photographed subject. Presentation only:
29
+ * it never becomes a second authored size or a component-specific asset. */
30
+ export interface CanvasThumbnailSize {
31
+ readonly width?: number;
32
+ readonly height?: number;
33
+ }
34
+
35
+ /**
36
+ * How many display objects one selection preview may photograph.
37
+ *
38
+ * THE COST CLASS: selecting a node cloned and rendered that node's WHOLE
39
+ * subtree to produce a 128-pixel picture. Selection is the editor's most
40
+ * frequent gesture, and the cost was O(selected subtree) — unbounded.
41
+ *
42
+ * MEASURED in the page (`new Profiler`, 2.5s window around ONE relayed
43
+ * `select` of the world root, scale harness's canvas N=20000 world, same tab,
44
+ * same world, the only difference being whether this budget is live):
45
+ *
46
+ * inclusive samples, of the window's total
47
+ * before 112 / 346 capturePixiDisplayObjectThumbnail
48
+ * — under it: generateTexture 70, collectRenderables
49
+ * 34, getLocalBounds 19, i.e. a 20 000-object
50
+ * clone photographed on a real renderer
51
+ * after 0 / 241 the frame is absent from the trace entirely, and
52
+ * so are generateTexture, collectRenderables and
53
+ * getLocalBounds
54
+ *
55
+ * WHAT IT WAS NOT, stated because the shape misleads: this cost is NOT the
56
+ * long-animation-frame block a selection reports. It is asynchronous GPU and
57
+ * clone work spread across the frames after the click, so LoAF never named it
58
+ * and the editor's worst SINGLE block at N=20000 is unchanged by this fix (see
59
+ * `scale-speed-thumbnail-budget-{before,after}.json`; that block belongs to
60
+ * React's own layout-effect commit). What the profiler measures, and what this
61
+ * removes, is a third of all sampled main-thread time after a click.
62
+ *
63
+ * Deferral alone does not fix it — `components/inspector-preview-section.tsx`
64
+ * already holds the picture back a frame (`useAfterPaint`) and the work simply
65
+ * lands in the next frames instead. The only bound that holds is a bound on the
66
+ * WORK, so the subtree is COUNTED first (no further than this many nodes, so
67
+ * the count is itself O(budget), never O(subtree)) and a subtree above the
68
+ * budget is DECLINED — no clone, no render, no allocation.
69
+ *
70
+ * The number: an authored component — a HUD, a character, a prefab, the thing
71
+ * a human actually selects and wants to see — is tens to low hundreds of
72
+ * display objects, so this is roughly an order of magnitude of headroom above
73
+ * the case the preview exists to serve. What it declines is a LEVEL ROOT, and
74
+ * a level root at 128 pixels was never a picture of anything.
75
+ */
76
+ export const PREVIEW_SUBTREE_NODE_BUDGET = 2_000;
77
+
78
+ /**
79
+ * Display objects in `source`'s subtree, counted no further than `limit`.
80
+ *
81
+ * The return is the true count when that is at most `limit`, and `limit + 1` —
82
+ * "more than `limit`" — otherwise. That ceiling is the whole point: the caller's
83
+ * question is "may I afford this?", and a count that answered it exactly would
84
+ * pay the very cost it is being asked to avoid.
85
+ *
86
+ * Drained with a CURSOR rather than `Array.prototype.shift()`, for the reason
87
+ * `authoring/hierarchy-walk.ts` records: `shift` moves every remaining element
88
+ * down, so a flat-fanned tree turns a linear-looking walk quadratic.
89
+ */
90
+ export function countPixiSubtree(source: Container, limit: number): number {
91
+ const queue: Container[] = [source];
92
+ let cursor = 0;
93
+ let count = 0;
94
+ while (cursor < queue.length) {
95
+ const node = queue[cursor++]!;
96
+ count++;
97
+ if (count > limit) return limit + 1;
98
+ for (const child of node.children) queue.push(child as Container);
99
+ }
100
+ return count;
101
+ }
102
+
103
+ /**
104
+ * Render-only snapshot of a live display subtree, or `null` when the subtree is
105
+ * larger than `budget`. The source is never reparented, filtered, or rendered:
106
+ * same stance as three's `createAssetPreviewSnapshot`. Textures are shared;
107
+ * filters are not (they bind to the live renderer).
108
+ *
109
+ * The budget is a DEFAULT rather than an opt-in — see
110
+ * {@link PREVIEW_SUBTREE_NODE_BUDGET}. A caller that genuinely wants the whole
111
+ * tree whatever it costs passes `Number.POSITIVE_INFINITY` and says why.
112
+ */
113
+ export function snapshotPixiPreviewSubject(
114
+ source: Container,
115
+ budget: number = PREVIEW_SUBTREE_NODE_BUDGET,
116
+ pixi: CanvasPixiNamespace = shellPixi,
117
+ ): Container | null {
118
+ if (countPixiSubtree(source, budget) > budget) return null;
119
+ const snapshot = clonePixiVisual(pixi, source);
120
+ const world = composedWorldMatrix(pixi, source);
121
+ snapshot.position.set(0, 0);
122
+ snapshot.scale.set(Math.hypot(world.a, world.b), Math.hypot(world.c, world.d));
123
+ snapshot.rotation = Math.atan2(world.b, world.a);
124
+ snapshot.visible = true;
125
+ return snapshot;
126
+ }
127
+
128
+ /** Compose local transforms up to the stage. Avoids `updateTransform()`,
129
+ * which requires a live render-group parent the snapshot must not assume. */
130
+ function composedWorldMatrix(pixi: CanvasPixiNamespace, source: Container): Matrix {
131
+ const world = new pixi.Matrix();
132
+ const chain: Container[] = [];
133
+ for (let node: Container | null = source; node; node = node.parent) chain.push(node);
134
+ for (let i = chain.length - 1; i >= 0; i--) {
135
+ chain[i]!.updateLocalTransform();
136
+ world.append(chain[i]!.localTransform);
137
+ }
138
+ return world;
139
+ }
140
+
141
+ /**
142
+ * `pixi` is the namespace `source` ITSELF came from — see
143
+ * `../../vite-plugin-module-doorways.ts`. Every `instanceof` below is a class
144
+ * from that same graph, which is what makes the chain answer at all: against
145
+ * the shell's classes a project subtree missed EVERY branch, fell to the
146
+ * generic Container tail, and produced a preview with no textures in it —
147
+ * exactly the empty-preview failure the NineSlice note below records, at the
148
+ * scale of the whole tree.
149
+ */
150
+ function clonePixiVisual(pixi: CanvasPixiNamespace, source: Container): Container {
151
+ // NineSliceSprite is a ViewContainer, not a Sprite. Falling through to the
152
+ // generic Container branch drops the texture and yields an empty preview —
153
+ // the measured Bubbo HUD `decorContainer` trays and borders.
154
+ if (source instanceof pixi.NineSliceSprite) {
155
+ const slice = new pixi.NineSliceSprite({
156
+ texture: source.texture,
157
+ leftWidth: source.leftWidth,
158
+ rightWidth: source.rightWidth,
159
+ topHeight: source.topHeight,
160
+ bottomHeight: source.bottomHeight,
161
+ width: source.width,
162
+ height: source.height,
163
+ });
164
+ slice.anchor.copyFrom(source.anchor);
165
+ slice.tint = source.tint;
166
+ copyPixiLocalPose(source, slice);
167
+ return slice;
168
+ }
169
+ if (source instanceof pixi.TilingSprite) {
170
+ const tile = new pixi.TilingSprite({
171
+ texture: source.texture,
172
+ width: source.width,
173
+ height: source.height,
174
+ });
175
+ tile.tilePosition.copyFrom(source.tilePosition);
176
+ tile.tileScale.copyFrom(source.tileScale);
177
+ tile.anchor.copyFrom(source.anchor);
178
+ copyPixiLocalPose(source, tile);
179
+ return tile;
180
+ }
181
+ if (source instanceof pixi.Text) {
182
+ const text = new pixi.Text({
183
+ text: source.text,
184
+ style: source.style.clone(),
185
+ });
186
+ if ('anchor' in source) text.anchor.copyFrom(source.anchor);
187
+ copyPixiLocalPose(source, text);
188
+ return text;
189
+ }
190
+ if (source instanceof pixi.Graphics) {
191
+ const graphics = source.clone(true);
192
+ copyPixiLocalPose(source, graphics);
193
+ return graphics;
194
+ }
195
+ if (source instanceof pixi.Sprite) {
196
+ const sprite = new pixi.Sprite(source.texture);
197
+ sprite.anchor.copyFrom(source.anchor);
198
+ sprite.tint = source.tint;
199
+ copyPixiLocalPose(source, sprite);
200
+ return sprite;
201
+ }
202
+ const container = new pixi.Container();
203
+ copyPixiLocalPose(source, container);
204
+ container.pivot.copyFrom(source.pivot);
205
+ for (const child of source.children) {
206
+ container.addChild(clonePixiVisual(pixi, child as Container));
207
+ }
208
+ return container;
209
+ }
210
+
211
+ function copyPixiLocalPose(source: Container, target: Container): void {
212
+ target.alpha = source.alpha;
213
+ target.visible = source.visible;
214
+ target.rotation = source.rotation;
215
+ target.scale.copyFrom(source.scale);
216
+ target.position.copyFrom(source.position);
217
+ target.skew.copyFrom(source.skew);
218
+ }
219
+
220
+ /**
221
+ * OWNER — this module. SHARERS — {@link capturePixiDisplayObjectThumbnail}.
222
+ * THE ONE TEARDOWN — {@link disposeInspectorPixiPreviewApp}. The live scene
223
+ * Application is never a sharer: three photographs a snapshot on its own
224
+ * WebGLRenderer, and this is that lane for canvas.
225
+ *
226
+ * KEYED BY NAMESPACE, not a singleton. The subject's textures belong to the
227
+ * graph the subject came from, and a renderer only understands its own
228
+ * `TextureSource`s — so a shell Application photographing a project subtree is
229
+ * one renderer looking at another renderer's GPU resources. There is at most
230
+ * one entry per namespace and at most two namespaces on a page (the shell's,
231
+ * and the opened project's under the packaged runtime), so this is a two-slot
232
+ * map, not a cache with a growth story.
233
+ */
234
+ const previewApps = new Map<CanvasPixiNamespace, Application>();
235
+ const previewAppsReady = new Map<CanvasPixiNamespace, Promise<Application>>();
236
+
237
+ async function inspectorPixiPreviewApp(pixi: CanvasPixiNamespace): Promise<Application> {
238
+ const existing = previewApps.get(pixi);
239
+ if (existing) return existing;
240
+ let pending = previewAppsReady.get(pixi);
241
+ if (!pending) {
242
+ pending = (async () => {
243
+ const app = new pixi.Application();
244
+ await app.init({
245
+ autoStart: false,
246
+ sharedTicker: false,
247
+ backgroundAlpha: 0,
248
+ width: 128,
249
+ height: 96,
250
+ antialias: true,
251
+ });
252
+ previewApps.set(pixi, app);
253
+ return app;
254
+ })();
255
+ previewAppsReady.set(pixi, pending);
256
+ }
257
+ return pending;
258
+ }
259
+
260
+ /** Test and session teardown — every namespace's app. Idempotent. */
261
+ export function disposeInspectorPixiPreviewApp(): void {
262
+ previewAppsReady.clear();
263
+ const apps = [...previewApps.values()];
264
+ previewApps.clear();
265
+ for (const app of apps) {
266
+ app.destroy(true, { children: true, texture: false, textureSource: false });
267
+ }
268
+ }
269
+
270
+ function paddedAspectFrame(
271
+ pixi: CanvasPixiNamespace,
272
+ bounds: { x: number; y: number; width: number; height: number },
273
+ width: number,
274
+ height: number,
275
+ ): Rectangle {
276
+ const padding = 8;
277
+ const frame = new pixi.Rectangle(
278
+ bounds.x - padding,
279
+ bounds.y - padding,
280
+ Math.max(1, bounds.width + padding * 2),
281
+ Math.max(1, bounds.height + padding * 2),
282
+ );
283
+ const targetAspect = width / height;
284
+ if (frame.width / frame.height < targetAspect) {
285
+ const nextWidth = frame.height * targetAspect;
286
+ frame.x -= (nextWidth - frame.width) / 2;
287
+ frame.width = nextWidth;
288
+ } else if (frame.width / frame.height > targetAspect) {
289
+ const nextHeight = frame.width / targetAspect;
290
+ frame.y -= (nextHeight - frame.height) / 2;
291
+ frame.height = nextHeight;
292
+ }
293
+ return frame;
294
+ }
295
+
296
+ /**
297
+ * Photograph a live display subtree on an independent Application.
298
+ * The live scene renderer is never a render target.
299
+ *
300
+ * `null` — the answer `previewImage` already carries for "this surface has no
301
+ * picture of that node" — when the subtree is over
302
+ * {@link PREVIEW_SUBTREE_NODE_BUDGET}. Nothing is cloned and nothing is
303
+ * rendered in that case: the whole cost is the bounded count.
304
+ */
305
+ export async function capturePixiDisplayObjectThumbnail(
306
+ target: Container,
307
+ options: CanvasThumbnailSize & {
308
+ budget?: number;
309
+ /** THE namespace `target` came from. Absent ⇒ this bundle's own copy,
310
+ * which is right on every one-graph runtime. */
311
+ pixi?: CanvasPixiNamespace;
312
+ } = {},
313
+ ): Promise<string | null> {
314
+ const width = options.width ?? 128;
315
+ const height = options.height ?? 96;
316
+ const pixi = options.pixi ?? shellPixi;
317
+ const budget = options.budget ?? PREVIEW_SUBTREE_NODE_BUDGET;
318
+ // DECLINE BEFORE THE RENDERER. An over-budget subtree costs this call the
319
+ // bounded count and nothing else — no preview Application is resolved (the
320
+ // first selection would otherwise create a real WebGL renderer to draw a
321
+ // picture it is about to refuse), nothing is cloned, nothing is rasterized.
322
+ if (countPixiSubtree(target, budget) > budget) return null;
323
+ const app = await inspectorPixiPreviewApp(pixi);
324
+ // Counted a second time inside, and deliberately: the world keeps running
325
+ // across the `await` above, so the subtree that gets CLONED is not provably
326
+ // the one that was counted. The snapshot's own budget is what bounds the
327
+ // clone; the count above is what keeps the common refusal free.
328
+ const snapshot = snapshotPixiPreviewSubject(target, budget, pixi);
329
+ if (snapshot === null) return null;
330
+ app.stage.removeChildren();
331
+ app.stage.addChild(snapshot);
332
+ try {
333
+ const frame = paddedAspectFrame(pixi, snapshot.getLocalBounds(), width, height);
334
+ const source = (await app.renderer.extract.canvas({
335
+ target: app.stage,
336
+ frame,
337
+ })) as HTMLCanvasElement;
338
+ const output = document.createElement('canvas');
339
+ output.width = width;
340
+ output.height = height;
341
+ const context = output.getContext('2d');
342
+ if (!context)
343
+ throw new Error('Canvas selection preview could not create a 2D readback context.');
344
+ const scale = Math.min(width / source.width, height / source.height);
345
+ const drawWidth = source.width * scale;
346
+ const drawHeight = source.height * scale;
347
+ context.drawImage(
348
+ source,
349
+ (width - drawWidth) / 2,
350
+ (height - drawHeight) / 2,
351
+ drawWidth,
352
+ drawHeight,
353
+ );
354
+ return output.toDataURL('image/png');
355
+ } finally {
356
+ app.stage.removeChildren();
357
+ snapshot.destroy({ children: true, texture: false, textureSource: false });
358
+ }
359
+ }
360
+
361
+ /**
362
+ * A `canvasFrame` seam (`composite-screenshot.ts`) for Pixi-owned canvases.
363
+ *
364
+ * THE OTHER HALF of the blank capture, and the half waiting alone cannot fix.
365
+ * The compositor reads a canvas back LATE — after paint — and a WebGL context
366
+ * created without `preserveDrawingBuffer` has had its drawing buffer cleared by
367
+ * then, so `drawImage` of a perfectly-rendered Pixi canvas yields nothing. The
368
+ * story owns its own `<Application>` and does not pass that flag (nor should it
369
+ * have to), so the pixels are taken through Pixi's own extraction instead:
370
+ * `renderer.extract.canvas` renders the stage into a texture and reads it back,
371
+ * which is correct whatever the context was created with.
372
+ *
373
+ * Returns `null` for a canvas no collected Application owns — the seam's
374
+ * documented "read the canvas directly" answer, so an ordinary DOM story's
375
+ * canvas is untouched.
376
+ */
377
+ export function pixiCanvasFrame(
378
+ apps: readonly Application[],
379
+ ): (canvas: HTMLCanvasElement) => Promise<CanvasImageSource | null> {
380
+ return async (canvas) => {
381
+ const app = apps.find((candidate) => candidate.canvas === canvas);
382
+ if (!app?.renderer) return null;
383
+ // `frame` and `clearColor` are what make this a picture OF THE CANVAS
384
+ // rather than of the display tree: extract's own default frame is the
385
+ // target's content BOUNDS, so a 24-texel gem in a 240x180 cell came back
386
+ // as a 24x24 image that the compositor then stretched over the whole cell,
387
+ // and the story's own `<Application background>` — a renderer clear, not a
388
+ // display object — was missing behind it. The screen shows the app's
389
+ // screen rectangle cleared to its background; so does this.
390
+ const background = app.renderer.background;
391
+ return app.renderer.extract.canvas({
392
+ target: app.stage,
393
+ frame: app.screen,
394
+ ...(background.alpha > 0 ? { clearColor: background.color } : {}),
395
+ }) as unknown as CanvasImageSource;
396
+ };
397
+ }
398
+
399
+ /**
400
+ * The Applications a mounted editor SURFACE is presenting right now.
401
+ *
402
+ * The story sheet knows its own Applications because it created them inside
403
+ * one call ({@link withApplicationCollector}); a board does not — its exhibits
404
+ * outlive any single capture, and the capture is taken by a door
405
+ * (`capture-active-document`) that knows nothing about Pixi. So a surface that
406
+ * adopts mounted stories registers them here, and {@link presentedPixiFrame}
407
+ * is the `canvasFrame` the composite lane passes for EVERY document: it
408
+ * answers for a registered canvas and returns `null` — "read the canvas
409
+ * directly" — for every other. Without it a canvas board photographs blank,
410
+ * for exactly the reason {@link pixiCanvasFrame} records.
411
+ *
412
+ * OWNER: the presenting surface. The returned function is the ONE way to
413
+ * unregister, and it runs in that surface's own teardown.
414
+ */
415
+ const presentedApps = new Set<Application>();
416
+ const presentedCanvasFrames = new Map<HTMLCanvasElement, () => Promise<CanvasImageSource | null>>();
417
+
418
+ export function registerPresentedPixiApps(apps: readonly Application[]): () => void {
419
+ for (const app of apps) presentedApps.add(app);
420
+ return () => {
421
+ for (const app of apps) presentedApps.delete(app);
422
+ };
423
+ }
424
+
425
+ /** Register a surface whose presented pixels need preparation beyond Pixi's
426
+ * ordinary raw-stage extraction. The native canvas Scene uses this to render
427
+ * its independent editor camera immediately before capture; returning `null`
428
+ * then tells the compositor to read the already-presented canvas directly.
429
+ *
430
+ * Kept at the pixel boundary, not in the capture command: the presenting
431
+ * surface is the only owner that knows whether its view is a raw stage, a
432
+ * camera, a render texture, or some other native Pixi presentation. */
433
+ export function registerPresentedCanvasFrame(
434
+ canvas: HTMLCanvasElement,
435
+ frame: () => Promise<CanvasImageSource | null>,
436
+ ): () => void {
437
+ presentedCanvasFrames.set(canvas, frame);
438
+ return () => {
439
+ if (presentedCanvasFrames.get(canvas) === frame) presentedCanvasFrames.delete(canvas);
440
+ };
441
+ }
442
+
443
+ /** The `canvasFrame` seam over {@link registerPresentedPixiApps}' live set. */
444
+ export function presentedPixiFrame(canvas: HTMLCanvasElement): Promise<CanvasImageSource | null> {
445
+ const prepared = presentedCanvasFrames.get(canvas);
446
+ if (prepared) return prepared();
447
+ return pixiCanvasFrame([...presentedApps])(canvas);
448
+ }
449
+
450
+ /**
451
+ * Run `task` with every `Application` created during it collected.
452
+ *
453
+ * `__PIXI_APP_INIT__` is Pixi's own global init hook (`ApplicationInitHook`,
454
+ * the seam its devtools use), fired once per `Application.init()`. It is the
455
+ * only observation point keyed on the MOUNT itself: `@pixi/react` keys its
456
+ * reconciler roots off the canvas element in a map it does not export, and a
457
+ * story's `<Application>` is written by the story, so its `onInit` prop is not
458
+ * ours to pass. Any previously-installed hook (a devtools extension) is
459
+ * forwarded, and the previous value is restored when the window closes.
460
+ *
461
+ * Exported because the CAPTURE lane needs the same observation for a different
462
+ * reason — see {@link awaitPixiStoryFrame}.
463
+ */
464
+ export async function withApplicationCollector<T>(
465
+ task: (created: Application[]) => Promise<T>,
466
+ ): Promise<T> {
467
+ const created: Application[] = [];
468
+ const previous = globalThis.__PIXI_APP_INIT__;
469
+ globalThis.__PIXI_APP_INIT__ = (instance, version) => {
470
+ // The hook's declared parameter is `Application | Renderer`; only
471
+ // `ApplicationInitHook` calls THIS one, but narrow structurally rather than
472
+ // trust that, since a mis-typed entry would put a renderer on the board.
473
+ const candidate = instance as Partial<Application>;
474
+ if (candidate.stage && candidate.ticker) created.push(instance as Application);
475
+ previous?.(instance, version);
476
+ };
477
+ try {
478
+ return await task(created);
479
+ } finally {
480
+ globalThis.__PIXI_APP_INIT__ = previous;
481
+ }
482
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * THE FREE CAPTURE CAMERA AND CLIP POSE, validated at the relay boundary —
3
+ * `--azimuth/--elevation/--distance` and `--clip/--time` as they arrive on a
4
+ * capture command.
5
+ *
6
+ * Extracted from `command-listener.ts:1016,1053`, where both parsers were
7
+ * private to that module and already served TWO verbs:
8
+ * `capture-asset-preview`, which stays in that table, and
9
+ * `capture-story-variants`, which carries its own relay budget and so is a
10
+ * registered command (`stories/story-capture-command.ts`). Two callers before
11
+ * the move and two after; nothing here is new.
12
+ *
13
+ * THE VERB NAMES ITSELF. Both refusals used to spell `capture-asset-preview`
14
+ * unconditionally, so a bad `--azimuth` on `vgai screenshot <module>.stories.tsx`
15
+ * refused in the name of a command the caller never ran. The verb is a
16
+ * parameter now, which the extraction is what made visible.
17
+ */
18
+
19
+ /** Validate an untrusted `camera` payload: the parsed choice, `undefined` when
20
+ * absent, or the refusal message naming `verb`. */
21
+ export function parseCameraChoice(
22
+ verb: string,
23
+ value: unknown,
24
+ ): { azimuthDegrees: number; elevationDegrees: number; distance?: number } | undefined | string {
25
+ if (value === undefined) return undefined;
26
+ const record = value as {
27
+ azimuthDegrees?: unknown;
28
+ elevationDegrees?: unknown;
29
+ distance?: unknown;
30
+ } | null;
31
+ if (
32
+ record === null ||
33
+ typeof record !== 'object' ||
34
+ typeof record.azimuthDegrees !== 'number' ||
35
+ !Number.isFinite(record.azimuthDegrees) ||
36
+ typeof record.elevationDegrees !== 'number' ||
37
+ !Number.isFinite(record.elevationDegrees) ||
38
+ record.elevationDegrees < -90 ||
39
+ record.elevationDegrees > 90 ||
40
+ (record.distance !== undefined &&
41
+ (typeof record.distance !== 'number' ||
42
+ !Number.isFinite(record.distance) ||
43
+ record.distance <= 0))
44
+ ) {
45
+ return (
46
+ `${verb} camera must be {azimuthDegrees, elevationDegrees in [-90, 90], ` +
47
+ 'distance? > 0 meters}.'
48
+ );
49
+ }
50
+ return {
51
+ azimuthDegrees: record.azimuthDegrees,
52
+ elevationDegrees: record.elevationDegrees,
53
+ ...(record.distance === undefined ? {} : { distance: record.distance }),
54
+ };
55
+ }
56
+
57
+ /** Validate an untrusted `pose` payload: the parsed pose, `undefined` when
58
+ * absent, or the refusal message naming `verb`. */
59
+ export function parsePoseChoice(
60
+ verb: string,
61
+ value: unknown,
62
+ ): { clip: string; timeSeconds: number } | undefined | string {
63
+ if (value === undefined) return undefined;
64
+ const record = value as { clip?: unknown; timeSeconds?: unknown } | null;
65
+ if (
66
+ record === null ||
67
+ typeof record !== 'object' ||
68
+ typeof record.clip !== 'string' ||
69
+ record.clip.length === 0 ||
70
+ typeof record.timeSeconds !== 'number' ||
71
+ !Number.isFinite(record.timeSeconds) ||
72
+ record.timeSeconds < 0
73
+ ) {
74
+ return `${verb} pose must be {clip: non-empty string, timeSeconds >= 0}.`;
75
+ }
76
+ return { clip: record.clip, timeSeconds: record.timeSeconds };
77
+ }