@volter/sdk 0.0.0-stage → 0.5.203

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 (523) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +20 -0
  3. package/README.md +38 -3
  4. package/package.json +510 -4
  5. package/src/account.ts +210 -0
  6. package/src/chrome.ts +88 -0
  7. package/src/client.ts +1646 -0
  8. package/src/commands.ts +66 -0
  9. package/src/contributions.ts +619 -0
  10. package/src/css-numeric-style.ts +97 -0
  11. package/src/document-probe.ts +282 -0
  12. package/src/editor-view.ts +225 -0
  13. package/src/extension.ts +40 -0
  14. package/src/generations.ts +178 -0
  15. package/src/host.ts +1157 -0
  16. package/src/http-transport.browser.ts +14 -0
  17. package/src/http-transport.node.ts +19 -0
  18. package/src/index.ts +131 -0
  19. package/src/kit/CapabilityCoverageSection.tsx +185 -0
  20. package/src/kit/account-client.ts +333 -0
  21. package/src/kit/action-registry.ts +317 -0
  22. package/src/kit/active-product.ts +76 -0
  23. package/src/kit/active-project.ts +155 -0
  24. package/src/kit/adapter-editor-config.ts +25 -0
  25. package/src/kit/adapter-module.ts +7 -0
  26. package/src/kit/adapter-observation.ts +49 -0
  27. package/src/kit/animation/animation-clock.ts +479 -0
  28. package/src/kit/animation/stage-transport.ts +385 -0
  29. package/src/kit/api/assets.ts +365 -0
  30. package/src/kit/api/project-open.ts +355 -0
  31. package/src/kit/api/project-source.ts +180 -0
  32. package/src/kit/api/project-state.ts +110 -0
  33. package/src/kit/api/relay.ts +270 -0
  34. package/src/kit/api/themes.ts +45 -0
  35. package/src/kit/api-asset-library-wire.ts +45 -0
  36. package/src/kit/api-base.ts +10 -0
  37. package/src/kit/api-build.ts +99 -0
  38. package/src/kit/api-git-wire.ts +56 -0
  39. package/src/kit/api-logs.ts +92 -0
  40. package/src/kit/api-project-identity.ts +74 -0
  41. package/src/kit/api-settings.ts +36 -0
  42. package/src/kit/api-worktrees.ts +205 -0
  43. package/src/kit/asset-capabilities.ts +344 -0
  44. package/src/kit/asset-compare-core.ts +171 -0
  45. package/src/kit/asset-editor-context.tsx +101 -0
  46. package/src/kit/asset-events.ts +96 -0
  47. package/src/kit/asset-inspector-actions.ts +87 -0
  48. package/src/kit/asset-selection-viewer-registry.ts +113 -0
  49. package/src/kit/asset-selection.ts +146 -0
  50. package/src/kit/asset-thumbnails.ts +25 -0
  51. package/src/kit/asset-viewers.ts +115 -0
  52. package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
  53. package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
  54. package/src/kit/asset-workflow/asset-ledger.ts +156 -0
  55. package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
  56. package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
  57. package/src/kit/asset-workflow/asset-types.ts +142 -0
  58. package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
  59. package/src/kit/asset-workflow/audio-waveform.ts +22 -0
  60. package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
  61. package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
  62. package/src/kit/asset-workflow/image-view-scale.ts +31 -0
  63. package/src/kit/asset-workflow/import-contract.ts +124 -0
  64. package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
  65. package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
  66. package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
  67. package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
  68. package/src/kit/asset-workflow/project-content.ts +288 -0
  69. package/src/kit/asset-workflow/project-source-index.ts +545 -0
  70. package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
  71. package/src/kit/authoring/active-adapter.ts +200 -0
  72. package/src/kit/authoring/active-systems.ts +422 -0
  73. package/src/kit/authoring/adapter-key.ts +18 -0
  74. package/src/kit/authoring/authoring-asset-url.ts +27 -0
  75. package/src/kit/authoring/bootstrap-state.ts +49 -0
  76. package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
  77. package/src/kit/authoring/canvas-scene-guides.ts +84 -0
  78. package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
  79. package/src/kit/authoring/consumer-actions.ts +531 -0
  80. package/src/kit/authoring/design-time-layers.ts +852 -0
  81. package/src/kit/authoring/design-time-mount-registry.ts +244 -0
  82. package/src/kit/authoring/edit-mode-authoring.ts +637 -0
  83. package/src/kit/authoring/empty-project-authoring.ts +22 -0
  84. package/src/kit/authoring/instance-source-menu.ts +135 -0
  85. package/src/kit/authoring/layered-pick.ts +185 -0
  86. package/src/kit/authoring/mounted-root-subjects.ts +146 -0
  87. package/src/kit/authoring/no-authoring-adapter.ts +59 -0
  88. package/src/kit/authoring/object3d-document-persistence.ts +122 -0
  89. package/src/kit/authoring/panel-authoring.ts +121 -0
  90. package/src/kit/authoring/project-authoring-session.ts +105 -0
  91. package/src/kit/authoring/provenance.ts +99 -0
  92. package/src/kit/authoring/react-canvas-navigation.ts +259 -0
  93. package/src/kit/authoring/react-design-canvas-style.ts +20 -0
  94. package/src/kit/authoring/react-story-board.ts +917 -0
  95. package/src/kit/authoring/selection-scope.ts +195 -0
  96. package/src/kit/authoring/shell-document-ops.ts +169 -0
  97. package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
  98. package/src/kit/authoring/story-board-presentation.ts +111 -0
  99. package/src/kit/authoring/three-root.ts +67 -0
  100. package/src/kit/authoring/viewport-tool-context.ts +73 -0
  101. package/src/kit/authoring/viewport-tool-owner.ts +38 -0
  102. package/src/kit/authoring/world-session-state.ts +101 -0
  103. package/src/kit/authoring-seam-evidence.ts +300 -0
  104. package/src/kit/availability-tick.ts +66 -0
  105. package/src/kit/bitmap-label.ts +120 -0
  106. package/src/kit/boot-routing.ts +392 -0
  107. package/src/kit/breakpoint-state.ts +43 -0
  108. package/src/kit/build-identity.ts +16 -0
  109. package/src/kit/bytes-codec.ts +62 -0
  110. package/src/kit/cancellation-reason.ts +58 -0
  111. package/src/kit/canvas-frames.ts +88 -0
  112. package/src/kit/capture-camera-pose.ts +77 -0
  113. package/src/kit/capture-size.ts +88 -0
  114. package/src/kit/chrome-registry.ts +159 -0
  115. package/src/kit/chrome-slot-registry.ts +91 -0
  116. package/src/kit/collaboration-client.ts +264 -0
  117. package/src/kit/collaboration-presence.ts +41 -0
  118. package/src/kit/command-dispatch.ts +19 -0
  119. package/src/kit/command-listener.ts +2182 -0
  120. package/src/kit/command-registry.ts +71 -0
  121. package/src/kit/component-board-registry.ts +205 -0
  122. package/src/kit/component-states-registry.ts +199 -0
  123. package/src/kit/components/AlignToolbar.tsx +204 -0
  124. package/src/kit/components/ApplicationMenus.tsx +372 -0
  125. package/src/kit/components/AssetEditorShell.tsx +216 -0
  126. package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
  127. package/src/kit/components/BoardRulers.tsx +354 -0
  128. package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
  129. package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
  130. package/src/kit/components/ChromeSlot.tsx +20 -0
  131. package/src/kit/components/CodeView.tsx +470 -0
  132. package/src/kit/components/CompactInspectorShell.tsx +39 -0
  133. package/src/kit/components/ConsolePanel.tsx +273 -0
  134. package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
  135. package/src/kit/components/InspectionProjection.tsx +932 -0
  136. package/src/kit/components/Inspector.tsx +270 -0
  137. package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
  138. package/src/kit/components/InspectorFieldsSection.tsx +290 -0
  139. package/src/kit/components/InspectorStoriesSection.tsx +92 -0
  140. package/src/kit/components/InspectorToolSection.tsx +96 -0
  141. package/src/kit/components/InspectorTransformSection.tsx +245 -0
  142. package/src/kit/components/LightExplorerPanel.tsx +433 -0
  143. package/src/kit/components/MediaProperties.tsx +145 -0
  144. package/src/kit/components/ProjectHeader.tsx +328 -0
  145. package/src/kit/components/ReactCanvasControls.tsx +358 -0
  146. package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
  147. package/src/kit/components/RootTextEditor.tsx +79 -0
  148. package/src/kit/components/SaveStatus.tsx +70 -0
  149. package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
  150. package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
  151. package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
  152. package/src/kit/components/ToolHost.tsx +380 -0
  153. package/src/kit/components/Toolbar.tsx +811 -0
  154. package/src/kit/components/TransientHint.tsx +44 -0
  155. package/src/kit/components/VersionControlSection.tsx +470 -0
  156. package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
  157. package/src/kit/components/VolterLogo.tsx +18 -0
  158. package/src/kit/components/WorktreeSwitcher.tsx +712 -0
  159. package/src/kit/components/account-documents.tsx +1162 -0
  160. package/src/kit/components/asset-documents.tsx +794 -0
  161. package/src/kit/components/asset-editor-persistence.ts +216 -0
  162. package/src/kit/components/asset-selection-section.tsx +545 -0
  163. package/src/kit/components/asset-thumbnails.tsx +307 -0
  164. package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
  165. package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  166. package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
  167. package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
  168. package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
  169. package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
  170. package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  171. package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
  172. package/src/kit/components/asset-viewers/shader-source.ts +144 -0
  173. package/src/kit/components/board-guides.ts +150 -0
  174. package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
  175. package/src/kit/components/canvas-temporary-pivot.ts +34 -0
  176. package/src/kit/components/core-utilities.tsx +94 -0
  177. package/src/kit/components/inspector-preview-section.tsx +223 -0
  178. package/src/kit/components/inspector-revert-label.ts +20 -0
  179. package/src/kit/components/inspector-selection.ts +42 -0
  180. package/src/kit/components/inspector-stories-gating.ts +171 -0
  181. package/src/kit/components/inspector-transform-subject.ts +11 -0
  182. package/src/kit/components/inspector-transform.ts +88 -0
  183. package/src/kit/components/kind-documents.tsx +544 -0
  184. package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
  185. package/src/kit/components/project-tool-documents.tsx +402 -0
  186. package/src/kit/components/scene-documents.tsx +221 -0
  187. package/src/kit/components/status-contributions.tsx +407 -0
  188. package/src/kit/components/tool-documents.tsx +302 -0
  189. package/src/kit/components/tool-schema-form.tsx +262 -0
  190. package/src/kit/components/use-after-paint.ts +41 -0
  191. package/src/kit/components/use-project-image-assets.ts +86 -0
  192. package/src/kit/components/workspace-history.ts +32 -0
  193. package/src/kit/components/world-documents.tsx +570 -0
  194. package/src/kit/components/world-overlay-gestures.ts +1939 -0
  195. package/src/kit/composite-screenshot.ts +2238 -0
  196. package/src/kit/content-entry-source-registry.ts +184 -0
  197. package/src/kit/contribution-surfaces.ts +48 -0
  198. package/src/kit/coverage/canvas-reveal.ts +192 -0
  199. package/src/kit/coverage/design-time-surfaces.ts +101 -0
  200. package/src/kit/coverage/ontology-invariants.ts +466 -0
  201. package/src/kit/coverage/session-vitals.ts +503 -0
  202. package/src/kit/crash-null-boundary.ts +36 -0
  203. package/src/kit/creation-site-edit.ts +1491 -0
  204. package/src/kit/creation-site-registry.ts +160 -0
  205. package/src/kit/delegate-harness-registry.ts +134 -0
  206. package/src/kit/document-areas.ts +70 -0
  207. package/src/kit/document-context-registry.ts +193 -0
  208. package/src/kit/document-open-registry.ts +200 -0
  209. package/src/kit/document-play-extension.ts +221 -0
  210. package/src/kit/document-preview-source.ts +20 -0
  211. package/src/kit/document-renderer-session.ts +138 -0
  212. package/src/kit/document-stage-sessions.ts +26 -0
  213. package/src/kit/document-viewports.ts +120 -0
  214. package/src/kit/editor-api.ts +46 -0
  215. package/src/kit/editor-chrome-capture.ts +136 -0
  216. package/src/kit/editor-commands.ts +176 -0
  217. package/src/kit/editor-console.ts +580 -0
  218. package/src/kit/editor-current-view.ts +56 -0
  219. package/src/kit/editor-document-probe.ts +1166 -0
  220. package/src/kit/editor-git-client.ts +115 -0
  221. package/src/kit/editor-hotkeys.ts +728 -0
  222. package/src/kit/editor-lease-view.ts +39 -0
  223. package/src/kit/editor-lease.ts +415 -0
  224. package/src/kit/editor-mode.ts +19 -0
  225. package/src/kit/editor-notifications.ts +140 -0
  226. package/src/kit/editor-presence.ts +563 -0
  227. package/src/kit/editor-presentation-activity.ts +58 -0
  228. package/src/kit/editor-presentation-notice.ts +42 -0
  229. package/src/kit/editor-runtime.tsx +147 -0
  230. package/src/kit/editor-server-response.ts +86 -0
  231. package/src/kit/editor-session-attribution.ts +85 -0
  232. package/src/kit/editor-session-mode.ts +54 -0
  233. package/src/kit/editor-state-facets.ts +74 -0
  234. package/src/kit/editor-view-presentation.ts +777 -0
  235. package/src/kit/environment-images.ts +58 -0
  236. package/src/kit/eyedropper-session.ts +60 -0
  237. package/src/kit/files/file-provider.ts +62 -0
  238. package/src/kit/files/project-files.ts +270 -0
  239. package/src/kit/finders/index.ts +137 -0
  240. package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
  241. package/src/kit/frame/frame-parts.ts +30 -0
  242. package/src/kit/framed-document-capture.ts +34 -0
  243. package/src/kit/game-globals-prelude.ts +143 -0
  244. package/src/kit/game-surface-defaults.ts +33 -0
  245. package/src/kit/gameplay-dom-recording.ts +318 -0
  246. package/src/kit/gameplay-export-state.ts +14 -0
  247. package/src/kit/gameplay-replay.ts +417 -0
  248. package/src/kit/gameplay-session-time.ts +9 -0
  249. package/src/kit/gameplay-sessions.ts +204 -0
  250. package/src/kit/hierarchy-component-marks.ts +298 -0
  251. package/src/kit/hierarchy-internals.ts +197 -0
  252. package/src/kit/hierarchy-kind-icon.ts +217 -0
  253. package/src/kit/hierarchy-menu-registry.ts +67 -0
  254. package/src/kit/hierarchy-node-rows.ts +307 -0
  255. package/src/kit/hierarchy-panel-view.ts +280 -0
  256. package/src/kit/hierarchy-projection.ts +76 -0
  257. package/src/kit/hierarchy-row-media.ts +45 -0
  258. package/src/kit/hierarchy-row-model.ts +308 -0
  259. package/src/kit/hierarchy-rows.ts +11 -0
  260. package/src/kit/hierarchy-walk.ts +86 -0
  261. package/src/kit/history/editor-session.ts +25 -0
  262. package/src/kit/history/history-commands.ts +147 -0
  263. package/src/kit/history/history-delegate.ts +187 -0
  264. package/src/kit/history/history-limit-notices.ts +43 -0
  265. package/src/kit/history/history-service.ts +1189 -0
  266. package/src/kit/history/persistence-coordinator.ts +35 -0
  267. package/src/kit/history/project-file-history.ts +386 -0
  268. package/src/kit/history/project-root-history-backends.ts +139 -0
  269. package/src/kit/history/resource-registry.ts +209 -0
  270. package/src/kit/history/snapshot-store.ts +103 -0
  271. package/src/kit/history/source-history-backend.ts +546 -0
  272. package/src/kit/history-types.ts +124 -0
  273. package/src/kit/hmr-registration-group.ts +67 -0
  274. package/src/kit/hmr-stable-react-context.ts +23 -0
  275. package/src/kit/hotkeys.ts +190 -0
  276. package/src/kit/inference-diagnostics.ts +69 -0
  277. package/src/kit/initial-project.ts +80 -0
  278. package/src/kit/inspection/active-subject.ts +571 -0
  279. package/src/kit/inspection/active-surface.ts +142 -0
  280. package/src/kit/inspection/compose-subject.ts +1055 -0
  281. package/src/kit/inspection/compose.ts +7 -0
  282. package/src/kit/inspection/display.ts +171 -0
  283. package/src/kit/inspection/document-subject.ts +109 -0
  284. package/src/kit/inspection/game-subject.ts +85 -0
  285. package/src/kit/inspection/null-subject.ts +119 -0
  286. package/src/kit/inspection/serialize.ts +357 -0
  287. package/src/kit/inspection/use-active-inspection.ts +180 -0
  288. package/src/kit/inspection-model.ts +542 -0
  289. package/src/kit/inspection-node-media.ts +58 -0
  290. package/src/kit/inspector-presentation.ts +203 -0
  291. package/src/kit/inspector-property-grouping.ts +64 -0
  292. package/src/kit/inspector-section-registry.ts +221 -0
  293. package/src/kit/instance-source-actions.ts +163 -0
  294. package/src/kit/js-heap.ts +71 -0
  295. package/src/kit/key-actions.ts +91 -0
  296. package/src/kit/keymap-presets.ts +428 -0
  297. package/src/kit/layout-policy.ts +31 -0
  298. package/src/kit/light-explorer-model.ts +134 -0
  299. package/src/kit/live-canvas-frame.ts +55 -0
  300. package/src/kit/live-document.ts +296 -0
  301. package/src/kit/live-gesture-lock.ts +50 -0
  302. package/src/kit/live-seam-evidence.ts +11 -0
  303. package/src/kit/live-session-registry.ts +220 -0
  304. package/src/kit/live-transition.ts +391 -0
  305. package/src/kit/manifest-project.ts +107 -0
  306. package/src/kit/module-fetch-diagnosis.ts +192 -0
  307. package/src/kit/mount-failure-report.ts +154 -0
  308. package/src/kit/native-selection-style.ts +497 -0
  309. package/src/kit/object3d-document-write-policy.ts +137 -0
  310. package/src/kit/packaged-runtime.ts +108 -0
  311. package/src/kit/palettes/maya.palette.json +57 -0
  312. package/src/kit/palettes/substance.palette.json +57 -0
  313. package/src/kit/performance-profiler.ts +367 -0
  314. package/src/kit/performance-sources.ts +69 -0
  315. package/src/kit/photograph-notice.ts +141 -0
  316. package/src/kit/play-boot-phase.ts +166 -0
  317. package/src/kit/play-camera-flight.ts +35 -0
  318. package/src/kit/png-encode.worker.ts +26 -0
  319. package/src/kit/presentation-surface.ts +248 -0
  320. package/src/kit/product-command.ts +90 -0
  321. package/src/kit/project-adapter.ts +1140 -0
  322. package/src/kit/project-asset-refresh.ts +23 -0
  323. package/src/kit/project-asset-roots.ts +68 -0
  324. package/src/kit/project-local-state.ts +151 -0
  325. package/src/kit/project-manager.ts +243 -0
  326. package/src/kit/project-module-changes.ts +201 -0
  327. package/src/kit/project-module-split.ts +270 -0
  328. package/src/kit/project-play-layers.ts +25 -0
  329. package/src/kit/project-provenance.ts +115 -0
  330. package/src/kit/project-ready.ts +42 -0
  331. package/src/kit/project-shape.ts +68 -0
  332. package/src/kit/project-tools.ts +107 -0
  333. package/src/kit/projection-types.ts +44 -0
  334. package/src/kit/readiness.ts +113 -0
  335. package/src/kit/renderer-resource-counts.ts +27 -0
  336. package/src/kit/reported-play-state.ts +90 -0
  337. package/src/kit/resolve-contributed-command.ts +14 -0
  338. package/src/kit/resolve-relative-specifier.ts +33 -0
  339. package/src/kit/retained-document-states.ts +91 -0
  340. package/src/kit/scene-document-plan.ts +320 -0
  341. package/src/kit/scene-live-open.ts +210 -0
  342. package/src/kit/scoped-game-css.ts +152 -0
  343. package/src/kit/served-url.ts +5 -0
  344. package/src/kit/session-close.ts +17 -0
  345. package/src/kit/session-tombstone.ts +127 -0
  346. package/src/kit/settings/settings-provider.ts +82 -0
  347. package/src/kit/settings-store.ts +348 -0
  348. package/src/kit/shell-document-state.ts +27 -0
  349. package/src/kit/shell-store-door.ts +45 -0
  350. package/src/kit/shell-store.ts +722 -0
  351. package/src/kit/source-conflict.ts +122 -0
  352. package/src/kit/stage-context.ts +377 -0
  353. package/src/kit/stage-invalidation.ts +25 -0
  354. package/src/kit/stage-store-registry.ts +69 -0
  355. package/src/kit/startup-failure.ts +80 -0
  356. package/src/kit/state-report-deferral.ts +73 -0
  357. package/src/kit/storage/host-files-storage.ts +97 -0
  358. package/src/kit/storage/http-storage.ts +174 -0
  359. package/src/kit/storage/index.ts +75 -0
  360. package/src/kit/storage/mem-storage.ts +158 -0
  361. package/src/kit/storage/path-lock.ts +44 -0
  362. package/src/kit/storage/paths.ts +26 -0
  363. package/src/kit/storage-types.ts +127 -0
  364. package/src/kit/stories/StoryPreviewMount.tsx +306 -0
  365. package/src/kit/stories/compose-project-stories.ts +255 -0
  366. package/src/kit/stories/prefabs-finder.ts +54 -0
  367. package/src/kit/stories/prefabs-from-stories.ts +182 -0
  368. package/src/kit/stories/project-story-regions.ts +24 -0
  369. package/src/kit/stories/story-capture.ts +579 -0
  370. package/src/kit/stories/story-declared-medium.ts +126 -0
  371. package/src/kit/stories/story-discovery.ts +176 -0
  372. package/src/kit/stories/story-dom-runtime.ts +78 -0
  373. package/src/kit/stories/story-grouping.ts +111 -0
  374. package/src/kit/stories/story-mount-turn.ts +27 -0
  375. package/src/kit/stories/story-presentation.ts +215 -0
  376. package/src/kit/stories/story-preview-component.ts +7 -0
  377. package/src/kit/stories/story-registry.ts +530 -0
  378. package/src/kit/stories-scope.ts +35 -0
  379. package/src/kit/story-document-openers.ts +36 -0
  380. package/src/kit/story-thumbnails.ts +47 -0
  381. package/src/kit/surface-keyboard.ts +101 -0
  382. package/src/kit/surface-state.ts +135 -0
  383. package/src/kit/system-seam-evidence.ts +72 -0
  384. package/src/kit/tab-census.ts +202 -0
  385. package/src/kit/tab-lifecycle-client.ts +227 -0
  386. package/src/kit/theme-library.ts +897 -0
  387. package/src/kit/theme-preference.ts +429 -0
  388. package/src/kit/three-viewport-presentation.ts +23 -0
  389. package/src/kit/tool-contribution-play.ts +74 -0
  390. package/src/kit/tool-loader.ts +1918 -0
  391. package/src/kit/transform-mode-request.ts +66 -0
  392. package/src/kit/transient-hint.ts +78 -0
  393. package/src/kit/transport-strip.tsx +174 -0
  394. package/src/kit/ui-source/adapter-region-includes.ts +238 -0
  395. package/src/kit/ui-source/file-region-resolver.ts +302 -0
  396. package/src/kit/ui-source/inspect.ts +775 -0
  397. package/src/kit/ui-source/source-write-backend.ts +605 -0
  398. package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
  399. package/src/kit/user-local-state.ts +105 -0
  400. package/src/kit/viewport-activation-timings.ts +840 -0
  401. package/src/kit/viewport-editor-controls.ts +22 -0
  402. package/src/kit/viewport-presentation.ts +668 -0
  403. package/src/kit/viewport-surface-status.tsx +55 -0
  404. package/src/kit/wait-until.ts +37 -0
  405. package/src/kit/worker-call-metrics.ts +166 -0
  406. package/src/kit/workspace-areas.ts +191 -0
  407. package/src/kit/workspace-aux-commands.ts +11 -0
  408. package/src/kit/workspace-available-documents.ts +142 -0
  409. package/src/kit/workspace-core-utilities.ts +31 -0
  410. package/src/kit/workspace-document-ids.ts +59 -0
  411. package/src/kit/workspace-document-registry.ts +624 -0
  412. package/src/kit/workspace-document-restore.ts +146 -0
  413. package/src/kit/workspace-host-commands.ts +141 -0
  414. package/src/kit/workspace-persistence-gate.ts +40 -0
  415. package/src/kit/workspace-play-utilities.ts +44 -0
  416. package/src/kit/workspace-presets.ts +446 -0
  417. package/src/kit/workspace-regions.ts +276 -0
  418. package/src/kit/workspace-static-panels.ts +73 -0
  419. package/src/kit/workspace-status-registry.ts +121 -0
  420. package/src/kit/workspace-storage.ts +35 -0
  421. package/src/kit/workspace-style.ts +226 -0
  422. package/src/kit/workspace-utility-commands.ts +74 -0
  423. package/src/kit/workspace-utility-registry.ts +263 -0
  424. package/src/kit/world-adoption-event.ts +23 -0
  425. package/src/kit/world-adoption.ts +115 -0
  426. package/src/kit/world-canvas-viewport-state.ts +35 -0
  427. package/src/kit/world-document-routing.ts +104 -0
  428. package/src/kit/world-pan-state.ts +198 -0
  429. package/src/kit/write-pipe.ts +173 -0
  430. package/src/layout-arrangements.ts +5 -0
  431. package/src/layouts.tsx +108 -0
  432. package/src/looks.ts +16 -0
  433. package/src/project/output-roots.ts +73 -0
  434. package/src/project/tab-census.ts +155 -0
  435. package/src/project-tool-catalog.ts +104 -0
  436. package/src/selection.tsx +107 -0
  437. package/src/services.ts +18 -0
  438. package/src/session/build-report.ts +22 -0
  439. package/src/session/collaboration-types.ts +262 -0
  440. package/src/session/command-table.ts +327 -0
  441. package/src/session/discovery.ts +100 -0
  442. package/src/session/editor-brand.ts +48 -0
  443. package/src/session/editor-compatibility.ts +317 -0
  444. package/src/session/editor-control-lifecycle.ts +68 -0
  445. package/src/session/editor-control-protocol.ts +5 -0
  446. package/src/session/entrypoint-selection-readers.ts +66 -0
  447. package/src/session/entrypoint-selection-source.ts +120 -0
  448. package/src/session/game-css-scope.ts +30 -0
  449. package/src/session/hosted-attachment.ts +225 -0
  450. package/src/session/limited-view.ts +82 -0
  451. package/src/session/product-create.ts +24 -0
  452. package/src/session/product-locator.ts +478 -0
  453. package/src/session/project-module-url.ts +242 -0
  454. package/src/session/project-serving.ts +164 -0
  455. package/src/session/project-upgrade.ts +403 -0
  456. package/src/session/registry-format.ts +210 -0
  457. package/src/session/relative-path-guard.ts +56 -0
  458. package/src/session/scoped-game-css.ts +461 -0
  459. package/src/session/source-glob.ts +15 -0
  460. package/src/session/tool-contribution-convention.ts +123 -0
  461. package/src/session/workbench-locator.ts +712 -0
  462. package/src/session.ts +41 -0
  463. package/src/share.ts +160 -0
  464. package/src/source-analysis.ts +28 -0
  465. package/src/source-authoring.ts +439 -0
  466. package/src/tools/errors.ts +91 -0
  467. package/src/tools/provider-execution.ts +70 -0
  468. package/src/tools/registry.ts +341 -0
  469. package/src/tools/types.ts +159 -0
  470. package/src/transport.ts +100 -0
  471. package/src/types.ts +1693 -0
  472. package/src/views.ts +164 -0
  473. package/src/widgets/design-system.ts +93 -0
  474. package/src/widgets/editor-appearance.ts +151 -0
  475. package/src/widgets/editor-material.ts +83 -0
  476. package/src/widgets/icon-set-registry.ts +105 -0
  477. package/src/widgets/index.ts +71 -0
  478. package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
  479. package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
  480. package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
  481. package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
  482. package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
  483. package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
  484. package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
  485. package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
  486. package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
  487. package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
  488. package/src/widgets/inspector-widgets/color-utils.ts +201 -0
  489. package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
  490. package/src/widgets/inspector-widgets/index.ts +25 -0
  491. package/src/widgets/inspector-widgets/shared.tsx +140 -0
  492. package/src/widgets/interactive-edit-scope.ts +33 -0
  493. package/src/widgets/patterns/Dialog.tsx +140 -0
  494. package/src/widgets/patterns/Fields.tsx +44 -0
  495. package/src/widgets/patterns/List.tsx +25 -0
  496. package/src/widgets/patterns/StateSurface.tsx +40 -0
  497. package/src/widgets/patterns/Surfaces.tsx +122 -0
  498. package/src/widgets/patterns/Tabs.tsx +80 -0
  499. package/src/widgets/patterns/Toolbar.tsx +72 -0
  500. package/src/widgets/patterns/Tree.tsx +72 -0
  501. package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
  502. package/src/widgets/primitives/Button.tsx +62 -0
  503. package/src/widgets/primitives/ColorInput.tsx +78 -0
  504. package/src/widgets/primitives/DraftTextInput.tsx +63 -0
  505. package/src/widgets/primitives/EditorIcon.tsx +157 -0
  506. package/src/widgets/primitives/FormControls.tsx +88 -0
  507. package/src/widgets/primitives/HoverPreview.tsx +96 -0
  508. package/src/widgets/primitives/JsonInput.tsx +113 -0
  509. package/src/widgets/primitives/Layout.tsx +100 -0
  510. package/src/widgets/primitives/Menu.tsx +161 -0
  511. package/src/widgets/primitives/NumberInput.tsx +169 -0
  512. package/src/widgets/primitives/Panel.tsx +80 -0
  513. package/src/widgets/primitives/SectionHeader.tsx +77 -0
  514. package/src/widgets/primitives/Text.tsx +54 -0
  515. package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
  516. package/src/widgets/primitives/Tooltip.tsx +204 -0
  517. package/src/widgets/primitives/Vec3Input.tsx +70 -0
  518. package/src/widgets/primitives/banner-tones.ts +32 -0
  519. package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
  520. package/src/widgets/primitives/editor-icons.ts +254 -0
  521. package/src/widgets/primitives/panel-header-styles.ts +42 -0
  522. package/src/widgets/theme.ts +2841 -0
  523. package/src/widgets/z-index.ts +25 -0
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Manifest-backed project detection for the play path — T3.3 slice 2 part C.
3
+ *
4
+ * The dev server serves the project's RAW `volter.project.json` at `/volter.project.json`
5
+ * (editor-server.ts's project-file-serving middleware, mirroring how it
6
+ * with no view synthesis — the browser parses it itself through the PURE half
7
+ * of the manifest loader (`loadGameManifest`,
8
+ * `@volter/project/manifest/load`), never `load-file.ts` (that needs `node:fs`, which
9
+ * has no place in a browser bundle).
10
+ */
11
+
12
+ import { MANIFEST_FILENAME } from '@volter/project/manifest/filename';
13
+ import { loadGameManifest, type ResolvedGameManifest } from '@volter/project/manifest/load';
14
+ import { servedUrl } from '@volter/sdk/kit/served-url';
15
+
16
+ /**
17
+ * "This project has no manifest" — a DIFFERENT answer from "this project's
18
+ * manifest could not be read", and the reason {@link fetchGameManifest} needs
19
+ * two rejections rather than one.
20
+ *
21
+ * A caller that cannot tell them apart has only one safe move: swallow both.
22
+ * `ingest/mount-ingest-root.ts`'s three manifest routes did exactly that
23
+ * (`.catch(() => null)` each), so a project declaring a perfectly good
24
+ * `{ ingest }` root in a manifest the strict loader REJECTED — one
25
+ * unrecognized key is enough, the schema is `.strict()` — was declined by
26
+ * every route and mounted NOTHING, with not one line anywhere saying why.
27
+ *
28
+ * Recognized by `name`, not `instanceof`: this classification must survive a
29
+ * caller holding a different module instance of this file, and a wrong answer
30
+ * there is a silent mount, not a loud one.
31
+ */
32
+ export const MANIFEST_ABSENT_ERROR_NAME = 'ManifestAbsentError';
33
+
34
+ /** True for the rejection {@link fetchGameManifest} uses to say "no manifest
35
+ * here" — see {@link MANIFEST_ABSENT_ERROR_NAME}. */
36
+ export function isManifestAbsence(error: unknown): boolean {
37
+ return error instanceof Error && error.name === MANIFEST_ABSENT_ERROR_NAME;
38
+ }
39
+
40
+ function manifestAbsent(where: string): Error {
41
+ const error = new Error(`${where} declares no ${MANIFEST_FILENAME}`);
42
+ error.name = MANIFEST_ABSENT_ERROR_NAME;
43
+ return error;
44
+ }
45
+
46
+ /**
47
+ * Fetch + parse the current project's sole v2 config from the session that
48
+ * serves it. Both failures are loud; ABSENCE is the one that is also
49
+ * classifiable ({@link isManifestAbsence}).
50
+ */
51
+ export async function fetchGameManifest(): Promise<ResolvedGameManifest> {
52
+ const url = servedUrl('/volter.project.json');
53
+ const res = await fetch(url);
54
+ if (res.status === 404) throw manifestAbsent(url);
55
+ if (!res.ok) throw new Error(`Failed to load ${url}: ${res.status} ${res.statusText}`);
56
+ // A 404 is not the only way this route says "no manifest": a dev server with
57
+ // an SPA fallback answers an unknown path with index.html and a 200, which
58
+ // `res.json()` reports as `Unexpected token '<'` — an unreadable manifest,
59
+ // when the truth is that there is none. `fetchRawGameManifest` below has
60
+ // made the same distinction the same way since it was written.
61
+ const body = await res.text();
62
+ if (/^\s*</.test(body)) throw manifestAbsent(url);
63
+ try {
64
+ return loadGameManifest(JSON.parse(body), { configurationKinds: 'defer' });
65
+ } catch (error) {
66
+ throw new Error(
67
+ `Failed to load ${url}: ${error instanceof Error ? error.message : String(error)}`,
68
+ );
69
+ }
70
+ }
71
+
72
+ /**
73
+ * A1 (edit mode, defect 2): fetch the RAW, UN-validated `volter.project.json` JSON
74
+ * — or `null` when the project genuinely has none (the route 404s). Unlike
75
+ * {@link fetchGameManifest}, this NEVER throws on a schema violation: edit mode
76
+ * must tolerate a manifest with ONE bad world (e.g. an unknown `kind`) by
77
+ * surfacing that world as an error node (#18) while the VALID roots declared
78
+ * alongside it still open — strict `loadGameManifest` would reject the whole
79
+ * file and make every declared world vanish. The caller (`edit-mode-authoring
80
+ * .ts`) reads `roots[]` leniently; a genuinely absent manifest (this returns
81
+ * `null`) is the only case that synthesizes a single-world game.
82
+ */
83
+ export async function fetchRawGameManifest(): Promise<unknown | null> {
84
+ const url = servedUrl('/volter.project.json');
85
+ const res = await fetch(url);
86
+ if (!res.ok) return null;
87
+ // A 404 is not the only way this route says "no manifest". A dev server with
88
+ // an SPA fallback answers an unknown path with index.html and a **200**, so
89
+ // `res.ok` passes and `res.json()` throws `Unexpected token '<', "<!DOCTYPE
90
+ // "... is not valid JSON` — from a function whose whole contract is to return
91
+ // `null` when there is no manifest. That throw escapes into callers that
92
+ // only ever guarded against `null`: it aborted `tryManifestIngestRoute2D`
93
+ // before it could look at the roots at all, so a perfectly well-formed
94
+ // `{ ingest }` world silently fell through to the default-pixi path and
95
+ // failed to mount, reporting the JSON error as the mount's cause with no
96
+ // hint of which fetch produced it.
97
+ const body = await res.text();
98
+ if (/^\s*</.test(body)) return null; // HTML fallback === no manifest here
99
+ try {
100
+ return JSON.parse(body) as unknown;
101
+ } catch (error) {
102
+ // A genuinely malformed manifest is NOT absence — say so, and say where.
103
+ throw new Error(
104
+ `${url} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,
105
+ );
106
+ }
107
+ }
@@ -0,0 +1,192 @@
1
+ /**
2
+ * WHICH MODULE A FAILED DYNAMIC IMPORT COULD NOT LOAD. The browser reports any
3
+ * failure anywhere in an imported module's graph as the top module alone
4
+ * ("Failed to fetch dynamically imported module: <entry>"), so a world whose
5
+ * entry serves fine but whose graph holds one refused file reads as a broken
6
+ * entry. This walks the entry's STATIC import graph with the page's own `fetch`
7
+ * and names the first module that does not answer 200 with a script type.
8
+ *
9
+ * When every file answers, the failure is the loader's memory: a module that
10
+ * failed once stays failed for the document, whatever the network says now. The
11
+ * walk then imports the graph in dependency order (a module only after all it
12
+ * imports) and stops at the first refusal, which is therefore the module that
13
+ * failed itself rather than one that inherited a dependency's failure; that
14
+ * module's own network attempts are reported with their bytes over the wire (0
15
+ * means the browser answered from its cache without asking). The probe only runs
16
+ * after a failure and imports only the static graph the failed import was
17
+ * already evaluating; `import()` edges are not followed.
18
+ *
19
+ * Walks running together share one request per URL and at most
20
+ * {@link MAX_DIAGNOSES} run at once, so a shared dependency failing under many
21
+ * stories costs one walk's requests. Nothing is kept once the walks finish: a
22
+ * later failure of the same entry is walked afresh.
23
+ */
24
+
25
+ const FAILED_IMPORT = [
26
+ /Failed to fetch dynamically imported module: (\S+)/, // Chromium
27
+ /error loading dynamically imported module: (\S+)/, // Firefox
28
+ ];
29
+ /** Static edges only: `import … from`, `import "…"`, `export … from`. */
30
+ const SPECIFIER =
31
+ /(?:\bimport\s*(?:[\w*{}\s,$]+\s*from\s*)?|\bexport\s*[\w*{}\s,$]+\s*from\s*)["']((?:\/|\.\.?\/)[^"']+)["']/g;
32
+ const LIMIT = 400;
33
+ const MAX_DIAGNOSES = 5;
34
+
35
+ // The browser keeps 250 resource timings by default and a project boot issues more requests than
36
+ // that, so the first attempt at a module (the one the loader remembers) would already be dropped
37
+ // by the time a failure asks for it.
38
+ if (typeof performance !== 'undefined' && typeof performance.setResourceTimingBufferSize === 'function') {
39
+ performance.setResourceTimingBufferSize(5_000);
40
+ }
41
+
42
+ export interface ModuleFetchDiagnosis {
43
+ readonly entry: string;
44
+ readonly fetched: number;
45
+ /** The first module that did not load, or `null` when every one loads now. */
46
+ readonly failed: {
47
+ readonly url: string;
48
+ /** The network's answer; `null` when the network answered and the loader refused. */
49
+ readonly status: number | null;
50
+ readonly detail: string;
51
+ } | null;
52
+ }
53
+
54
+ /** The entry named by a failed dynamic import's message, or `null` for any other error. */
55
+ export function failedImportEntry(message: string): string | null {
56
+ for (const pattern of FAILED_IMPORT) {
57
+ const entry = pattern.exec(message)?.[1];
58
+ if (entry) return entry;
59
+ }
60
+ return null;
61
+ }
62
+
63
+ interface FetchedModule {
64
+ readonly status: number;
65
+ readonly type: string;
66
+ readonly imports: readonly string[];
67
+ }
68
+
69
+ /** Requests shared by the walks in flight; cleared when the last one settles. */
70
+ const fetchedModules = new Map<string, Promise<FetchedModule>>();
71
+ /** The walks in flight, by entry. */
72
+ const diagnoses = new Map<string, Promise<ModuleFetchDiagnosis>>();
73
+
74
+ function fetchModule(url: string): Promise<FetchedModule> {
75
+ let pending = fetchedModules.get(url);
76
+ if (!pending) {
77
+ pending = (async () => {
78
+ const response = await fetch(url, { cache: 'no-store' });
79
+ const type = response.headers.get('content-type') ?? '';
80
+ if (!response.ok || !/javascript|ecmascript/.test(type)) return { status: response.status, type, imports: [] };
81
+ const body = await response.text();
82
+ const imports = new Set<string>();
83
+ for (const match of body.matchAll(SPECIFIER)) {
84
+ const specifier = match[1]!;
85
+ // A served import carries an extension, a query or Vite's `/@` prefix (`/@id/…` virtual
86
+ // modules); a bare relative name is text in a string or comment, not an edge.
87
+ if (!/\.[a-z]+(?:[?#]|$)|\?|^\/@/i.test(specifier)) continue;
88
+ imports.add(new URL(specifier, url).href);
89
+ }
90
+ return { status: response.status, type, imports: [...imports] };
91
+ })();
92
+ fetchedModules.set(url, pending);
93
+ }
94
+ return pending;
95
+ }
96
+
97
+ /** Diagnose a failed import of `entry`; never rejects. */
98
+ export function diagnoseModuleFetch(entry: string): Promise<ModuleFetchDiagnosis> {
99
+ const existing = diagnoses.get(entry);
100
+ if (existing) return existing;
101
+ if (diagnoses.size >= MAX_DIAGNOSES) {
102
+ return Promise.resolve({
103
+ entry,
104
+ fetched: 0,
105
+ failed: { url: entry, status: null, detail: `not walked: ${MAX_DIAGNOSES} other failed imports are being walked` },
106
+ });
107
+ }
108
+ const pending = walk(entry)
109
+ .catch(
110
+ (err): ModuleFetchDiagnosis => ({
111
+ entry,
112
+ fetched: 0,
113
+ failed: { url: entry, status: null, detail: `walk failed: ${String(err)}` },
114
+ }),
115
+ )
116
+ .finally(() => {
117
+ diagnoses.delete(entry);
118
+ if (diagnoses.size === 0) fetchedModules.clear();
119
+ });
120
+ diagnoses.set(entry, pending);
121
+ return pending;
122
+ }
123
+
124
+ async function walk(entry: string): Promise<ModuleFetchDiagnosis> {
125
+ const root = new URL(entry, location.href).href;
126
+ const edges = new Map<string, readonly string[]>();
127
+ const queue = [root];
128
+ while (queue.length > 0 && edges.size < LIMIT) {
129
+ const url = queue.shift()!;
130
+ if (edges.has(url)) continue;
131
+ let fetched: FetchedModule;
132
+ try {
133
+ fetched = await fetchModule(url);
134
+ } catch (err) {
135
+ return { entry, fetched: edges.size + 1, failed: { url, status: 0, detail: String(err) } };
136
+ }
137
+ if (fetched.status !== 200 || !/javascript|ecmascript/.test(fetched.type)) {
138
+ return {
139
+ entry,
140
+ fetched: edges.size + 1,
141
+ failed: { url, status: fetched.status, detail: fetched.type || '(no content type)' },
142
+ };
143
+ }
144
+ edges.set(url, fetched.imports);
145
+ for (const next of fetched.imports) if (!edges.has(next)) queue.push(next);
146
+ }
147
+
148
+ // Dependency order: a module after everything it imports (post-order from the entry).
149
+ const order: string[] = [];
150
+ const visited = new Set<string>();
151
+ const visit = (url: string): void => {
152
+ if (visited.has(url) || !edges.has(url)) return;
153
+ visited.add(url);
154
+ for (const next of edges.get(url)!) visit(next);
155
+ order.push(url);
156
+ };
157
+ visit(root);
158
+
159
+ for (const url of order) {
160
+ try {
161
+ await import(/* @vite-ignore */ url);
162
+ } catch (err) {
163
+ const attempts = performance
164
+ .getEntriesByType('resource')
165
+ .filter((timing): timing is PerformanceResourceTiming => timing.name === url)
166
+ .map(
167
+ (timing) =>
168
+ `${'responseStatus' in timing ? timing.responseStatus : '?'} ` +
169
+ `(${timing.transferSize}B over the wire, ${timing.initiatorType}) at ${Math.round(timing.startTime)}ms`,
170
+ );
171
+ return {
172
+ entry,
173
+ fetched: edges.size,
174
+ failed: {
175
+ url,
176
+ status: null,
177
+ detail:
178
+ `every module it imports loads and the network serves it, but the loader refused it (${String(err)}); ` +
179
+ `its attempts on this page: ${attempts.join(' | ') || 'none kept'}`,
180
+ },
181
+ };
182
+ }
183
+ }
184
+ return { entry, fetched: edges.size, failed: null };
185
+ }
186
+
187
+ export function describeModuleFetch(diagnosis: ModuleFetchDiagnosis): string {
188
+ const { failed } = diagnosis;
189
+ if (!failed) return `all ${diagnosis.fetched} modules from ${diagnosis.entry} fetch and import from the page now`;
190
+ const answer = failed.status === null ? '' : ` answered ${failed.status}`;
191
+ return `module ${failed.url}${answer}: ${failed.detail} (walking ${diagnosis.fetched} modules from ${diagnosis.entry})`;
192
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Mount-failure report — D-W3: every manifest world's auto-launch route
3
+ * degrades to exactly one `editorConsole.error` line today (§0.4 — ground
4
+ * truth: the default Untitled scene is already showing by the time a manifest
5
+ * route fails, so a broken world mounts to what LOOKS like a normal empty
6
+ * project). This module is the structured half of the fix: a global mount-
7
+ * failure slot every manifest-route catch block populates.
8
+ *
9
+ * WHERE IT SHOWS — there is ONE error home, the editor's bottom surface, and
10
+ * this slot rides it rather than owning a surface of its own:
11
+ *
12
+ * 1. the `editorConsole.error` line each route already writes (the full
13
+ * trace lives there, and the status bar's `console-counts` counts it);
14
+ * 2. the status bar's `mount-failure` contribution
15
+ * (`../components/status-contributions.tsx`) — a sticky, danger-toned
16
+ * "N worlds failed to mount" item that names each world in its title and
17
+ * opens the Console on click. Sticky is the point: a dead world stays
18
+ * dead until it is fixed, so unlike a transient hint this item persists
19
+ * until the slot clears;
20
+ * 3. the Console utility is REVEALED on the empty→failing edge
21
+ * (`../workspace-utility-commands.ts`'s auto-open policy, the same one a
22
+ * failed build uses) — that reveal is what makes a mount failure loud
23
+ * without a second surface, and it is why the Console not being the
24
+ * default bottom tab is no longer an argument for one.
25
+ *
26
+ * A separate top-of-shell banner used to render this slot. It was a SECOND
27
+ * error home — users had to learn two places to look — and it is gone.
28
+ *
29
+ * D-V5 (composite): a composite manifest (one ingest world + siblings,
30
+ * `ingest-siblings.ts`) can fail SEVERAL roots independently in one mount
31
+ * attempt (a `default-three` sibling, a throwing `default-react` sibling, …)
32
+ * — a single-slot "last failure wins" model would silently drop every failure
33
+ * but the latest, the exact F9 anti-pattern this module exists to close. The
34
+ * slot is an ORDERED LIST: `addMountFailureReport` (deduped by `worldId` — a
35
+ * re-attempt for the SAME world replaces that world's entry in place, keeping
36
+ * list order stable), `getMountFailureReports()`,
37
+ * `clearMountFailureReports()`.
38
+ *
39
+ * The slot owns its own `subscribe` (same shape as
40
+ * `../asset-workflow/asset-materialization-report.ts`) rather than
41
+ * piggybacking on `EditorShellStore.subscribe`: the readers are no longer
42
+ * mounted inside a store-subscribed panel, and the per-world clears
43
+ * (`clearMountFailureReport`) run from root-level lifecycles that do not all
44
+ * broadcast a store notification. `getMountFailureReports()` returns a frozen
45
+ * snapshot whose identity changes only when the list does, so it is a valid
46
+ * `useSyncExternalStore` getSnapshot.
47
+ */
48
+
49
+ /** One manifest world's mount failure — the exact fields the status item shows. */
50
+ export interface MountFailureReport {
51
+ /** The failing world's manifest id (`ResolvedAdapterRoot.id`), or the
52
+ * vendored/fixture route's discovered game/folder id. */
53
+ readonly worldId: string;
54
+ /** The world's render substrate kind (`ResolvedAdapterRoot.kind`, e.g.
55
+ * `'three'`/`'canvas'`/`'react'`) — or, for the URL-fallback route
56
+ * (which has no `ResolvedAdapterRoot` to read a kind from), the same
57
+ * vocabulary inferred from which fixture glob resolved the id. */
58
+ readonly kind: string;
59
+ /** The resolved adapter identity (`ResolvedAdapter['identity']` — e.g.
60
+ * `'ingest-three'`/`'ingest-pixi'`/`'ingest-react'`/`'module'`). */
61
+ readonly identity: string;
62
+ /** The caught error's message — never the raw `Error` object (never
63
+ * fabricated; empty only if the thrown value truly stringifies empty). */
64
+ readonly message: string;
65
+ }
66
+
67
+ /** D-V5: an ORDERED list now backs the slot (insertion order — the order
68
+ * roots actually failed in, which for a composite's sibling loop is
69
+ * manifest order). Every accessor below is a thin view over this same
70
+ * array — never a second, parallel source of truth. Replaced wholesale
71
+ * rather than mutated so the snapshot identity is a real change signal. */
72
+ let _reports: readonly MountFailureReport[] = [];
73
+ const _listeners = new Set<() => void>();
74
+
75
+ function notify(): void {
76
+ for (const listener of _listeners) listener();
77
+ }
78
+
79
+ /** `useSyncExternalStore`-compatible subscribe for the status contribution
80
+ * and the Console auto-open policy. */
81
+ export function subscribeToMountFailures(callback: () => void): () => void {
82
+ _listeners.add(callback);
83
+ return () => {
84
+ _listeners.delete(callback);
85
+ };
86
+ }
87
+
88
+ /**
89
+ * D-V5: append one world's failure, deduped by `worldId` — a re-attempt for
90
+ * a world that already has an entry REPLACES it in place (keeps list order
91
+ * stable: retrying world B in `[A, B]` yields `[A, B']`, never `[A, B]` moved
92
+ * to the end).
93
+ */
94
+ export function addMountFailureReport(report: MountFailureReport): void {
95
+ const index = _reports.findIndex((r) => r.worldId === report.worldId);
96
+ if (index === -1) {
97
+ _reports = [..._reports, report];
98
+ } else {
99
+ const next = [..._reports];
100
+ next[index] = report;
101
+ _reports = next;
102
+ }
103
+ notify();
104
+ }
105
+
106
+ /** D-V5: every mount failure from the current attempt, oldest first. */
107
+ export function getMountFailureReports(): readonly MountFailureReport[] {
108
+ return _reports;
109
+ }
110
+
111
+ /** Drop every recorded failure — what a successful mount (or a torn-down
112
+ * session, which has nothing left to report) calls. */
113
+ export function clearMountFailureReports(): void {
114
+ if (_reports.length === 0) return;
115
+ _reports = [];
116
+ notify();
117
+ }
118
+
119
+ /**
120
+ * PD-1: drop ONE world's recorded failure — what a route that mounts a single
121
+ * world calls after that world mounts successfully.
122
+ *
123
+ * `clearMountFailureReports()` above is the whole-attempt reset an ingest/
124
+ * module route can afford because it owns the entire mount. The R3F design
125
+ * session and the design-time layer loop do NOT: they mount roots
126
+ * independently, so a blanket clear on one root's success would erase a
127
+ * SIBLING root's still-true failure — the exact D-V5 drop the ordered list
128
+ * exists to prevent. Keyed by the same `worldId` `addMountFailureReport`
129
+ * dedupes on, and a no-op when that world has no entry.
130
+ *
131
+ * Not clearing at all is what PD-1 measured: an R3F world that failed to mount
132
+ * once kept reporting that failure through the editor's `status` command's "MOUNT FAILED —
133
+ * THIS WORLD IS NOT RUNNING" line (and the in-editor surface) for the rest of
134
+ * the page's life, including while the very same world was mounted and
135
+ * PLAYING. A diagnostic that cannot go back to healthy is worse than none.
136
+ */
137
+ export function clearMountFailureReport(worldId: string): void {
138
+ const index = _reports.findIndex((r) => r.worldId === worldId);
139
+ if (index === -1) return;
140
+ _reports = _reports.filter((_, i) => i !== index);
141
+ notify();
142
+ }
143
+
144
+ /**
145
+ * Build a `MountFailureReport['message']` from a caught value the same way
146
+ * every route's existing `editorConsole.error` line already stringifies it
147
+ * (`` `...failed: ${err}` `` — kept byte-for-byte at each call site so the
148
+ * console's full trace is unchanged) — an `Error`'s own `.message` reads
149
+ * better in a one-line summary than its `String(err)` form (`"Error: <msg>"`),
150
+ * so the report uses this instead of the console's template-literal form.
151
+ */
152
+ export function formatMountFailureMessage(err: unknown): string {
153
+ return err instanceof Error ? err.message : String(err);
154
+ }