@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,517 @@
1
+ /**
2
+ * Story registry (C3, spec §9) — the story sibling of `tool-loader.ts`'s
3
+ * registry half: ties `story-discovery.ts` (find modules) and
4
+ * `compose-project-stories.ts` (portable-mount one loaded module) together
5
+ * into a live, `useSyncExternalStore`-shaped list consumed by React design-time
6
+ * world mounting and its document/story hierarchy.
7
+ *
8
+ * Same discipline as the tool registry: discovery is a live rescan (never a
9
+ * cached manifest, D3), re-run on project open/change and on the server's
10
+ * `story-files-changed` SSE broadcast (a new/removed `*.stories.tsx`).
11
+ * Per-module failures (a module that fails to import, or fails to compose)
12
+ * are collected alongside successes rather than dropped — the panel shows a
13
+ * broken module's error inline, naming the module (spec §9 "errors identify
14
+ * the source module"), instead of silently omitting it.
15
+ */
16
+
17
+ import { sortStoriesV7 } from 'storybook/internal/preview-api';
18
+ import type { Addon_StorySortParameterV7, IndexEntry } from 'storybook/internal/types';
19
+ import { activeProjectKey } from '../active-project';
20
+ import {
21
+ recordStoryDiscoveryTiming,
22
+ waitForFirstViewportFrame,
23
+ } from '../viewport-activation-timings';
24
+ import {
25
+ type ComposedProjectStory,
26
+ composeProjectStories,
27
+ ensureProjectAnnotations,
28
+ } from './compose-project-stories';
29
+ import { getProjectStoryRegions } from './project-story-regions';
30
+ import { declaredStoryMedium } from './story-declared-medium';
31
+ import { deriveStoryGroupPath, formatStoryGroupPath } from './story-grouping';
32
+
33
+ /** One composed portable CSF story of the open project, carrying the source
34
+ * module it came from. A story belongs to the PROJECT, not to a root: the
35
+ * design-time board is the project's component gallery, and which root a
36
+ * story previews is DERIVED from the component its CSF meta renders
37
+ * ({@link pickComponentPreviewStory}). No story args/decorators/loaders are
38
+ * copied or reinterpreted. */
39
+ export interface ProjectPreviewStory extends ComposedProjectStory {
40
+ readonly modulePath: string;
41
+ }
42
+
43
+ import { discoverProjectStories, loadProjectPreviewAnnotations } from './story-discovery';
44
+
45
+ /** One discovered module's outcome after load + compose. */
46
+ export type ProjectStoryModule =
47
+ | { modulePath: string; ok: true; stories: ComposedProjectStory[] }
48
+ | { modulePath: string; ok: false; error: string };
49
+
50
+ interface StoryDiscoveryProjectLike {
51
+ rootPath: string;
52
+ }
53
+
54
+ let _modules: ProjectStoryModule[] = [];
55
+ let _ready = false;
56
+ let _refreshGeneration = 0;
57
+ let _registryProjectKey: string | null = null;
58
+ const _requestedModules = new Map<string, Promise<void>>();
59
+ const _listeners = new Set<() => void>();
60
+
61
+ function adoptRegistryProject(): void {
62
+ const key = activeProjectKey();
63
+ if (_registryProjectKey === key) return;
64
+ _registryProjectKey = key;
65
+ _refreshGeneration++;
66
+ _requestedModules.clear();
67
+ publish([], false);
68
+ }
69
+
70
+ /** Current story modules (stable reference between refreshes). */
71
+ export function getProjectStoryModules(): ProjectStoryModule[] {
72
+ return _modules;
73
+ }
74
+
75
+ /** True only after the current project's discovery pass has published. An
76
+ * empty ready registry is a real "no stories" answer; an empty unready one is
77
+ * boot in flight and must never be graded as a missing component surface. */
78
+ export function projectStoriesReady(): boolean {
79
+ return _ready;
80
+ }
81
+
82
+ /** Subscribe to story-registry changes. Returns an unsubscribe function. */
83
+ export function subscribeProjectStoryModules(fn: () => void): () => void {
84
+ _listeners.add(fn);
85
+ return () => _listeners.delete(fn);
86
+ }
87
+
88
+ /**
89
+ * Resolve once the registry is READY — which is not the same as awaiting your
90
+ * own {@link refreshProjectStories}.
91
+ *
92
+ * A refresh that a LATER refresh supersedes returns EARLY, by design (a
93
+ * second concurrent pass aborts the first), and it returns with `_modules`
94
+ * still emptied by `_ready = false`. A caller that only awaited its own call
95
+ * therefore reads an empty registry and cannot tell it from "this project has
96
+ * no stories" — measured 2026-09-18 on a `full` scaffold, where the boot
97
+ * document restore raced the discovery lifecycle's own pass and dropped the
98
+ * open story document as a failed verification.
99
+ *
100
+ * Deliberately unbounded: every path that clears `_ready` is a refresh that
101
+ * publishes ready again when it finishes, succeeded or failed, and the
102
+ * workspace restore that calls this is itself time-boxed by the host
103
+ * (`workspace-state-persistence.ts`'s `RESTORE_TIMEOUT_MS` bounds when
104
+ * write-through installs, never the restore). A number here would be an
105
+ * invented tolerance over a condition that already resolves itself.
106
+ */
107
+ export function whenProjectStoriesReady(): Promise<void> {
108
+ if (_ready) return Promise.resolve();
109
+ return new Promise((resolve) => {
110
+ const stop = subscribeProjectStoryModules(() => {
111
+ if (!_ready) return;
112
+ stop();
113
+ resolve();
114
+ });
115
+ });
116
+ }
117
+
118
+ function vgaiParameters(story: ComposedProjectStory): Record<string, unknown> | null {
119
+ const value = story.parameters['vgai'];
120
+ return value && typeof value === 'object' ? (value as Record<string, unknown>) : null;
121
+ }
122
+
123
+ /** Every composed story the project declares, in discovery/export order —
124
+ * the whole membership of the React design-time board and of the hierarchy's
125
+ * story documents. Deliberately unfiltered: the board is the project's
126
+ * component gallery, so a story earns its place by existing, and only the
127
+ * root's own default preview is derived from a component
128
+ * ({@link getComponentPreviewStory}). */
129
+ export function getProjectPreviewStories(): ProjectPreviewStory[] {
130
+ const out: ProjectPreviewStory[] = [];
131
+ for (const module_ of _modules) {
132
+ if (!module_.ok) continue;
133
+ for (const story of module_.stories) {
134
+ out.push({ ...story, modulePath: module_.modulePath });
135
+ }
136
+ }
137
+ const storySort = out
138
+ .map((story) => {
139
+ const options = story.parameters['options'];
140
+ return options && typeof options === 'object'
141
+ ? (options as Record<string, unknown>)['storySort']
142
+ : undefined;
143
+ })
144
+ .find((value) => value !== undefined) as Addon_StorySortParameterV7 | undefined;
145
+ if (!storySort) return out;
146
+
147
+ const byId = new Map(out.map((story) => [story.id, story]));
148
+ const entries: IndexEntry[] = out.map((story) => ({
149
+ type: 'story',
150
+ id: story.id,
151
+ name: story.label,
152
+ title:
153
+ story.title ?? formatStoryGroupPath(deriveStoryGroupPath({ modulePath: story.modulePath })),
154
+ importPath: story.modulePath,
155
+ tags: [...(story.tags ?? [])],
156
+ }));
157
+ return sortStoriesV7(entries, storySort, [...new Set(out.map((story) => story.modulePath))])
158
+ .map((entry) => byId.get(entry.id))
159
+ .filter((story): story is ProjectPreviewStory => story !== undefined);
160
+ }
161
+
162
+ /** Whether a CSF module declares this story as its component's default:
163
+ * `parameters.vgai.default === true` on the story itself, or a
164
+ * `vgai.defaultStory` naming it (a meta-level parameter, which Storybook
165
+ * composes down onto every story in the module). */
166
+ export function isDeclaredDefaultStory(story: ComposedProjectStory): boolean {
167
+ const vgai = vgaiParameters(story);
168
+ if (!vgai) return false;
169
+ if (vgai['default'] === true) return true;
170
+ return typeof vgai['defaultStory'] === 'string' && vgai['defaultStory'] === story.name;
171
+ }
172
+
173
+ /** The directory portion of a project-relative source path, normalized. */
174
+ function sourceDir(path: string): string {
175
+ const normalized = path.replaceAll('\\', '/').replace(/^\.\//, '');
176
+ const slash = normalized.lastIndexOf('/');
177
+ return slash >= 0 ? normalized.slice(0, slash) : '';
178
+ }
179
+
180
+ /**
181
+ * Choose the best composed story for one component, joined on
182
+ * `meta.component`'s name (the registry's own `componentName`) — pure over a
183
+ * module list so it is unit-testable without the live registry. This is THE
184
+ * story↔component join: a `three` prefab's own declaration and
185
+ * THUMBNAIL (mounted off-screen by `story-three-preview.ts`; no live instance
186
+ * or referenced asset substitutes for it) and a React root's composed default
187
+ * preview (`design-time-layers.ts`, joined against the root entry's
188
+ * default-exported component) both go through it.
189
+ *
190
+ * `componentPath` (the component's own source file) disambiguates the known
191
+ * weak spot of a name-only join: two files can export a same-named component,
192
+ * so a story is PREFERRED when its module sits in the same source directory as
193
+ * the component. Within the chosen set, a story the module declares as the
194
+ * default ({@link isDeclaredDefaultStory}) wins; otherwise discovery order.
195
+ */
196
+ export function pickComponentPreviewStory(
197
+ modules: readonly ProjectStoryModule[],
198
+ componentName: string,
199
+ componentPath?: string,
200
+ ): ProjectPreviewStory | null {
201
+ const pool = componentPreviewStories(modules, componentName, componentPath);
202
+ return pool.find(isDeclaredDefaultStory) ?? pool[0] ?? null;
203
+ }
204
+
205
+ /**
206
+ * Every portable state declared for one component. The same source-directory
207
+ * preference as {@link pickComponentPreviewStory} disambiguates equal export
208
+ * names without hiding sibling stories from the component's Inspector.
209
+ */
210
+ export function componentPreviewStories(
211
+ modules: readonly ProjectStoryModule[],
212
+ componentName: string,
213
+ componentPath?: string,
214
+ ): ProjectPreviewStory[] {
215
+ const matches: ProjectPreviewStory[] = [];
216
+ for (const module_ of modules) {
217
+ if (!module_.ok) continue;
218
+ for (const story of module_.stories) {
219
+ if (story.componentName === componentName) {
220
+ matches.push({ ...story, modulePath: module_.modulePath });
221
+ }
222
+ }
223
+ }
224
+ if (matches.length === 0) return [];
225
+ const sameDir = componentPath
226
+ ? matches.filter((story) => sourceDir(story.modulePath) === sourceDir(componentPath))
227
+ : [];
228
+ return sameDir.length > 0 ? sameDir : matches;
229
+ }
230
+
231
+ /** {@link pickComponentPreviewStory} over the LIVE registry — what the content
232
+ * gallery calls to find a prefab's thumbnail story, and what
233
+ * `design-time-layers.ts` calls to find a React root's composed default
234
+ * preview from the root entry's own component. */
235
+ export function getComponentPreviewStory(
236
+ componentName: string,
237
+ componentPath?: string,
238
+ ): ProjectPreviewStory | null {
239
+ return pickComponentPreviewStory(_modules, componentName, componentPath);
240
+ }
241
+
242
+ /** Live-registry form of {@link componentPreviewStories}. */
243
+ export function getComponentPreviewStories(
244
+ componentName: string,
245
+ componentPath?: string,
246
+ ): ProjectPreviewStory[] {
247
+ return componentPreviewStories(_modules, componentName, componentPath);
248
+ }
249
+
250
+ function publish(next: ProjectStoryModule[], ready: boolean): void {
251
+ _modules = next;
252
+ _ready = ready;
253
+ for (const fn of _listeners) fn();
254
+ }
255
+
256
+ interface TimedStoryModule {
257
+ readonly result: ProjectStoryModule;
258
+ readonly loadMs: number;
259
+ readonly composeMs: number;
260
+ }
261
+
262
+ async function loadStoryModule({
263
+ modulePath,
264
+ load,
265
+ }: {
266
+ readonly modulePath: string;
267
+ readonly load: () => Promise<unknown>;
268
+ }): Promise<TimedStoryModule> {
269
+ const loadStartedAtMs = Date.now();
270
+ let mod: unknown;
271
+ try {
272
+ mod = await load();
273
+ } catch (err) {
274
+ return {
275
+ result: {
276
+ modulePath,
277
+ ok: false,
278
+ error: `[stories] failed to load ${modulePath} — ${String(err instanceof Error ? err.message : err)}`,
279
+ },
280
+ loadMs: Date.now() - loadStartedAtMs,
281
+ composeMs: 0,
282
+ };
283
+ }
284
+ const loadMs = Date.now() - loadStartedAtMs;
285
+ const composeStartedAtMs = Date.now();
286
+ const result = await composeProjectStories(modulePath, mod);
287
+ return {
288
+ result: result.ok
289
+ ? { modulePath, ok: true, stories: result.stories }
290
+ : { modulePath, ok: false, error: result.error },
291
+ loadMs,
292
+ composeMs: Date.now() - composeStartedAtMs,
293
+ };
294
+ }
295
+
296
+ /** Open one explicit story without evaluating every other project example.
297
+ * Full discovery still owns catalog completeness; this only publishes the
298
+ * requested module into that same registry, without marking it complete. */
299
+ export function ensureProjectStoryModule(
300
+ project: StoryDiscoveryProjectLike | null,
301
+ modulePath: string,
302
+ ): Promise<void> {
303
+ adoptRegistryProject();
304
+ const projectKey = activeProjectKey();
305
+ const key = `${projectKey}\n${modulePath}`;
306
+ const existing = _requestedModules.get(key);
307
+ if (existing) return existing;
308
+ const pending = loadRequestedStoryModule(project, projectKey, modulePath).finally(() => {
309
+ if (_requestedModules.get(key) === pending) _requestedModules.delete(key);
310
+ });
311
+ _requestedModules.set(key, pending);
312
+ return pending;
313
+ }
314
+
315
+ async function loadRequestedStoryModule(
316
+ project: StoryDiscoveryProjectLike | null,
317
+ projectKey: string,
318
+ modulePath: string,
319
+ ): Promise<void> {
320
+ while (activeProjectKey() === projectKey) {
321
+ // A published composition is immediately usable. The document subscribes
322
+ // to subsequent source refreshes; opening never waits on unrelated modules.
323
+ const prior = _modules.find((module_) => module_.modulePath === modulePath);
324
+ if (prior?.ok) return;
325
+ const generation = _refreshGeneration;
326
+ const current = () => activeProjectKey() === projectKey && generation === _refreshGeneration;
327
+ const annotations = await loadProjectPreviewAnnotations(project);
328
+ if (!current()) continue;
329
+ await ensureProjectAnnotations(annotations);
330
+ if (!current()) continue;
331
+ const discovered = await discoverProjectStories(project);
332
+ if (!current()) continue;
333
+ const requested = discovered.find((module_) => module_.modulePath === modulePath);
334
+ if (!requested) throw new Error(`Story module not found: ${modulePath}`);
335
+ const { result } = await loadStoryModule(requested);
336
+ if (!current()) continue;
337
+ // Full discovery can publish this module while its demanded load runs.
338
+ // That publication owns the row; a slower request must not replace it.
339
+ const published = _modules.find((module_) => module_.modulePath === modulePath);
340
+ if (published && published !== prior) {
341
+ if (!published.ok) throw new Error(published.error);
342
+ return;
343
+ }
344
+ publish([..._modules.filter((module_) => module_.modulePath !== modulePath), result], _ready);
345
+ if (!result.ok) throw new Error(result.error);
346
+ return;
347
+ }
348
+ throw new Error(`Project changed while opening story: ${modulePath}`);
349
+ }
350
+
351
+ /** Let the first visible editor work finish before evaluating story modules
352
+ * whose medium cannot be known from the project's declared regions. Those
353
+ * modules commonly hold dense DOM kits; loading them eagerly made a 3D board
354
+ * wait on code it cannot display. Storybook uses the same broad architecture:
355
+ * index first, evaluate a story module only when its surface needs it. */
356
+ async function waitForStoryImportIdle(): Promise<void> {
357
+ // `requestIdleCallback` only means the browser main thread is momentarily
358
+ // idle; it fired while the first Scene was still driving ~1,000 Vite module
359
+ // requests and pulled the data-grid story graph into that same
360
+ // queue. Wait for an authored frame first. The timeout preserves recovery
361
+ // for a genuinely broken viewport without making background stories part
362
+ // of the ordinary startup path.
363
+ await Promise.race([
364
+ waitForFirstViewportFrame(),
365
+ new Promise<void>((resolve) => setTimeout(resolve, 5_000)),
366
+ ]);
367
+ await new Promise<void>((resolve) => {
368
+ const idle = globalThis.requestIdleCallback;
369
+ if (typeof idle === 'function') {
370
+ idle(() => resolve(), { timeout: 2_000 });
371
+ return;
372
+ }
373
+ setTimeout(resolve, 0);
374
+ });
375
+ }
376
+
377
+ /**
378
+ * Re-run the whole discovery + load + compose pass. Never throws: a broken
379
+ * module (import failure, or a `composeProjectStories` failure) becomes an
380
+ * `{ ok: false, error }` entry naming the module, and every other module
381
+ * still loads — the same "one bad file never takes the rest down" physics
382
+ * `refreshProjectTools` uses.
383
+ *
384
+ * Applies the project's `.storybook/preview.ts(x)` annotations (if the
385
+ * project has one — `loadProjectPreviewAnnotations`) via
386
+ * `ensureProjectAnnotations` before composing anything, exactly once per
387
+ * session. `explicitPreviewAnnotations` is a test/caller override — pass it
388
+ * to skip the `/@fs/` discovery and thread a fixture's annotations directly.
389
+ */
390
+ export async function refreshProjectStories(
391
+ project: StoryDiscoveryProjectLike | null,
392
+ explicitPreviewAnnotations?: unknown,
393
+ options: {
394
+ readonly deferUndeclared?: boolean;
395
+ /**
396
+ * The source paths a CONTENT write changed, when that is what triggered
397
+ * this refresh. With it, a story module whose bundled closure holds none
398
+ * of them keeps its published result instead of being re-evaluated, and
399
+ * the modules that do reload go ONE AT A TIME with a frame between them:
400
+ * re-bundling all ten of a project's story modules at once, on the main
401
+ * thread, beside the world's own remount, is what held the editor at 7–12
402
+ * FPS for seconds after every prefab drop (three human passes; profiled
403
+ * 2026-09-03). Boot and explicit refreshes pass nothing and load in
404
+ * parallel, as before.
405
+ */
406
+ readonly changedPaths?: ReadonlySet<string>;
407
+ } = {},
408
+ ): Promise<void> {
409
+ adoptRegistryProject();
410
+ const generation = ++_refreshGeneration;
411
+ const projectKey = activeProjectKey();
412
+ const current = () => generation === _refreshGeneration && projectKey === activeProjectKey();
413
+ const loadAll = async (
414
+ list: readonly { readonly modulePath: string; readonly load: () => Promise<unknown> }[],
415
+ ): Promise<TimedStoryModule[]> => {
416
+ if (!options.changedPaths) return Promise.all(list.map(loadStoryModule));
417
+ // A write-driven refresh loads one module per frame instead: the reload
418
+ // itself is a module-cache hit, but COMPOSING every story on one turn
419
+ // beside the world's own remount is what held the editor at 7-12 FPS
420
+ // after a prefab drop.
421
+ const out: TimedStoryModule[] = [];
422
+ for (const item of list) {
423
+ out.push(await loadStoryModule(item));
424
+ // Give the viewport a frame between modules.
425
+ await new Promise((resolve) => setTimeout(resolve, 16));
426
+ if (!current()) break;
427
+ }
428
+ return out;
429
+ };
430
+ _ready = false;
431
+ for (const fn of _listeners) fn();
432
+ const startedAtMs = Date.now();
433
+ const previewStartedAtMs = Date.now();
434
+ const previewAnnotations =
435
+ explicitPreviewAnnotations ?? (await loadProjectPreviewAnnotations(project));
436
+ if (!current()) return;
437
+ const previewAnnotationsMs = Date.now() - previewStartedAtMs;
438
+ const annotationsStartedAtMs = Date.now();
439
+ await ensureProjectAnnotations(previewAnnotations);
440
+ if (!current()) return;
441
+ const runtimeAnnotationsMs = Date.now() - annotationsStartedAtMs;
442
+
443
+ const scanStartedAtMs = Date.now();
444
+ const discovered = await discoverProjectStories(project);
445
+ if (!current()) return;
446
+ const fileScanMs = Date.now() - scanStartedAtMs;
447
+ // Module evaluation is independent; only STORY MOUNTING is serialized
448
+ // (`story-mount-turn.ts`) because loaders may mutate shared preview state.
449
+ // Loading every CSF module one after another made editor boot scale with the
450
+ // SUM of Vite transforms and network round trips (measured at 16s for the
451
+ // template and 23s for third-person). Preserve discovery order by mapping
452
+ // `Promise.all` over the ordered input rather than pushing as jobs finish.
453
+ const regions = getProjectStoryRegions();
454
+ const deferred = options.deferUndeclared
455
+ ? discovered.filter(
456
+ ({ modulePath }) => declaredStoryMedium({ modulePath, regions }).via === 'undeclared',
457
+ )
458
+ : [];
459
+ const deferredPaths = new Set(deferred.map(({ modulePath }) => modulePath));
460
+ const immediate = discovered.filter(({ modulePath }) => !deferredPaths.has(modulePath));
461
+ const modulesStartedAtMs = Date.now();
462
+ const immediateLoaded = await loadAll(immediate);
463
+ const moduleLoadAndComposeMs = Date.now() - modulesStartedAtMs;
464
+ const immediateResults = immediateLoaded.map(({ result }) => result);
465
+ if (!current()) return;
466
+
467
+ // Publish the declared surfaces as soon as they are usable. The registry is
468
+ // deliberately not "ready" until the background tail has also landed, so
469
+ // acceptance/coverage cannot mistake a partial index for the final answer.
470
+ const immediateByPath = new Map(
471
+ [
472
+ // A demanded story may already be open while the catalog evaluates its
473
+ // immediate set. Keep that row (and other last-good deferred rows) until
474
+ // their replacements arrive; a partial catalog must not remove them.
475
+ ..._modules.filter(({ modulePath }) => deferredPaths.has(modulePath)),
476
+ ...immediateResults,
477
+ ].map((result) => [result.modulePath, result]),
478
+ );
479
+ publish(
480
+ discovered
481
+ .map(({ modulePath }) => immediateByPath.get(modulePath))
482
+ .filter((result): result is ProjectStoryModule => result !== undefined),
483
+ deferred.length === 0,
484
+ );
485
+ recordStoryDiscoveryTiming({
486
+ ms: Date.now() - startedAtMs,
487
+ completedAtMs: Date.now(),
488
+ moduleCount: immediateResults.length,
489
+ storyCount: immediateResults.reduce(
490
+ (count, module_) => count + (module_.ok ? module_.stories.length : 0),
491
+ 0,
492
+ ),
493
+ previewAnnotationsMs,
494
+ runtimeAnnotationsMs,
495
+ fileScanMs,
496
+ moduleLoadAndComposeMs,
497
+ modules: immediateLoaded.map(({ result, loadMs, composeMs }) => ({
498
+ modulePath: result.modulePath,
499
+ loadMs,
500
+ composeMs,
501
+ ok: result.ok,
502
+ })),
503
+ });
504
+ if (deferred.length === 0) return;
505
+
506
+ await waitForStoryImportIdle();
507
+ if (!current()) return;
508
+ const deferredResults = (await loadAll(deferred)).map(({ result }) => result);
509
+ if (!current()) return;
510
+ const resultByPath = new Map(
511
+ [...immediateResults, ...deferredResults].map((result) => [result.modulePath, result]),
512
+ );
513
+ const next = discovered
514
+ .map(({ modulePath }) => resultByPath.get(modulePath))
515
+ .filter((result): result is ProjectStoryModule => result !== undefined);
516
+ publish(next, true);
517
+ }