@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,126 @@
1
+ /**
2
+ * A story's MEDIUM is a declaration, never a mount.
3
+ *
4
+ * ARCHITECTURE-CORE §Zero inference: the system answers a question by reading
5
+ * a declaration, walking ground truth, or diagnosing declared-vs-measured
6
+ * drift loudly. Mounting a story to guess whether it is a DOM / three /
7
+ * canvas member is the third thing that section forbids.
8
+ *
9
+ * The ONE rung: **the story file's region** — `resolveFileRegion` over the
10
+ * project's adapter `include` / `mounts` and the manifest root entries. Prefab
11
+ * stories match the adapter's `src/prefabs` include glob because that glob is
12
+ * an adapter-selected finder, not because a sibling file exists.
13
+ *
14
+ * Anything it cannot place is {@link DeclaredStoryMedium.via}
15
+ * `'undeclared'` — a named gap, never a candidate on any board, never a
16
+ * mount. Presence names it; board membership skips it.
17
+ */
18
+
19
+ import type { ProjectRegionEntry } from '../asset-workflow/project-source-index';
20
+ import {
21
+ type FileRegionAnswer,
22
+ type RegionBinding,
23
+ resolveFileRegion,
24
+ } from '../ui-source/file-region-resolver';
25
+
26
+ /** The three boards a declared story can belong to. */
27
+ export type StoryMedium = 'three' | 'canvas' | 'dom';
28
+
29
+ export type DeclaredStoryVia = 'declared-include' | 'root-entry' | 'undeclared';
30
+
31
+ export interface DeclaredStoryMedium {
32
+ readonly medium?: StoryMedium;
33
+ readonly via: DeclaredStoryVia;
34
+ /** Set only when {@link DeclaredStoryVia} is `'undeclared'`. */
35
+ readonly reason?: string;
36
+ }
37
+
38
+ function normalizeRelative(path: string): string {
39
+ return path.replaceAll('\\', '/').replace(/^\.\//, '').replace(/^\//, '');
40
+ }
41
+
42
+ function regionOfEntryLookup(
43
+ regions: readonly ProjectRegionEntry[],
44
+ ): (file: string) => RegionBinding | undefined {
45
+ const byEntry = new Map<string, ProjectRegionEntry>();
46
+ for (const region of regions) {
47
+ if (region.entry) byEntry.set(normalizeRelative(region.entry), region);
48
+ }
49
+ return (file) => byEntry.get(normalizeRelative(file));
50
+ }
51
+
52
+ function resolvePath(
53
+ projectRelative: string,
54
+ regions: readonly ProjectRegionEntry[],
55
+ ): FileRegionAnswer {
56
+ const file = normalizeRelative(projectRelative);
57
+ return resolveFileRegion({
58
+ file,
59
+ projectRelative: file,
60
+ regions,
61
+ regionOfEntry: regionOfEntryLookup(regions),
62
+ });
63
+ }
64
+
65
+ function surfaceAsMedium(surface: FileRegionAnswer['surface']): StoryMedium | undefined {
66
+ return surface === 'three' || surface === 'canvas' || surface === 'dom' ? surface : undefined;
67
+ }
68
+
69
+ function viaForAnswer(
70
+ answer: FileRegionAnswer,
71
+ ): Exclude<DeclaredStoryVia, 'undeclared'> | undefined {
72
+ if (answer.via === 'declared-include') return 'declared-include';
73
+ if (answer.via === 'root-entry') return 'root-entry';
74
+ return undefined;
75
+ }
76
+
77
+ /**
78
+ * Read the declared medium of one story. Pure: regions and the CSF identity
79
+ * are the only inputs. Does not import, compose, or mount anything.
80
+ */
81
+ export function declaredStoryMedium(input: {
82
+ readonly modulePath?: string | undefined;
83
+ readonly regions?: readonly ProjectRegionEntry[] | undefined;
84
+ }): DeclaredStoryMedium {
85
+ const regions = input.regions ?? [];
86
+ const modulePath = input.modulePath ? normalizeRelative(input.modulePath) : '';
87
+ if (!modulePath) {
88
+ return { via: 'undeclared', reason: 'story has no module path' };
89
+ }
90
+
91
+ const own = resolvePath(modulePath, regions);
92
+ const ownMedium = surfaceAsMedium(own.surface);
93
+ const ownVia = viaForAnswer(own);
94
+ if (ownMedium && ownVia) return { medium: ownMedium, via: ownVia };
95
+
96
+ return {
97
+ via: 'undeclared',
98
+ reason: `${modulePath} is not named by a region include/mount and is not a manifest root entry`,
99
+ };
100
+ }
101
+
102
+ const reportedUndeclared = new Set<string>();
103
+
104
+ /** Name an undeclared story once. Nothing may mount it to guess a medium. */
105
+ export function reportUndeclaredStoryMedium(modulePath: string, reason?: string): void {
106
+ const key = normalizeRelative(modulePath);
107
+ if (reportedUndeclared.has(key)) return;
108
+ reportedUndeclared.add(key);
109
+ // biome-ignore lint/suspicious/noConsole: declared-vs-measured gap — the doctrine's third arm, same instrument as reportUnreadableRegions.
110
+ console.warn(
111
+ `[story-media] ${key} has no declared medium` +
112
+ (reason ? ` — ${reason}` : '') +
113
+ '. It is not a candidate on any board. Declare it via ' +
114
+ '`vgai.adapter.ts` regionIncludes or a manifest root entry.',
115
+ );
116
+ }
117
+
118
+ /** Forget which gaps have already been named — project switch, or a test. */
119
+ export function resetUndeclaredStoryMediumReports(): void {
120
+ reportedUndeclared.clear();
121
+ }
122
+
123
+ /** Test-only alias. */
124
+ export function __resetUndeclaredStoryMediumReportsForTest(): void {
125
+ resetUndeclaredStoryMediumReports();
126
+ }
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Story discovery — C3 (spec §9, "Add CSF Discovery and Portable Story
3
+ * Mounting"). The story sibling of `tool-loader.ts`: conventional
4
+ * `src/**\/*.stories.tsx` / `*.stories.ts` files of the open project are found
5
+ * via the editor server's folder scan (`GET /__editor/story-files`,
6
+ * `editor-server.ts`) — the SAME "discovery IS a live folder scan, never a
7
+ * cached manifest" physics `tool-loader.ts`/ `DataPanel.tsx` already use.
8
+ *
9
+ * Deliberately paths-only, same reasoning as tool discovery: the CSF MODULE
10
+ * itself is loaded client-side through Vite's `/@fs/` dynamic-import path
11
+ * (`compose-project-stories.ts` calls `load()` below), so it arrives
12
+ * transpiled with HMR and the editor never stores a duplicate story
13
+ * definition anywhere — the CSF module on disk stays the single source of
14
+ * truth (spec §9 C3 "Story source remains the CSF module").
15
+ *
16
+ * A HOST THAT DOES NOT SERVE `/__editor/story-files` is recognised by the
17
+ * ANSWER's content type, never by `res.ok`: a host with an SPA fallback
18
+ * answers any unmatched path `200` with HTML, so `res.ok` is TRUE and the only
19
+ * failure is `res.json()` throwing into a `catch` that returned `undefined`.
20
+ * Discovery then resolved to `[]`,
21
+ * which the Stories panel renders as "this root has no portable CSF previews"
22
+ * — a claim about the PROJECT, produced by a build that never read it.
23
+ *
24
+ * The browser (server-less) tier discovers and loads stories from STORAGE:
25
+ * the scan is a `StorageBackend` walk for the same `*.stories.tsx?` shape the
26
+ * server route matches, regions come from the project's own manifest/adapter
27
+ * through the session's own route, and `load()` imports the CSF module the
28
+ * way every project module loads.
29
+ */
30
+
31
+ import type { ProjectRegionEntry } from '../asset-workflow/project-source-index';
32
+ import { editorServerJson } from '../editor-server-response';
33
+ import { setProjectStoryRegions } from './project-story-regions';
34
+
35
+ /**
36
+ * Why this session could not discover stories, or `null` when discovery
37
+ * genuinely ran (in which case an empty list IS "no stories").
38
+ *
39
+ * Set by every path that returns early, so no caller has to tell "the project
40
+ * has none" apart from "nobody looked" by inspecting an empty array.
41
+ */
42
+ let _unavailable: string | null = null;
43
+
44
+ /** Why story discovery could not run this session, or `null` when it did.
45
+ * An empty module list with `null` here is a real "no stories" answer. */
46
+ export function storyDiscoveryUnavailable(): string | null {
47
+ return _unavailable;
48
+ }
49
+
50
+ /** One discovered story module — path only; the module is loaded on demand. */
51
+ export interface DiscoveredStoryModule {
52
+ /** Project-relative path, e.g. `src/ui/Button.stories.tsx`. */
53
+ modulePath: string;
54
+ /** Dynamically imports the CSF module via Vite's `/@fs/` path, cache-busted
55
+ * so a re-discover (or an explicit re-load) always gets fresh code — same
56
+ * contract as `tool-loader.ts`'s `refreshProjectTools`. Returns the raw
57
+ * module namespace (default export = Meta, named exports = stories). */
58
+ load: () => Promise<unknown>;
59
+ }
60
+
61
+ /** Minimal shape `discoverProjectStories` needs from the open project — the
62
+ * same fields `getCurrentProject()` (`project-manager.ts`) already returns,
63
+ * kept as a narrow parameter so this module doesn't need to import the
64
+ * whole project-manager (and stays trivially testable with a fixture). */
65
+ export interface StoryDiscoveryProject {
66
+ rootPath: string;
67
+ }
68
+
69
+ /** Shape of `/__editor/story-files` (editor-server.ts) — a live folder scan,
70
+ * never a cached manifest (D3), plus a server-truthed existence check for
71
+ * the project's optional `.storybook/preview.ts(x)`. */
72
+ interface StoryFilesPayload {
73
+ files: Array<{ path: string }>;
74
+ /** Project-relative path to whichever preview-config candidate exists on
75
+ * disk, or `null` when the project has no `.storybook/` folder at all
76
+ * (the common case — this repo's own template ships none). */
77
+ previewModulePath?: string | null;
78
+ /** Adapter + manifest regions the server already read — story medium is
79
+ * declared from these, never from a mount. Absent on older payloads. */
80
+ regions?: ProjectRegionEntry[];
81
+ }
82
+
83
+ // No project param: the editor server is single-project (`projectRoot` is
84
+ // server-side session state — `/__editor/open-project`), so this GET is
85
+ // never parameterized by project, same as `/__editor/tool-files`/
86
+ // `/__editor/data-files`.
87
+ async function fetchStoryFilesPayload(): Promise<StoryFilesPayload | undefined> {
88
+ try {
89
+ const res = await fetch('/__editor/story-files');
90
+ // Content type BEFORE parsing — see `editor-server-response.ts` for why
91
+ // `res.ok` cannot tell a real scan apart from this origin's page fallback.
92
+ const payload = await editorServerJson<StoryFilesPayload>(
93
+ res,
94
+ 'Scanning this project for stories failed',
95
+ );
96
+ if (Array.isArray(payload.regions)) setProjectStoryRegions(payload.regions);
97
+ return payload;
98
+ } catch (error) {
99
+ _unavailable = error instanceof Error ? error.message : String(error);
100
+ return undefined;
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Scan the open project for `*.stories.tsx` / `*.stories.ts` files (via the
106
+ * editor server's `/__editor/story-files` route) and return one
107
+ * `DiscoveredStoryModule` per file, each carrying a lazy `load()`.
108
+ *
109
+ * Never throws: a missing/unreachable route or no project open resolves to
110
+ * `[]`, mirroring `refreshProjectTools`'s "keep the editor alive" discipline —
111
+ * a broken discovery pass must not crash the Stories panel. Every early return
112
+ * records {@link storyDiscoveryUnavailable} first, so an empty list is only
113
+ * ever read as "this project has no stories" when discovery actually ran.
114
+ */
115
+ export async function discoverProjectStories(
116
+ project: StoryDiscoveryProject | null,
117
+ ): Promise<DiscoveredStoryModule[]> {
118
+ _unavailable = null;
119
+ if (!project) return [];
120
+
121
+ // Guard the REALM, not the response — the server-less tier scans storage
122
+ // and bundles in-browser; the dev/packaged tier asks its server and loads
123
+ // through `/@fs/`. Same split as `tool-loader.ts`'s contribution catalog.
124
+
125
+ const payload = await fetchStoryFilesPayload();
126
+ if (!payload) return [];
127
+
128
+ return payload.files.map(({ path: modulePath }) => ({
129
+ modulePath,
130
+ load: () =>
131
+ import(
132
+ /* @vite-ignore */ `/@fs/${project.rootPath}/${modulePath}?t=${Date.now()}`
133
+ ) as Promise<unknown>,
134
+ }));
135
+ }
136
+
137
+ /**
138
+ * Load the open project's `.storybook/preview.ts(x)` module namespace, if it
139
+ * has one — the project-level annotations `setProjectAnnotations` applies
140
+ * once per session (`compose-project-stories.ts`'s `ensureProjectAnnotations`,
141
+ * called from `story-registry.ts`'s `refreshProjectStories`). Resolves to
142
+ * `undefined` when the project has no `.storybook/` folder (this repo's own
143
+ * template ships none — Storybook's own documented default project
144
+ * annotations apply, same as running with no preview config at all) or when
145
+ * the file fails to import for any other reason; never throws — a project
146
+ * config error here must not block story discovery from working.
147
+ *
148
+ * Asks the server (`/__editor/story-files`'s `previewModulePath`) which
149
+ * candidate, if any, actually exists on disk BEFORE importing anything — no
150
+ * more blind `/@fs/` probing of a path that almost always isn't there. A
151
+ * project with no `.storybook/` folder now costs zero network requests here
152
+ * instead of one guaranteed-to-fail one (that failure was invisible to this
153
+ * function's own try/catch, since a browser reports a failed `/@fs/` fetch
154
+ * as a page-level network error regardless of how the JS that triggered it
155
+ * handles the rejection — see `check-vgai-generated-project-p2p.ts`, which
156
+ * caught this as a generated-project "browser error").
157
+ */
158
+ export async function loadProjectPreviewAnnotations(
159
+ project: StoryDiscoveryProject | null,
160
+ ): Promise<unknown> {
161
+ if (!project) return undefined;
162
+ // Same realm split as `discoverProjectStories`. Deliberately does NOT touch
163
+ // `_unavailable` — discovery owns that record, and this runs beside it.
164
+ const payload = await fetchStoryFilesPayload();
165
+ const modulePath = payload?.previewModulePath;
166
+ if (!modulePath) return undefined;
167
+ try {
168
+ return await import(
169
+ /* @vite-ignore */ `/@fs/${project.rootPath}/${modulePath}?t=${Date.now()}`
170
+ );
171
+ } catch {
172
+ // Reported as present but failed to import for some other reason (a
173
+ // genuine config error) — degrade the same way as "not present".
174
+ return undefined;
175
+ }
176
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The ADDRESSES a portable CSF story opens under, and the request shape that
3
+ * carries one — the story kind's half of `document-open-registry.ts`.
4
+ *
5
+ * It lives here, in the host's story estate (the registry, discovery, the
6
+ * declared medium, the arg descriptors, the three mount), and NOT in the
7
+ * documents, because the documents are a contribution: `@vgai/game` registers
8
+ * openers for these ids, the host asks for them, and neither side imports the
9
+ * other. A build that does not carry that package simply has no opener, which
10
+ * every call site already handles — `null` is the same answer an undeclared
11
+ * medium has always given.
12
+ *
13
+ * Three ids, because a story opens on three genuinely different surfaces and
14
+ * the CHOICE between them is made in three different places: by the story's
15
+ * declared medium (`story-opener.ts`'s `story` opener), by the owning component's
16
+ * surface (the Content grid), and by the caller asking for Docs explicitly.
17
+ */
18
+
19
+ /** A story rendered on the Object3D document surface — the turntable. */
20
+ export const THREE_STORY_DOCUMENT_OPENER = 'story:three';
21
+ /** A story rendered in its own isolated DOM/canvas preview root. */
22
+ export const ISOLATED_STORY_DOCUMENT_OPENER = 'story:isolated';
23
+ /** The Storybook Docs companion for one story. */
24
+ export const STORY_DOCS_DOCUMENT_OPENER = 'story:docs';
25
+
26
+ export interface StoryDocumentOpenRequest {
27
+ /** Project-relative CSF module path. */
28
+ readonly modulePath: string;
29
+ /** The story's authored export name. */
30
+ readonly storyName: string;
31
+ /** Tab title; the export name when absent. */
32
+ readonly title?: string;
33
+ /** Whether opening also FOCUSES the tab. A click-through opens and focuses;
34
+ * the Edit tab row offers a standing tab instead and passes `false`. */
35
+ readonly activate?: boolean;
36
+ }
@@ -0,0 +1,78 @@
1
+ /** Storybook/React-DOM primitives selected from the graph that owns a
2
+ * project's CSF modules — the DOM-mount sibling of
3
+ * `story-three-preview-runtime.ts`, same seam, same reason (see
4
+ * `vite-plugin-module-doorways.ts`'s doc comment for the dual-React failure
5
+ * this closes). */
6
+
7
+ import {
8
+ composeStories as staticComposeStories,
9
+ setProjectAnnotations as staticSetProjectAnnotations,
10
+ } from '@storybook/react';
11
+ // The doorway's ADDRESS is the host's own statement about what it serves, and
12
+ // it is spelled ONCE — in `@volter/editor-sdk/host`, the published door. It used
13
+ // to be read from the plugin that SERVES it through a `@editor/../` specifier
14
+ // that stepped out of the editor's `src/` into its build tier, which is a
15
+ // reach no package gets; the plugin now imports the same constant.
16
+ import { STORY_RUNTIME_PATH } from '@volter/editor-sdk/host';
17
+ import { flushSync as staticFlushSync } from 'react-dom';
18
+ import { createRoot as staticCreateRoot } from 'react-dom/client';
19
+ import { isPackagedRuntime } from '../packaged-runtime';
20
+
21
+ export interface StoryDomRuntime {
22
+ readonly packaged: boolean;
23
+ readonly composeStories: typeof staticComposeStories;
24
+ readonly setProjectAnnotations: typeof staticSetProjectAnnotations;
25
+ readonly createRoot: typeof staticCreateRoot;
26
+ readonly flushSync: typeof staticFlushSync;
27
+ }
28
+
29
+ const STATIC_RUNTIME: StoryDomRuntime = {
30
+ packaged: false,
31
+ composeStories: staticComposeStories,
32
+ setProjectAnnotations: staticSetProjectAnnotations,
33
+ createRoot: staticCreateRoot,
34
+ flushSync: staticFlushSync,
35
+ };
36
+
37
+ let cachedPackagedRuntime: Promise<StoryDomRuntime> | null = null;
38
+
39
+ async function loadPackagedRuntime(): Promise<StoryDomRuntime> {
40
+ let mod: Record<string, unknown>;
41
+ try {
42
+ mod = (await import(/* @vite-ignore */ STORY_RUNTIME_PATH)) as Record<string, unknown>;
43
+ } catch (err) {
44
+ // The one legitimate cause besides a server bug: the opened project has
45
+ // CSF files but no installed `@storybook/react` (the virtual module's
46
+ // re-export then fails to resolve). Name it — this error surfaces
47
+ // per-module through composeProjectStories/mountIsolatedStory callers.
48
+ throw new Error(
49
+ 'The story runtime failed to load from the project module graph — is `@storybook/react` ' +
50
+ `installed in the project? (${String(err instanceof Error ? err.message : err)})`,
51
+ );
52
+ }
53
+ for (const name of ['composeStories', 'setProjectAnnotations', 'createRoot', 'flushSync']) {
54
+ if (typeof mod[name] !== 'function') {
55
+ throw new Error(
56
+ `The packaged story runtime did not export ${name} as a function — see ` +
57
+ 'vite-plugin-module-doorways.ts.',
58
+ );
59
+ }
60
+ }
61
+ return {
62
+ packaged: true,
63
+ composeStories: mod['composeStories'] as typeof staticComposeStories,
64
+ setProjectAnnotations: mod['setProjectAnnotations'] as typeof staticSetProjectAnnotations,
65
+ createRoot: mod['createRoot'] as typeof staticCreateRoot,
66
+ flushSync: mod['flushSync'] as typeof staticFlushSync,
67
+ };
68
+ }
69
+
70
+ export async function resolveStoryDomRuntime(): Promise<StoryDomRuntime> {
71
+ if (!(await isPackagedRuntime())) return STATIC_RUNTIME;
72
+ if (!cachedPackagedRuntime) cachedPackagedRuntime = loadPackagedRuntime();
73
+ return cachedPackagedRuntime;
74
+ }
75
+
76
+ export function resetStoryDomRuntimeCacheForTest(): void {
77
+ cachedPackagedRuntime = null;
78
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Story grouping — the ONE optional grouping model for stories, shared by
3
+ * every story surface. The React design-time board and hierarchy both turn
4
+ * this path into Storybook's Category → Folder → Component → Story tree;
5
+ * later surfaces reuse it rather than deriving a second organization.
6
+ *
7
+ * It is PRESENTATION-ONLY. A group never affects story↔component
8
+ * association, default-story picking, mounting, or any other runtime
9
+ * meaning — it decides layout and labels and nothing else. Nothing here is
10
+ * a new authored vgai parameter either: the two inputs are facts the story
11
+ * already carries.
12
+ *
13
+ * The group path is Storybook's own convention, in Storybook's own order of
14
+ * precedence:
15
+ * 1. the CSF meta `title` when the module authored one (slash-separated),
16
+ * parsed by Storybook's exported `parseKind` rather than a local split
17
+ * so the separator semantics stay theirs;
18
+ * 2. otherwise DERIVED from the module's own project-relative path — the
19
+ * same thing Storybook does for an untitled CSF file (its automatic
20
+ * title comes from the file path) — relative to the project's `src/`
21
+ * and with the `*.stories.*` suffix stripped.
22
+ *
23
+ * `segments` is the category/folder ancestry (empty for an ungrouped story);
24
+ * `leaf` is the component name inside that ancestry.
25
+ */
26
+
27
+ import { parseKind } from 'storybook/internal/csf';
28
+ import { userOrAutoTitleFromSpecifier } from 'storybook/internal/preview-api';
29
+ import type { NormalizedStoriesSpecifier } from 'storybook/internal/types';
30
+
31
+ /** One story module's place in the grouping model. */
32
+ export interface StoryGroupPath {
33
+ /** Ancestor group segments. EMPTY means ungrouped — the flat case, which
34
+ * every surface must render exactly as it did before grouping existed. */
35
+ readonly segments: readonly string[];
36
+ /** The component/document name within {@link segments}. */
37
+ readonly leaf: string;
38
+ }
39
+
40
+ /** Only `.stories.ts(x)` files are discovered (`story-discovery.ts`); the
41
+ * `j` variants cost nothing and keep a JS project's derivation honest. */
42
+ const STORY_MODULE_SUFFIX = /\.stories\.[jt]sx?$/i;
43
+
44
+ /** A project's story modules live under its `src/`, so that prefix is the
45
+ * derivation's root — it is shared by every module and would only ever be a
46
+ * group everything belongs to. */
47
+ function titleSegments(title: string): string[] {
48
+ // Storybook's own parse. `rootSeparator`/`groupSeparator` are its documented
49
+ // defaults; `root` is simply the first segment for our purposes, since a
50
+ // group path here has no separate "root" concept.
51
+ const { root, groups } = parseKind(title, { rootSeparator: '|', groupSeparator: '/' });
52
+ return [...(root ? [root] : []), ...groups].map((part) => part.trim()).filter(Boolean);
53
+ }
54
+
55
+ function conventionalStorySpecifier(modulePath: string): NormalizedStoriesSpecifier {
56
+ const normalized = modulePath.replaceAll('\\', '/').replace(/^\.\//, '');
57
+ const nestedSource = normalized.lastIndexOf('/src/');
58
+ const directory = normalized.startsWith('src/')
59
+ ? 'src'
60
+ : nestedSource >= 0
61
+ ? normalized.slice(0, nestedSource + 4)
62
+ : normalized.slice(0, Math.max(0, normalized.lastIndexOf('/')));
63
+ return {
64
+ directory,
65
+ files: '**/*.stories.@(js|jsx|mjs|ts|tsx)',
66
+ titlePrefix: '',
67
+ importPathMatcher: STORY_MODULE_SUFFIX,
68
+ };
69
+ }
70
+
71
+ /**
72
+ * The group path of one composed story module: its authored CSF title when
73
+ * it has one, else its module path relative to the project `src/`.
74
+ */
75
+ export function deriveStoryGroupPath(input: {
76
+ modulePath: string;
77
+ title?: string | undefined;
78
+ }): StoryGroupPath {
79
+ const modulePath = input.modulePath.replaceAll('\\', '/').replace(/^\.\//, '');
80
+ const userTitle = input.title && titleSegments(input.title).length > 0 ? input.title : undefined;
81
+ const nativeTitle = userOrAutoTitleFromSpecifier(
82
+ modulePath,
83
+ conventionalStorySpecifier(modulePath),
84
+ userTitle,
85
+ );
86
+ // Storybook's auto-title only speaks for files its own specifier matches, so
87
+ // it returns nothing for a row that is not a discovered CSF module at all —
88
+ // the `2D` board's ghost slots, which name a COMPONENT that has no story yet
89
+ // (`canvas-board/canvas-board-model.ts`). An explicitly supplied title is the
90
+ // caller's own statement about where the row belongs and stands either way;
91
+ // without this, such a row falls back to its raw path and every ghost lands
92
+ // in a district of its own.
93
+ const parts = nativeTitle
94
+ ? titleSegments(nativeTitle)
95
+ : userTitle
96
+ ? titleSegments(userTitle)
97
+ : [modulePath];
98
+ return { segments: parts.slice(0, -1), leaf: parts.at(-1) ?? input.modulePath };
99
+ }
100
+
101
+ /** The clustering key of a group path — the ancestors alone, so every story
102
+ * of one group shares it. `''` is the ungrouped/flat case. */
103
+ export function storyGroupKey(group: StoryGroupPath): string {
104
+ return group.segments.join('/');
105
+ }
106
+
107
+ /** The full, human-facing group path (`UI/Button`) — what a surface labels a
108
+ * story document with. */
109
+ export function formatStoryGroupPath(group: StoryGroupPath): string {
110
+ return [...group.segments, group.leaf].join('/');
111
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * PORTABLE CSF's page-side lane, installed by the kit itself.
3
+ *
4
+ * WHAT IT INSTALLS, and which registry each piece reaches: the Content
5
+ * scope's story-backed entries (`content-entry-source-registry.ts`), the named
6
+ * states a component has (`component-states-registry.ts`), the addresses a
7
+ * story opens under (`document-open-registry.ts`, through `story-opener.ts`),
8
+ * the palette's one action per composed story (`chrome-registry.ts`), the
9
+ * `capture-story-variants` session verb (`command-registry.ts`) and the
10
+ * discovery lifecycle that finds a project's `*.stories.ts(x)` modules and
11
+ * re-composes them on project switches, CSF file add/remove events and content
12
+ * writes under `src/` (`project-story-discovery.ts`).
13
+ *
14
+ * WHY THE KIT AND NOT A PACKAGE. Portable CSF is the design-time state the
15
+ * three, DOM and canvas surfaces all read — a file three siblings import lives
16
+ * in none of them — so it is the kit's, not an integration's
17
+ * (ARCHITECTURE-CORE §The target shape, "`stories` is NOT React"). The kit's
18
+ * own CSF therefore needs no contribution to exist: these are direct
19
+ * registrations, at the registries a contribution would have reached.
20
+ *
21
+ * THE COST, stated rather than rounded away: `story-registry.ts` imports
22
+ * `storybook/internal/preview-api`, so the kit's boot closure carries
23
+ * Storybook's preview API and every product pays for it — the closure meter's
24
+ * bridge pin names the number.
25
+ *
26
+ * WHY EVERYTHING HERE IS EAGER. There is no lazy half to find: the content
27
+ * source, the states source and the opener each reach `story-registry.ts`
28
+ * directly, so deferring the discovery scan alone would move no file out of
29
+ * the closure and would only make the install order harder to read.
30
+ *
31
+ * WHAT IS NOT HERE, and why. `@volter/editor-project/adapter`'s `StoriesProvider` is the
32
+ * CONTRACT — an adapter says which named states a node has, in its own
33
+ * vocabulary, and answers `unavailable()` itself — so it and
34
+ * `components/InspectorStoriesSection.tsx` (the section that DRAWS a contract)
35
+ * stay where they are, with `components/inspector-stories-gating.ts` and
36
+ * `authoring/stories-scope.ts`. The `prefabsFromStories` finder is registered
37
+ * by `project-adapter.ts`, the one sanctioned importer of the engine's finder
38
+ * namespace.
39
+ */
40
+
41
+ import { registerContributedActions } from '../chrome-registry';
42
+ import { registerContributedCommands } from '../command-registry';
43
+ import { registerComponentStatesSource } from '../component-states-registry';
44
+ import { registerContentEntrySource } from '../content-entry-source-registry';
45
+ import { refreshProjectAdapter } from '../project-adapter';
46
+ import { storyComponentContentSource } from './component-content-source';
47
+ import { componentStatesSource } from './component-states-source';
48
+ import { startProjectStoryDiscovery } from './project-story-discovery';
49
+ import { storyPaletteActions } from './story-actions';
50
+ import { STORY_CAPTURE_COMMAND_SOURCE, storyCaptureCommands } from './story-capture-command';
51
+ import { registerStoryOpener } from './story-opener';
52
+ import { subscribeProjectStoryModules } from './story-registry';
53
+
54
+ /** Install the whole lane. Returns the teardown, in reverse order. */
55
+ export function installStoryLane(): () => void {
56
+ const stopSource = registerContentEntrySource(storyComponentContentSource);
57
+ // The SIBLING question: the content source says what a component LOOKS
58
+ // LIKE, this one what named STATES it has. Three authoring adapters used to
59
+ // construct the second answer inside their own constructors, which is why
60
+ // the story registry could not be reached through a seam at all.
61
+ const stopStates = registerComponentStatesSource(componentStatesSource);
62
+ const stopOpener = registerStoryOpener();
63
+ const stopActions = registerContributedActions(storyPaletteActions);
64
+ const stopCommands = registerContributedCommands(
65
+ STORY_CAPTURE_COMMAND_SOURCE,
66
+ storyCaptureCommands,
67
+ );
68
+ // The scan's own first step is to await the first authored viewport frame
69
+ // (`waitForFirstViewportFrame`, for the recorded reason that a cold GPU must
70
+ // not spend its first context on prefab thumbnails), so starting it at boot
71
+ // costs nothing before that frame.
72
+ const stopDiscovery = startProjectStoryDiscovery();
73
+ // A SETTLED LEDGER IS ANNOUNCED HERE. The document table holds prefab rows
74
+ // the `prefabsFromStories` finder produced, and the table re-resolves when
75
+ // the finder SET changes — not when one finder's own data does.
76
+ const stopTableRefresh = subscribeProjectStoryModules(() => {
77
+ void refreshProjectAdapter();
78
+ });
79
+ return () => {
80
+ stopTableRefresh();
81
+ stopDiscovery();
82
+ stopCommands();
83
+ stopActions();
84
+ stopOpener();
85
+ stopStates();
86
+ stopSource();
87
+ };
88
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * THE ONE process-wide story-mount turn queue, shared by every medium.
3
+ *
4
+ * Extracted verbatim from `story-three-preview.ts`'s own `storyMountTurn`
5
+ * (which owned it alone until the canvas surface got a preview mount too) for
6
+ * the reason that module already states: portable-story LOADERS are allowed to
7
+ * touch process-global state, so two mounts running at once interleave their
8
+ * setup and collide. That reason is not three-specific — a canvas story's
9
+ * loader initializes Pixi's global `Assets` cache and its component catalogue —
10
+ * and two queues would not serialize a three mount against a canvas mount at
11
+ * all, which is exactly the pair that now runs over the same project.
12
+ *
13
+ * Every caller takes a turn either for ONE mount or for a compound operation
14
+ * (a whole board build). A rejected turn never poisons its successor.
15
+ */
16
+
17
+ let storyMountTurn: Promise<unknown> = Promise.resolve();
18
+
19
+ /** Run one story-mount operation with no other mount interleaving it. */
20
+ export function runInStoryMountTurn<T>(task: () => Promise<T>): Promise<T> {
21
+ const turn = storyMountTurn.then(task, task);
22
+ storyMountTurn = turn.then(
23
+ () => undefined,
24
+ () => undefined,
25
+ );
26
+ return turn;
27
+ }