@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,550 @@
1
+ /**
2
+ * THE PROJECT'S SOURCE INDEX — what React/R3F components a project's own TSX
3
+ * declares, and which REGION each file belongs to.
4
+ *
5
+ * Split out of `project-content.ts` (2026-09-18, WORK.md §The open-source
6
+ * launch phase 1 unit 9) for the reason `canvas-board-actions.ts` already
7
+ * states about itself: keeping a subject separate from the estate it reads
8
+ * means opening the editor does not initialize that estate to answer a
9
+ * different question. The Content browser panel imports its SIBLING half for
10
+ * five presentation helpers, and that one import carried this half's
11
+ * TypeScript-AST work — `ui-source/oid-transform.ts` (1,811 lines), the five
12
+ * R3F prop-contract bindings, `ui-source/ts-ast.ts` and
13
+ * `ui-source/adapter-region-includes.ts`, EIGHT files — into every editor boot,
14
+ * a `models` build that indexes no R3F source included.
15
+ *
16
+ * Nothing in the eager shell calls anything here. Every caller is either a
17
+ * SCAN (`server/project-components.ts`, `server/routes/project-source.ts`,
18
+ * `api/assets.ts` and `browser-transpile.ts`, the last two already through
19
+ * `await import()`) or a story module reached after a project opens. The two
20
+ * halves still share the `ProjectComponentEntry` shape, which is a TYPE and
21
+ * costs no closure.
22
+ */
23
+
24
+ import ts from 'typescript';
25
+ import { MANIFEST_FILENAME } from '@volter/editor-project/manifest/filename';
26
+ import { resolveRelativeSpecifier } from '../resolve-relative-specifier';
27
+ import type { StorageBackend } from '../storage/types';
28
+ import {
29
+ ADAPTER_MODULE_FILENAME,
30
+ parseAdapterRegionIncludes,
31
+ } from '../ui-source/adapter-region-includes';
32
+ import type { ImportersOf, RegionBinding, RegionSurface } from '../ui-source/file-region-resolver';
33
+ import { resolveFileRegion } from '../ui-source/file-region-resolver';
34
+ import {
35
+ analyzeR3fComponentContracts,
36
+ builtinR3fContractsForSource,
37
+ } from '../ui-source/oid-transform';
38
+ import type { ProjectComponentEntry } from './project-content';
39
+
40
+ const PROJECT_SOURCE_EXTENSIONS = /\.(?:[cm]?[jt]sx)$/i;
41
+ const SKIPPED_SOURCE_DIRECTORIES = new Set([
42
+ 'node_modules',
43
+ 'dist',
44
+ 'build',
45
+ '.git',
46
+ '.vgai',
47
+ 'tools',
48
+ ]);
49
+
50
+ function hasModifier(statement: ts.Statement, kind: ts.SyntaxKind): boolean {
51
+ return Boolean(
52
+ ts.canHaveModifiers(statement) &&
53
+ ts.getModifiers(statement)?.some((modifier) => modifier.kind === kind),
54
+ );
55
+ }
56
+
57
+ function declarationBindings(statement: ts.Statement): string[] {
58
+ if (ts.isFunctionDeclaration(statement) && statement.name) return [statement.name.text];
59
+ if (!ts.isVariableStatement(statement)) return [];
60
+ return statement.declarationList.declarations.flatMap((declaration) =>
61
+ ts.isIdentifier(declaration.name) ? [declaration.name.text] : [],
62
+ );
63
+ }
64
+
65
+ function exportClauseBindings(statement: ts.Statement): string[] {
66
+ if (ts.isExportAssignment(statement) && ts.isIdentifier(statement.expression)) {
67
+ return [statement.expression.text];
68
+ }
69
+ if (!ts.isExportDeclaration(statement) || !statement.exportClause) return [];
70
+ if (!ts.isNamedExports(statement.exportClause)) return [];
71
+ return statement.exportClause.elements.map(
72
+ (element) => (element.propertyName ?? element.name).text,
73
+ );
74
+ }
75
+
76
+ function exportedBindings(sourceFile: ts.SourceFile): Set<string> {
77
+ return new Set(
78
+ sourceFile.statements.flatMap((statement) => [
79
+ ...exportClauseBindings(statement),
80
+ ...(hasModifier(statement, ts.SyntaxKind.ExportKeyword) ||
81
+ hasModifier(statement, ts.SyntaxKind.DefaultKeyword)
82
+ ? declarationBindings(statement)
83
+ : []),
84
+ ]),
85
+ );
86
+ }
87
+
88
+ function defaultExportBindings(sourceFile: ts.SourceFile): Set<string> {
89
+ return new Set(
90
+ sourceFile.statements.flatMap((statement) =>
91
+ hasModifier(statement, ts.SyntaxKind.DefaultKeyword)
92
+ ? declarationBindings(statement)
93
+ : ts.isExportAssignment(statement) && ts.isIdentifier(statement.expression)
94
+ ? [statement.expression.text]
95
+ : [],
96
+ ),
97
+ );
98
+ }
99
+
100
+ interface ComponentSourceInfo {
101
+ line: number;
102
+ body: ts.ConciseBody;
103
+ }
104
+
105
+ function componentSourceInfo(sourceFile: ts.SourceFile): Map<string, ComponentSourceInfo> {
106
+ const result = new Map<string, ComponentSourceInfo>();
107
+ for (const statement of sourceFile.statements) {
108
+ if (ts.isFunctionDeclaration(statement) && statement.name && statement.body) {
109
+ result.set(statement.name.text, {
110
+ line:
111
+ sourceFile.getLineAndCharacterOfPosition(statement.name.getStart(sourceFile)).line + 1,
112
+ body: statement.body,
113
+ });
114
+ continue;
115
+ }
116
+ if (!ts.isVariableStatement(statement)) continue;
117
+ for (const declaration of statement.declarationList.declarations) {
118
+ if (
119
+ !ts.isIdentifier(declaration.name) ||
120
+ !declaration.initializer ||
121
+ (!ts.isArrowFunction(declaration.initializer) &&
122
+ !ts.isFunctionExpression(declaration.initializer))
123
+ ) {
124
+ continue;
125
+ }
126
+ result.set(declaration.name.text, {
127
+ line:
128
+ sourceFile.getLineAndCharacterOfPosition(declaration.name.getStart(sourceFile)).line + 1,
129
+ body: declaration.initializer.body,
130
+ });
131
+ }
132
+ }
133
+ return result;
134
+ }
135
+
136
+ function isInsideCollection(node: ts.Node): boolean {
137
+ let current: ts.Node | undefined = node.parent;
138
+ while (current && !ts.isStatement(current)) {
139
+ if (
140
+ ts.isCallExpression(current) &&
141
+ ts.isPropertyAccessExpression(current.expression) &&
142
+ (current.expression.name.text === 'map' || current.expression.name.text === 'flatMap')
143
+ ) {
144
+ return true;
145
+ }
146
+ current = current.parent;
147
+ }
148
+ return false;
149
+ }
150
+
151
+ function componentSourceUses(
152
+ sourceFile: ts.SourceFile,
153
+ ): Map<string, { count: number; collection: boolean }> {
154
+ const result = new Map<string, { count: number; collection: boolean }>();
155
+ const visit = (node: ts.Node): void => {
156
+ if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) {
157
+ const name = node.tagName.getText();
158
+ if (/^[A-Z][A-Za-z0-9_$]*$/.test(name)) {
159
+ const previous = result.get(name) ?? { count: 0, collection: false };
160
+ result.set(name, {
161
+ count: previous.count + 1,
162
+ collection: previous.collection || isInsideCollection(node),
163
+ });
164
+ }
165
+ }
166
+ ts.forEachChild(node, visit);
167
+ };
168
+ visit(sourceFile);
169
+ return result;
170
+ }
171
+
172
+ /** Discover top-level visual React/R3F component definitions in one module.
173
+ * This is a source index, not prefab inference: Content joins these definitions
174
+ * to portable CSF and admits only components a story explicitly declares.
175
+ *
176
+ * `surface` is the file's REGION, resolved by the one shared resolver
177
+ * (`../ui-source/file-region-resolver.ts`) from the project's declarations and
178
+ * import reach — see {@link projectFileSurfaces}. It is a parameter and not
179
+ * something derived here, because a single file cannot see what reaches it: the
180
+ * `@react-three/fiber` / `@pixi/react` / DOM-tag scans that used to decide it
181
+ * grouped Content by whichever library a file happened to name, so a project
182
+ * that centralized its imports had its components filed under `unknown`.
183
+ * `'unknown'` now means exactly one thing — the resolver could not place this
184
+ * file — which is a real state Content can show rather than a guess it made. */
185
+ export function discoverComponentsInSource(
186
+ source: string,
187
+ path: string,
188
+ surface: RegionSurface | 'unknown' = 'unknown',
189
+ ): ProjectComponentEntry[] {
190
+ const sourceFile = ts.createSourceFile(
191
+ path,
192
+ source,
193
+ ts.ScriptTarget.Latest,
194
+ true,
195
+ ts.ScriptKind.TSX,
196
+ );
197
+ const exported = exportedBindings(sourceFile);
198
+ const defaultExports = defaultExportBindings(sourceFile);
199
+ const contracts = [
200
+ ...analyzeR3fComponentContracts(source, path, builtinR3fContractsForSource(source, path)),
201
+ ];
202
+ const sourceInfo = componentSourceInfo(sourceFile);
203
+ const sourceUses = componentSourceUses(sourceFile);
204
+ return contracts
205
+ .filter(([name]) => sourceInfo.has(name))
206
+ .map(([name, contract]) => {
207
+ return {
208
+ name,
209
+ path,
210
+ line: sourceInfo.get(name)!.line,
211
+ exported: exported.has(name),
212
+ defaultExport: defaultExports.has(name),
213
+ declaredInRootEntry: false,
214
+ sourceUseCount: sourceUses.get(name)?.count ?? 0,
215
+ sourceCollectionUse: sourceUses.get(name)?.collection ?? false,
216
+ surface,
217
+ contentKind: contract.rootTag?.toLowerCase() === 'svg' ? 'image' : 'component',
218
+ contract,
219
+ };
220
+ });
221
+ }
222
+
223
+ /** One indexed source file, project-relative path plus its bytes. */
224
+ export interface IndexedProjectSource {
225
+ readonly path: string;
226
+ readonly source: string;
227
+ }
228
+
229
+ /** A project's regions in the resolver's vocabulary, plus each one's entry. */
230
+ export interface ProjectRegionEntry extends RegionBinding {
231
+ /** Project-relative entry path, or `undefined` for an entry-less root. */
232
+ readonly entry?: string;
233
+ }
234
+
235
+ /** Resolve a relative import specifier against the indexed file set. Extension
236
+ * and index resolution is a filesystem question and the resolver is pure, so
237
+ * it is answered here from a REAL index rather than by guessing an extension
238
+ * onto a path — the same shape `project-adapter.ts`'s `makeResolveModule` uses. */
239
+ function resolveRelativeImport(
240
+ specifier: string,
241
+ fromPath: string,
242
+ paths: ReadonlySet<string>,
243
+ ): string | undefined {
244
+ return resolveRelativeSpecifier(specifier, fromPath, paths) ?? undefined;
245
+ }
246
+
247
+ /** Every project-local module `source` imports or re-exports from. */
248
+ function importedPaths(source: string, path: string, paths: ReadonlySet<string>): string[] {
249
+ const file = ts.createSourceFile(path, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
250
+ const out: string[] = [];
251
+ for (const statement of file.statements) {
252
+ const specifier =
253
+ (ts.isImportDeclaration(statement) || ts.isExportDeclaration(statement)) &&
254
+ statement.moduleSpecifier &&
255
+ ts.isStringLiteralLike(statement.moduleSpecifier)
256
+ ? statement.moduleSpecifier.text
257
+ : undefined;
258
+ if (specifier === undefined) continue;
259
+ const resolved = resolveRelativeImport(specifier, path, paths);
260
+ if (resolved !== undefined) out.push(resolved);
261
+ }
262
+ return out;
263
+ }
264
+
265
+ /**
266
+ * The one region answer for every indexed file, through the shared resolver.
267
+ *
268
+ * Content has no live Vite module graph, so it builds the same seam from the
269
+ * sources it already read: the import edges are INVERTED into an `ImportersOf`
270
+ * and handed to `resolveFileRegion`, which then applies exactly the precedence
271
+ * every other site gets — a region's declared `include` glob, then a root
272
+ * entry, then reach. A file no region reaches stays `'unknown'`, which Content
273
+ * shows as its own state.
274
+ */
275
+ export function projectFileSurfaces(
276
+ files: readonly IndexedProjectSource[],
277
+ regions: readonly ProjectRegionEntry[],
278
+ ): Map<string, RegionSurface> {
279
+ const paths = new Set(files.map((file) => file.path));
280
+ const importers = new Map<string, Set<string>>();
281
+ for (const file of files) {
282
+ for (const imported of importedPaths(file.source, file.path, paths)) {
283
+ const bucket = importers.get(imported);
284
+ if (bucket) bucket.add(file.path);
285
+ else importers.set(imported, new Set([file.path]));
286
+ }
287
+ }
288
+ const importersOf: ImportersOf = (id) => importers.get(id);
289
+ const byEntry = new Map<string, RegionBinding>();
290
+ for (const region of regions) {
291
+ if (region.entry !== undefined) byEntry.set(region.entry.replace(/^\.\//, ''), region);
292
+ }
293
+ const surfaces = new Map<string, RegionSurface>();
294
+ for (const file of files) {
295
+ const answer = resolveFileRegion({
296
+ file: file.path,
297
+ projectRelative: file.path,
298
+ regions,
299
+ regionOfEntry: (candidate) => byEntry.get(candidate),
300
+ importersOf,
301
+ });
302
+ if (answer.surface !== undefined) surfaces.set(file.path, answer.surface);
303
+ }
304
+ return surfaces;
305
+ }
306
+
307
+ /** A root's `adapter` field reduced to a surface — the bare-string shorthand or
308
+ * the `{ module | ingest, surface }` object forms. Never throws on a malformed
309
+ * shape; the manifest loader is the validation authority. */
310
+ function rootSurface(adapter: unknown): RegionSurface | undefined {
311
+ const value =
312
+ typeof adapter === 'string' ? adapter : (adapter as { surface?: unknown } | null)?.surface;
313
+ return value === 'three' || value === 'canvas' || value === 'dom' ? value : undefined;
314
+ }
315
+
316
+ /**
317
+ * A project's regions, PLUS what reading them lost.
318
+ *
319
+ * `unreadable` is carried rather than dropped because dropping it is the exact
320
+ * failure this whole rung retired: an adapter whose `regions` binding this
321
+ * reader cannot evaluate statically still has its `include` globs honored by
322
+ * the real loader (`project-adapter.ts`, which evaluates the module), so a
323
+ * silent "read fine" here would mean the two readers disagree with nobody told.
324
+ * Every caller reports it in whatever channel it owns.
325
+ *
326
+ * It is the REASON SENTENCE, not a bare flag, because the causes are genuinely
327
+ * different — an unreadable `regions` binding, an unreadable manifest, a failed
328
+ * read of either — and the warning that reaches a terminal has to name the one
329
+ * that happened rather than the one that is most common.
330
+ */
331
+ export interface ProjectRegions {
332
+ readonly regions: readonly ProjectRegionEntry[];
333
+ /** `null` when nothing was lost; otherwise what was, in one sentence. */
334
+ readonly unreadable: string | null;
335
+ }
336
+
337
+ /** What an unreadable `regions` binding costs, and how to write one that reads. */
338
+ const UNREADABLE_ADAPTER_REGIONS =
339
+ `${ADAPTER_MODULE_FILENAME} declares a \`regions\` binding that cannot be read statically, so ` +
340
+ 'any `include` globs in it were NOT consulted when grouping this project’s components — files ' +
341
+ 'those globs claim will show their reach-derived surface, or `unknown`. Write the regions as an ' +
342
+ 'array of object literals passed directly to defineAdapter({…}), with literal `id` and ' +
343
+ '`include` values.';
344
+
345
+ /** One sentence for a read that threw, naming the file and the failure. */
346
+ function readFailure(filename: string, error: unknown): string {
347
+ const detail = error instanceof Error ? error.message : String(error);
348
+ return (
349
+ `${filename} could not be read (${detail}), so this project's regions were resolved without ` +
350
+ 'it. This is NOT the absent-file case — an absent file is a declaration, a failed read is a ' +
351
+ 'gap — and the surfaces below may disagree with what the real loader computes.'
352
+ );
353
+ }
354
+
355
+ /**
356
+ * The project's regions as the resolver reads them: the manifest's roots joined
357
+ * to whatever `include` globs its `vgai.adapter.ts` declares for them.
358
+ *
359
+ * ABSENT AND UNREADABLE ARE DIFFERENT ANSWERS, and only the reader knows which
360
+ * one its backend just gave — Node rejects ENOENT, a `StorageBackend` rejects
361
+ * for a missing path too, and neither rejection distinguishes itself from a
362
+ * permissions error or a corrupt handle. So the callbacks say it in the return
363
+ * type: resolve `null` for "this file is not there" (a missing adapter is the
364
+ * DECLARED native default — pure reach — exactly as an absent
365
+ * `vgai.adapter.ts` means `nativeAdapter()`), and REJECT for a read that
366
+ * failed. A rejection used to be swallowed into the same empty string as an
367
+ * absent file, which reported the loss as a declaration.
368
+ */
369
+ export async function projectRegionEntries(
370
+ readManifest: () => Promise<string | null>,
371
+ readAdapter: () => Promise<string | null>,
372
+ ): Promise<ProjectRegions> {
373
+ let manifest: string | null;
374
+ try {
375
+ manifest = await readManifest();
376
+ } catch (error) {
377
+ return { regions: [], unreadable: readFailure(MANIFEST_FILENAME, error) };
378
+ }
379
+ if (manifest === null) {
380
+ return {
381
+ regions: [],
382
+ unreadable: `${MANIFEST_FILENAME} is absent, so this project declares no regions at all and every file falls to its reach-derived surface, or \`unknown\`.`,
383
+ };
384
+ }
385
+ let adapter: string | null;
386
+ try {
387
+ adapter = await readAdapter();
388
+ } catch (error) {
389
+ // The manifest still yields the roots; only the `include` globs are lost.
390
+ return {
391
+ regions: projectRegionEntriesFromSources(manifest, '').regions,
392
+ unreadable: readFailure(ADAPTER_MODULE_FILENAME, error),
393
+ };
394
+ }
395
+ return projectRegionEntriesFromSources(manifest, adapter ?? '');
396
+ }
397
+
398
+ /**
399
+ * The SYNCHRONOUS half of {@link projectRegionEntries}, for readers that
400
+ * already hold both files' bytes — the project-side `check-idioms` scanner is
401
+ * one, and its R3F floor rule needs the region answer or it silently analyzes
402
+ * nothing. One implementation, two entry shapes; never two parsers.
403
+ */
404
+ export function projectRegionEntriesFromSources(
405
+ manifestSource: string,
406
+ adapterSource: string,
407
+ ): ProjectRegions {
408
+ let roots: Array<{ id?: unknown; entry?: unknown; adapter?: unknown }> = [];
409
+ try {
410
+ roots = (JSON.parse(manifestSource) as { roots?: typeof roots }).roots ?? [];
411
+ } catch (error) {
412
+ // A manifest whose bytes are here but do not parse is a LOSS, not a project
413
+ // that declares no regions — the loader reads the same file through the real
414
+ // schema and gets roots this index will not have.
415
+ return { regions: [], unreadable: readFailure(MANIFEST_FILENAME, error) };
416
+ }
417
+ const declared = parseAdapterRegionIncludes(adapterSource);
418
+ const includes = declared.byRegionId;
419
+ const regions = roots.flatMap((root) => {
420
+ const id = typeof root.id === 'string' ? root.id : undefined;
421
+ const surface = rootSurface(root.adapter);
422
+ if (id === undefined || surface === undefined) return [];
423
+ const include = includes.get(id);
424
+ const mounts = declared.mountsByRegionId.get(id);
425
+ return [
426
+ {
427
+ id,
428
+ surface,
429
+ ...(typeof root.entry === 'string' ? { entry: root.entry } : {}),
430
+ ...(include ? { include } : {}),
431
+ ...(mounts?.length ? { mounts } : {}),
432
+ },
433
+ ];
434
+ });
435
+ return { regions, unreadable: declared.unreadable ? UNREADABLE_ADAPTER_REGIONS : null };
436
+ }
437
+
438
+ /**
439
+ * Say out loud what reading this project's regions lost, so the `include` globs
440
+ * the real loader WILL honor are not silently missing from this index.
441
+ *
442
+ * `console.warn` on purpose: it is the same instrument `reportOidSurfaceDiagnostics`
443
+ * already uses for the OID lane's own version of this message, so the dev
444
+ * server's terminal and the hosted editor's console both get it without a
445
+ * second channel. Warn-once per project AND reason — a component index rebuilds
446
+ * on every project change, so a per-rebuild repeat is noise, but a DIFFERENT
447
+ * loss on the same project is news and must not be swallowed by the first one.
448
+ */
449
+ const reportedUnreadableRegions = new Set<string>();
450
+ export function reportUnreadableRegions(projectLabel: string, reason: string): void {
451
+ const key = `${projectLabel}\n${reason}`;
452
+ if (reportedUnreadableRegions.has(key)) return;
453
+ reportedUnreadableRegions.add(key);
454
+ // biome-ignore lint/suspicious/noConsole: this warning IS the function (see its docblock)
455
+ console.warn(`[project-content] ${projectLabel}: ${reason}`);
456
+ }
457
+
458
+ /**
459
+ * The {@link projectRegionEntries} reader contract over a {@link StorageBackend}:
460
+ * ABSENT resolves `null`, every other failure rejects. `read` rejects for both,
461
+ * so `exists` is what separates them — the backend's own answer, not a guess
462
+ * from the error's shape.
463
+ */
464
+ export async function readOptionalFromBackend(
465
+ backend: StorageBackend,
466
+ path: string,
467
+ ): Promise<string | null> {
468
+ try {
469
+ return await backend.read(path);
470
+ } catch (error) {
471
+ if (await backend.exists(path)) throw error;
472
+ return null;
473
+ }
474
+ }
475
+
476
+ /** Browser-hosted equivalent of the server component index. */
477
+ export async function discoverProjectComponentsFromStorage(
478
+ backend: StorageBackend,
479
+ ): Promise<ProjectComponentEntry[]> {
480
+ const pending = ['src'];
481
+ const files: string[] = [];
482
+ while (pending.length > 0 && files.length < 512) {
483
+ const directory = pending.shift()!;
484
+ const entries = await backend.list(directory).catch(() => []);
485
+ for (const entry of entries) {
486
+ if (entry.type === 'dir') {
487
+ if (!SKIPPED_SOURCE_DIRECTORIES.has(entry.name) && !entry.name.startsWith('.')) {
488
+ pending.push(entry.path);
489
+ }
490
+ } else if (PROJECT_SOURCE_EXTENSIONS.test(entry.path)) {
491
+ files.push(entry.path);
492
+ }
493
+ }
494
+ }
495
+ const sources = (
496
+ await Promise.all(
497
+ files.map((path) =>
498
+ backend
499
+ .read(path)
500
+ .then((source): IndexedProjectSource[] => [{ path, source }])
501
+ .catch(() => []),
502
+ ),
503
+ )
504
+ ).flat();
505
+ const { regions, unreadable } = await projectRegionEntries(
506
+ () => readOptionalFromBackend(backend, MANIFEST_FILENAME),
507
+ () => readOptionalFromBackend(backend, ADAPTER_MODULE_FILENAME),
508
+ );
509
+ if (unreadable) reportUnreadableRegions(backend.id, unreadable);
510
+ const surfaces = projectFileSurfaces(sources, regions);
511
+ const discovered = sources.flatMap((file) =>
512
+ discoverComponentsInSource(file.source, file.path, surfaces.get(file.path) ?? 'unknown'),
513
+ );
514
+ const rootEntries = await projectRootEntries(() => backend.read(MANIFEST_FILENAME));
515
+ return omitRootDocumentComponents(discovered, rootEntries).sort(compareProjectComponents);
516
+ }
517
+
518
+ export async function projectRootEntries(
519
+ readManifest: () => Promise<string>,
520
+ ): Promise<Set<string>> {
521
+ try {
522
+ const parsed = JSON.parse(await readManifest()) as { roots?: Array<{ entry?: unknown }> };
523
+ return new Set(
524
+ (parsed.roots ?? []).flatMap((root) =>
525
+ typeof root.entry === 'string' ? [root.entry.replace(/^\.\//, '')] : [],
526
+ ),
527
+ );
528
+ } catch {
529
+ return new Set();
530
+ }
531
+ }
532
+
533
+ export function omitRootDocumentComponents(
534
+ components: readonly ProjectComponentEntry[],
535
+ rootEntries: ReadonlySet<string>,
536
+ ): ProjectComponentEntry[] {
537
+ return components.flatMap((component) => {
538
+ const declaredInRootEntry = rootEntries.has(component.path.replace(/^\.\//, ''));
539
+ if (component.defaultExport && declaredInRootEntry) return [];
540
+ return [{ ...component, declaredInRootEntry }];
541
+ });
542
+ }
543
+
544
+ export function compareProjectComponents(
545
+ left: ProjectComponentEntry,
546
+ right: ProjectComponentEntry,
547
+ ): number {
548
+ if (left.exported !== right.exported) return left.exported ? -1 : 1;
549
+ return left.name.localeCompare(right.name) || left.path.localeCompare(right.path);
550
+ }