@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
package/LICENSE-APACHE ADDED
@@ -0,0 +1,202 @@
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright 2026 Volter AI, Inc.
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
package/NOTICE ADDED
@@ -0,0 +1,18 @@
1
+ Copyright 2026 Volter AI, Inc.
2
+
3
+ Editor source, server modules and build plugins were imported from the AGPL-3.0-only
4
+ @vgai/editor package. LICENSE contains that license.
5
+
6
+ src/performance-profiler.ts was imported from the Apache-2.0
7
+ @vgai/game-runtime package and retains that license. LICENSE-APACHE
8
+ contains its text. This timing collector does not execute gameplay.
9
+ The built plugins also include the Apache-2.0 editor-sdk contribution naming
10
+ constants; their source remains owned by editor-sdk.
11
+
12
+ Original source revisions and file hashes are recorded in the repository's
13
+ provenance/editor-host.json and provenance/editor-session.json, provenance/editor-server.json and
14
+ provenance/editor-workbench.json. Bundled dependency license texts are preserved in BUNDLED_NOTICES.
15
+ Native assets and the workbench distribution require separate review.
16
+
17
+ server/support/ modules transferred from @vgai/sdk are Apache-2.0.
18
+ Their source paths and hashes are recorded in provenance/editor-server.json.
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # Volter Editor core
2
+
3
+ Shared document host, panels, Three viewport infrastructure and Code-OSS bridge.
4
+ Products compose this host with contributions through `frame/product`; document
5
+ owners register their openers. The modeling host does not install a game-world
6
+ mount or built-in scene evaluator.
7
+
8
+ The source was transferred from the revision recorded in
9
+ `../../provenance/editor-host.json`. Three-aware core is deliberate for this
10
+ release; this is not a renderer-neutral viewport extraction. Runtime world
11
+ mounting, game input and game fixtures are outside this package.
12
+
13
+ Build plugins ship as JavaScript under `dist/build` so Node can load them from
14
+ an installed archive. Source remains available for review and public types.
15
+ Run `npm run build:plugins` before building a product from a fresh checkout;
16
+ `npm pack` runs this step automatically.
17
+
18
+ This package is private staging. Session route composition, installed-editor
19
+ startup, live modeling verification and final notices remain outstanding.
20
+
21
+ The `server/*` exports preserve the existing workbench proxy, registry writer,
22
+ worktree identity, opener and shutdown mechanisms. They do not yet compose a
23
+ complete editor server. Build them with `npm run build:session`; packing builds
24
+ them automatically. Tests exercise HTTP routing/isolation and bounded cleanup.
@@ -0,0 +1,175 @@
1
+ // vite-plugin-shared-react.ts
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { createRequire } from "node:module";
4
+ import path from "node:path";
5
+
6
+ // ../editor-sdk/src/session/tool-contribution-convention.ts
7
+ var CONTRIBUTIONS_DIR = "src/contributions";
8
+ var TOOLS_DIR = "src/tools";
9
+ var EDITOR_LANE_DIRS = [CONTRIBUTIONS_DIR, TOOLS_DIR];
10
+
11
+ // vite-plugin-shared-react.ts
12
+ var SHARED_REACT_ENTRIES = {
13
+ react: "vgai-shared-react",
14
+ "react-dom": "vgai-shared-react-dom",
15
+ "react-dom/client": "vgai-shared-react-dom-client",
16
+ "react/jsx-runtime": "vgai-shared-jsx-runtime",
17
+ "react/jsx-dev-runtime": "vgai-shared-jsx-dev-runtime",
18
+ "@fortawesome/react-fontawesome": "vgai-shared-fontawesome"
19
+ };
20
+ var SHARED_REACT_SPECIFIERS = Object.keys(SHARED_REACT_ENTRIES);
21
+ var SHARED_REACT_MANIFEST_FILE = "vgai-shared-react.json";
22
+ var VIRTUAL_PREFIX = "\0vgai-shared-react:";
23
+ function sharedReactEntryModule(specifier, exportNames) {
24
+ const named = exportNames.filter((name) => VALID_IDENTIFIER.test(name)).map((name) => `export const ${name} = __m.${name};`);
25
+ return [
26
+ `import * as __ns from ${JSON.stringify(specifier)};`,
27
+ // Bracketed on purpose: `__ns.default` makes rollup warn that the ES-module
28
+ // shape (the jsx-dev-runtime shim) has no `default` export, which is the
29
+ // case this line exists to handle.
30
+ "const __m = __ns['default'] ?? __ns;",
31
+ "export default __m;",
32
+ ...named,
33
+ ""
34
+ ].join("\n");
35
+ }
36
+ var VALID_IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
37
+ function installedExportNames(fromDir, specifier) {
38
+ const require_ = createRequire(path.join(fromDir, "package.json"));
39
+ const loaded = require_(specifier);
40
+ return Object.keys(loaded).filter((name) => name !== "default");
41
+ }
42
+ function sharedReactBuildPlugin(fromDir) {
43
+ const referenceIds = /* @__PURE__ */ new Map();
44
+ return {
45
+ name: "vgai-shared-react-build",
46
+ apply: "build",
47
+ buildStart() {
48
+ referenceIds.clear();
49
+ for (const specifier of SHARED_REACT_SPECIFIERS) {
50
+ referenceIds.set(
51
+ specifier,
52
+ this.emitFile({
53
+ type: "chunk",
54
+ id: `${VIRTUAL_PREFIX}${specifier}`,
55
+ name: SHARED_REACT_ENTRIES[specifier],
56
+ // Vite's app build sets `preserveEntrySignatures: false`, which
57
+ // mangles an entry's export names away. Per-chunk `strict` is what
58
+ // keeps `useState` spelled `useState` in the emitted file — the
59
+ // whole point of publishing it.
60
+ preserveSignature: "strict"
61
+ })
62
+ );
63
+ }
64
+ },
65
+ resolveId(id) {
66
+ return id.startsWith(VIRTUAL_PREFIX) ? id : void 0;
67
+ },
68
+ load(id) {
69
+ if (!id.startsWith(VIRTUAL_PREFIX)) return void 0;
70
+ const specifier = id.slice(VIRTUAL_PREFIX.length);
71
+ return sharedReactEntryModule(specifier, installedExportNames(fromDir, specifier));
72
+ },
73
+ generateBundle() {
74
+ const files = {};
75
+ for (const [specifier, referenceId] of referenceIds) {
76
+ files[specifier] = this.getFileName(referenceId);
77
+ }
78
+ this.emitFile({
79
+ type: "asset",
80
+ fileName: SHARED_REACT_MANIFEST_FILE,
81
+ source: `${JSON.stringify({ files }, null, 2)}
82
+ `
83
+ });
84
+ }
85
+ };
86
+ }
87
+ function readSharedReactManifest(distPath) {
88
+ const manifestPath = path.join(distPath, SHARED_REACT_MANIFEST_FILE);
89
+ if (!existsSync(manifestPath)) return null;
90
+ let manifest;
91
+ try {
92
+ manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
93
+ } catch {
94
+ return null;
95
+ }
96
+ if (SHARED_REACT_SPECIFIERS.some((specifier) => !manifest.files?.[specifier])) return null;
97
+ return manifest;
98
+ }
99
+ function sharedReactUrls(manifest, base = "/") {
100
+ const prefix = base.endsWith("/") ? base : `${base}/`;
101
+ return Object.fromEntries(
102
+ SHARED_REACT_SPECIFIERS.map((specifier) => [
103
+ specifier,
104
+ `${prefix}${manifest.files[specifier]}`
105
+ ])
106
+ );
107
+ }
108
+ var EDITOR_TREE_QUERY = "vgai-editor-react";
109
+ var PACKAGE_CONTRIBUTION_PATH = /[\\/]node_modules[\\/]@vgai[\\/][^\\/]+[\\/]contributions[\\/]/;
110
+ function markEditorTree(id) {
111
+ return id.includes(`?${EDITOR_TREE_QUERY}`) || id.includes(`&${EDITOR_TREE_QUERY}`) ? id : `${id}${id.includes("?") ? "&" : "?"}${EDITOR_TREE_QUERY}`;
112
+ }
113
+ function stripQuery(id) {
114
+ const cut = id.indexOf("?");
115
+ return cut === -1 ? id : id.slice(0, cut);
116
+ }
117
+ function isUnder(file, directory) {
118
+ return file === directory || file.startsWith(`${directory}${path.sep}`);
119
+ }
120
+ function sharedReactPlugin({
121
+ urls,
122
+ editorPackageRoot,
123
+ projectRoots
124
+ }) {
125
+ const editorSrc = path.join(editorPackageRoot, "src");
126
+ const layoutSdkSrc = path.resolve(editorPackageRoot, "../editor-sdk/src");
127
+ const inEditorTree = (importer) => {
128
+ if (!importer) return false;
129
+ if (importer.includes(EDITOR_TREE_QUERY)) return true;
130
+ const file = stripQuery(importer);
131
+ if (isUnder(file, editorSrc) || isUnder(file, layoutSdkSrc)) return true;
132
+ if (PACKAGE_CONTRIBUTION_PATH.test(file)) return true;
133
+ for (const root of projectRoots()) {
134
+ if (file === path.join(root, "vgai.adapter.ts")) return true;
135
+ if (EDITOR_LANE_DIRS.some((dir) => isUnder(file, path.join(root, dir)))) return true;
136
+ }
137
+ return false;
138
+ };
139
+ const isOwnSource = (file) => {
140
+ if (!path.isAbsolute(file)) return false;
141
+ if (isUnder(file, editorSrc) || isUnder(file, layoutSdkSrc)) return true;
142
+ if (file.includes(`${path.sep}node_modules${path.sep}`)) return false;
143
+ for (const root of projectRoots()) {
144
+ if (isUnder(file, root)) return true;
145
+ }
146
+ return false;
147
+ };
148
+ return {
149
+ name: "vgai-shared-react",
150
+ enforce: "pre",
151
+ async resolveId(source, importer, options) {
152
+ if (options?.scan) return void 0;
153
+ if (!inEditorTree(importer)) return void 0;
154
+ const url = urls[source];
155
+ if (url) return url;
156
+ const resolved = await this.resolve(source, importer, { ...options, skipSelf: true });
157
+ if (!resolved || resolved.external) return resolved ?? void 0;
158
+ return isOwnSource(stripQuery(resolved.id)) ? { ...resolved, id: markEditorTree(resolved.id) } : resolved;
159
+ }
160
+ };
161
+ }
162
+
163
+ export {
164
+ SHARED_REACT_ENTRIES,
165
+ SHARED_REACT_SPECIFIERS,
166
+ SHARED_REACT_MANIFEST_FILE,
167
+ sharedReactEntryModule,
168
+ installedExportNames,
169
+ sharedReactBuildPlugin,
170
+ readSharedReactManifest,
171
+ sharedReactUrls,
172
+ EDITOR_TREE_QUERY,
173
+ sharedReactPlugin
174
+ };
175
+ //# sourceMappingURL=chunk-JS4D4XZ3.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../vite-plugin-shared-react.ts", "../../../editor-sdk/src/session/tool-contribution-convention.ts"],
4
+ "sourcesContent": ["/**\n * ONE React for the editor's own tree \u2014 the shell's.\n *\n * ## The defect this closes\n *\n * Under the PACKAGED runtime (`server/packaged.ts`: a `@vgai/editor` npm\n * package with no monorepo checkout) the page runs two module graphs at once:\n *\n * - the editor shell, a PREBUILT production bundle (`dist/assets/index-*.js`)\n * with its own React inlined; and\n * - the opened PROJECT's source, served fresh by a second, project-rooted\n * Vite instance, whose bare `react` resolves \u2014 correctly, for its root \u2014 to\n * the PROJECT's own `node_modules`.\n *\n * Anything the project contributes that renders INSIDE the editor's React tree\n * therefore called hooks from a different React than the one reconciling it.\n * Measured on a fresh scaffold against the published 0.5.17 packaged editor:\n * all four dev-tools inspector facets (`src/tools/game-*.inspector.tsx`)\n * REGISTERED (`editor.inspect()` listed them) and then threw\n * `Invalid hook call \u2026 more than one copy of React in the same app` instead of\n * drawing \u2014 and so did every other project contribution that renders (the\n * humanoid/bird/castle builder inspectors, the World Labs asset inspector, the\n * data-tables document). None of it was visible from a checkout: `dev.ts`\n * serves the editor's OWN source and the project's source through ONE Vite\n * with `resolve.dedupe: ['react', \u2026]`, so in-repo there has only ever been one\n * React and every in-repo check passed.\n *\n * ## The mechanism: URL identity\n *\n * The editor build emits one extra ENTRY chunk per specifier in\n * {@link SHARED_REACT_ENTRIES} \u2014 the SHELL's own React, `react-dom`,\n * `react-dom/client`, `react/jsx-runtime`, `react/jsx-dev-runtime`, and the one\n * third-party package that CALLS React hooks inside the editor's tree. Because\n * they are entries of the SAME build, rollup hoists the actual module into a\n * chunk both they and the shell import: they are not a copy of React, they are\n * a doorway onto the shell's instance.\n *\n * At serve time {@link sharedReactPlugin} resolves those specifiers, for\n * every module in the EDITOR TREE (see below), to the built chunk's URL\n * (`/assets/vgai-shared-react-<hash>.js`) \u2014 the SAME absolute URL the shell's\n * own bundle imports, so the browser's module map hands both sides the one\n * instance.\n *\n * ### Why the entry bodies are GENERATED, not written\n *\n * The obvious spelling \u2014 a one-line `export * from 'react'` \u2014 silently emits a\n * chunk with NO named exports (measured: the built chunk exported only the\n * default and the raw namespace). React ships CommonJS, and rollup makes\n * `import { useState } from 'react'` work by rewriting the IMPORTER's member\n * access, not by synthesizing static named exports a star can forward. So each\n * entry body is generated at build time from the installed package's own\n * runtime key list (`Object.keys(require('react'))`), and every export is that\n * package's own function read off its own module object. That is a DOORWAY,\n * not a shim: there is no second implementation, nothing is faked, and the\n * list cannot drift from the installed React because it is read from it. The\n * chunks are emitted with `preserveSignature: 'strict'` because Vite's app\n * build otherwise sets `preserveEntrySignatures: false` and mangles an entry's\n * export names away.\n *\n * ## Where the seam is drawn (measured, not assumed)\n *\n * {@link sharedReactPlugin}'s own doc comment carries the full rule and the\n * live failure that set it: the redirect covers the EDITOR TREE \u2014 the\n * contribution lane, the widget kit, and whatever project source they reach \u2014\n * and deliberately stops at the GAME, which mounts into its own isolated\n * `createRoot` tree with the project's own development React and a matching\n * development reconciler. Redirecting the game too was tried first and broke\n * Play mode outright.\n *\n * {@link sharedReactPlugin} is registered ONLY by `server/packaged.ts`.\n * `dev.ts` is untouched \u2014 it has one React already.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { EDITOR_LANE_DIRS } from '@volter/editor-sdk/session/tool-contribution-convention';\nimport type { Plugin } from 'vite';\n\n/**\n * The published specifiers, and the rollup chunk NAME each appears under.\n *\n * The membership rule is one sentence: **a module belongs here when it CALLS\n * React hooks while rendering inside the editor's tree.** React itself is the\n * obvious case; a third-party component is the non-obvious one, and it fails\n * exactly as loudly \u2014 its `useState`/`useId` read a different dispatcher than\n * the tree reconciling it, which is \"Invalid hook call\" again with the\n * project's name nowhere in the stack.\n *\n * `@fortawesome/react-fontawesome` is here because it is the ONLY such module\n * `@volter/editor-sdk/widgets` reaches (measured: the kit's whole transitive bare-import\n * closure is `react`, `react-dom`, `@fortawesome/free-solid-svg-icons` \u2014 pure\n * path DATA, no React \u2014 and this). `SectionHeader` renders its\n * `DisclosureIcon` unconditionally, so before this entry existed every project\n * tool that used the kit's own section header crashed on the packaged path\n * while the tool's own hooks were being redirected correctly.\n *\n * `react-dom/server` is deliberately absent: nothing renders to a string in an\n * editor page, and an entry for it would drag React's server build into every\n * shell bundle.\n *\n * KNOWN REMAINING HOLE, same class: any OTHER bare dependency a contribution\n * renders calls its own prebundled React, and adding it here is not always the\n * answer. `@pixi/react` is the worked case and the reason this paragraph\n * exists \u2014 a doorway for it hands the editor's tree the SHELL's `@pixi/react`\n * and therefore the shell's `pixi.js`, while the contribution's own\n * `Texture`/`Assets` stay the project's: one renderer looking at another\n * renderer's textures, the same renderer-instance split that broke Play mode\n * when the game was redirected. The `sprite` capability's Sprite Lab took the\n * other exit instead \u2014 it drives plain `pixi.js` imperatively\n * (`sprite-lab/stage.ts`), because `pixi.js` calls no React hooks and so\n * crosses nothing. Reach for that shape first; a new line in this map is for a\n * dependency whose whole job IS rendering in the editor's tree.\n */\nexport const SHARED_REACT_ENTRIES = {\n react: 'vgai-shared-react',\n 'react-dom': 'vgai-shared-react-dom',\n 'react-dom/client': 'vgai-shared-react-dom-client',\n 'react/jsx-runtime': 'vgai-shared-jsx-runtime',\n 'react/jsx-dev-runtime': 'vgai-shared-jsx-dev-runtime',\n '@fortawesome/react-fontawesome': 'vgai-shared-fontawesome',\n\n} as const satisfies Record<string, string>;\n\nexport type SharedReactSpecifier = keyof typeof SHARED_REACT_ENTRIES;\n\n/** The specifiers this plugin owns \u2014 the same list `packaged.ts` keeps out of\n * dependency prebundling, exported so the two can never drift apart. */\nexport const SHARED_REACT_SPECIFIERS = Object.keys(SHARED_REACT_ENTRIES) as SharedReactSpecifier[];\n\n/**\n * The emitted map, written beside the built shell. NOT `.vite/manifest.json`:\n * this file is read out of an INSTALLED tarball, and a dot-directory is one\n * more thing that has to survive `npm pack`.\n */\nexport const SHARED_REACT_MANIFEST_FILE = 'vgai-shared-react.json';\n\nexport interface SharedReactManifest {\n /** Bare specifier \u2192 outDir-relative built chunk file (`assets/\u2026js`). */\n files: Record<string, string>;\n}\n\nconst VIRTUAL_PREFIX = '\\0vgai-shared-react:';\n\n/**\n * The body of one entry: every export the installed package actually has, read\n * off that package's own module object.\n *\n * `__ns.default ?? __ns` covers both shapes this has to handle \u2014 a CommonJS\n * package (rollup's interop puts `module.exports` on `default`) and a real ES\n * module (the root Vite config aliases `react/jsx-dev-runtime` to\n * `src/jsx-dev-runtime-prod-shim.ts` for builds, because production React\n * stubs `jsxDEV` to `undefined`).\n */\nexport function sharedReactEntryModule(specifier: string, exportNames: readonly string[]): string {\n const named = exportNames\n .filter((name) => VALID_IDENTIFIER.test(name))\n .map((name) => `export const ${name} = __m.${name};`);\n return [\n `import * as __ns from ${JSON.stringify(specifier)};`,\n // Bracketed on purpose: `__ns.default` makes rollup warn that the ES-module\n // shape (the jsx-dev-runtime shim) has no `default` export, which is the\n // case this line exists to handle.\n \"const __m = __ns['default'] ?? __ns;\",\n 'export default __m;',\n ...named,\n '',\n ].join('\\n');\n}\n\nconst VALID_IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\n/** The runtime export names of an installed package, resolved from `fromDir`. */\nexport function installedExportNames(fromDir: string, specifier: string): string[] {\n const require_ = createRequire(path.join(fromDir, 'package.json'));\n // biome-ignore lint/suspicious/noExplicitAny: reading an arbitrary package's runtime shape.\n const loaded = require_(specifier) as Record<string, any>;\n return Object.keys(loaded).filter((name) => name !== 'default');\n}\n\n/**\n * BUILD side: emit the five entry chunks and the manifest naming them.\n *\n * `fromDir` is the directory whose `node_modules` the React being published\n * comes from \u2014 the repo root for this build, which is the same React the shell\n * itself bundles.\n */\nexport function sharedReactBuildPlugin(fromDir: string): Plugin {\n const referenceIds = new Map<SharedReactSpecifier, string>();\n return {\n name: 'vgai-shared-react-build',\n apply: 'build',\n buildStart() {\n referenceIds.clear();\n for (const specifier of SHARED_REACT_SPECIFIERS) {\n referenceIds.set(\n specifier,\n this.emitFile({\n type: 'chunk',\n id: `${VIRTUAL_PREFIX}${specifier}`,\n name: SHARED_REACT_ENTRIES[specifier],\n // Vite's app build sets `preserveEntrySignatures: false`, which\n // mangles an entry's export names away. Per-chunk `strict` is what\n // keeps `useState` spelled `useState` in the emitted file \u2014 the\n // whole point of publishing it.\n preserveSignature: 'strict',\n }),\n );\n }\n },\n resolveId(id) {\n return id.startsWith(VIRTUAL_PREFIX) ? id : undefined;\n },\n load(id) {\n if (!id.startsWith(VIRTUAL_PREFIX)) return undefined;\n const specifier = id.slice(VIRTUAL_PREFIX.length);\n return sharedReactEntryModule(specifier, installedExportNames(fromDir, specifier));\n },\n generateBundle() {\n const files: Record<string, string> = {};\n for (const [specifier, referenceId] of referenceIds) {\n files[specifier] = this.getFileName(referenceId);\n }\n this.emitFile({\n type: 'asset',\n fileName: SHARED_REACT_MANIFEST_FILE,\n source: `${JSON.stringify({ files } satisfies SharedReactManifest, null, 2)}\\n`,\n });\n },\n };\n}\n\n/** The manifest a built `dist/` carries, or `null` when it predates this build\n * step (an old tarball, or a checkout whose `dist/` was never rebuilt). */\nexport function readSharedReactManifest(distPath: string): SharedReactManifest | null {\n const manifestPath = path.join(distPath, SHARED_REACT_MANIFEST_FILE);\n if (!existsSync(manifestPath)) return null;\n let manifest: SharedReactManifest;\n try {\n manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as SharedReactManifest;\n } catch {\n return null;\n }\n if (SHARED_REACT_SPECIFIERS.some((specifier) => !manifest.files?.[specifier])) return null;\n return manifest;\n}\n\n/**\n * Specifier \u2192 URL, from a manifest. `base` is the built shell's own base (`/`\n * for the packaged build), so these URLs are byte-identical to the ones the\n * shell's bundle imports. That identity IS the fix: a differently-spelled URL\n * for the same file is a second React.\n */\nexport function sharedReactUrls(manifest: SharedReactManifest, base = '/'): Record<string, string> {\n const prefix = base.endsWith('/') ? base : `${base}/`;\n return Object.fromEntries(\n SHARED_REACT_SPECIFIERS.map((specifier) => [\n specifier,\n `${prefix}${manifest.files[specifier]}`,\n ]),\n );\n}\n\n/**\n * The query that marks a module as part of the EDITOR TREE \u2014 the same\n * \"the query IS the scope\" device `vite-plugin-mount-isolation.ts` uses.\n * Queries survive `cleanUrl`, so every other plugin's `.tsx` scope test still\n * matches a marked module.\n */\nexport const EDITOR_TREE_QUERY = 'vgai-editor-react';\n\n/** A file inside a `@vgai/*` package's `contributions/` directory under any\n * `node_modules` (a real install; in a checkout the package is a symlink\n * whose realpath is its workspace directory, already `isOwnSource`). */\nconst PACKAGE_CONTRIBUTION_PATH = /[\\\\/]node_modules[\\\\/]@vgai[\\\\/][^\\\\/]+[\\\\/]contributions[\\\\/]/;\n\nfunction markEditorTree(id: string): string {\n return id.includes(`?${EDITOR_TREE_QUERY}`) || id.includes(`&${EDITOR_TREE_QUERY}`)\n ? id\n : `${id}${id.includes('?') ? '&' : '?'}${EDITOR_TREE_QUERY}`;\n}\n\nfunction stripQuery(id: string): string {\n const cut = id.indexOf('?');\n return cut === -1 ? id : id.slice(0, cut);\n}\n\nfunction isUnder(file: string, directory: string): boolean {\n return file === directory || file.startsWith(`${directory}${path.sep}`);\n}\n\nexport interface SharedReactScope {\n /** Specifier \u2192 built chunk URL (see {@link sharedReactUrls}). */\n urls: Record<string, string>;\n /** The installed `@vgai/editor` package root \u2014 its `src/` is `@editor/*`. */\n editorPackageRoot: string;\n /** Every open project root, live (the same getter the sibling plugins take). */\n projectRoots: () => Set<string>;\n}\n\n/**\n * SERVE side: point the EDITOR TREE's React specifiers at the shell's built\n * chunk URLs.\n *\n * ## Scope, and why it is not the whole graph\n *\n * The first version of this redirected React for every module this Vite\n * instance served. It fixed the contributions and BROKE Play mode, loudly and\n * measurably: `@react-three/fiber`'s prebundled `react-reconciler` is a\n * DEVELOPMENT build (Vite prebundles a dev server's deps with\n * `NODE_ENV=development`), and a dev reconciler against the shell's PRODUCTION\n * React reads internals that production React does not have \u2014 `TypeError:\n * Cannot read properties of undefined (reading 'push')` inside\n * `updateContainer`, \"The current testing environment is not configured to\n * support act(...)\", and finally `r3f-adapter: onCreated did not fire within\n * 10s`. The DEV/PROD boundary is real: the shell ships a production React and\n * the project's own graph is a development graph.\n *\n * So the seam is drawn where the RENDERING is: a module that renders inside\n * the editor's own React tree uses the editor's React; the game \u2014 mounted by\n * `createRoot` into its own isolated tree, with its own dev React and its own\n * dev reconciler, internally consistent \u2014 keeps the project's. That is the\n * same line `vite-plugin-module-doorways.ts` already draws for the mount\n * call, and it is why Play mode works today.\n *\n * ## How the scope is decided\n *\n * An importer is in the editor tree when it is:\n * - a project's `src/contributions/**` or `src/tools/**` module (the editor\n * lanes shared with the contribution loader),\n * - a file under the installed editor package's own `src/` (what `@editor/*`\n * aliases to \u2014 the widget kit contributions build their panels from), or\n * - anything already MARKED, which is how the scope propagates.\n *\n * Propagation is what makes this cover the real graph rather than one folder:\n * `src/tools/data-tables.document.tsx` renders React components that live in\n * `src/lib/data-tables/`, and a contribution may reach any project module. So\n * when an editor-tree module imports another PROJECT-OWNED source file, the\n * resolved id is marked and its own imports inherit the scope. Bare\n * dependencies are deliberately NOT marked: they are prebundled, and a\n * prebundled chunk's React is decided at prebundle time, not here.\n * `@volter/editor-sdk/widgets` is the one dependency that must therefore be kept\n * OUT of `optimizeDeps` (`packaged.ts` excludes it) \u2014 it renders in the editor's tree\n * and has to be source-served for this scope to reach it.\n *\n * `enforce: 'pre'` so this runs ahead of Vite's own resolver and its alias\n * plugin. The returned React id is a root-relative URL, not a filesystem path:\n * Vite's import analysis leaves an id it cannot map into the project root as\n * the literal import URL, and the packaged server's `express.static(dist)`\n * answers it \u2014 so the browser fetches the same `/assets/\u2026` file the shell\n * already loaded.\n */\nexport function sharedReactPlugin({\n urls,\n editorPackageRoot,\n projectRoots,\n}: SharedReactScope): Plugin {\n const editorSrc = path.join(editorPackageRoot, 'src');\n const layoutSdkSrc = path.resolve(editorPackageRoot, '../editor-sdk/src');\n const inEditorTree = (importer: string | undefined): boolean => {\n if (!importer) return false;\n if (importer.includes(EDITOR_TREE_QUERY)) return true;\n const file = stripQuery(importer);\n if (isUnder(file, editorSrc) || isUnder(file, layoutSdkSrc)) return true;\n // A skew PACKAGE's contribution (`node_modules/@vgai/<pkg>/contributions/`)\n // renders in the editor's tree exactly as a project's own contribution\n // does, so it takes the shell's React and SDK. Only the contributions\n // directory: the same package's `src/` is also game runtime (a mesh\n // component in a world), and a game keeps its own React.\n if (PACKAGE_CONTRIBUTION_PATH.test(file)) return true;\n for (const root of projectRoots()) {\n if (file === path.join(root, 'vgai.adapter.ts')) return true;\n if (EDITOR_LANE_DIRS.some((dir) => isUnder(file, path.join(root, dir)))) return true;\n }\n return false;\n };\n /** Project-owned source the scope propagates into \u2014 never a bare dep. */\n const isOwnSource = (file: string): boolean => {\n if (!path.isAbsolute(file)) return false;\n if (isUnder(file, editorSrc) || isUnder(file, layoutSdkSrc)) return true;\n if (file.includes(`${path.sep}node_modules${path.sep}`)) return false;\n for (const root of projectRoots()) {\n if (isUnder(file, root)) return true;\n }\n return false;\n };\n\n return {\n name: 'vgai-shared-react',\n enforce: 'pre',\n async resolveId(source, importer, options) {\n // Never during dependency SCANNING. The scanner records whatever an id\n // resolves to as a file to prebundle, so handing it the shell's URL made\n // the boot-time optimizer die on `ENOENT: open\n // '/assets/vgai-shared-jsx-runtime-*.js'` \u2014 measured, on the first run\n // after this scope existed. The redirect belongs to serving, where the\n // browser is the thing fetching the URL.\n // `scan` is Vite's own flag on the resolve options, not part of rollup's\n // published type \u2014 hence the cast rather than a widened signature.\n //\n // The scan is not the only server-side pass that follows this redirect:\n // import analysis PRE-TRANSFORMS every static import it rewrites, and a\n // warmup for `/assets/vgai-shared-*.js` resolves against the project root\n // and fails the same way (measured: 64 formatted `Pre-transform error`\n // lines from one `*.inspector.tsx` request). Vite has no per-request\n // opt-out there, so `packaged.ts` turns `server.preTransformRequests` off\n // for its instance \u2014 see the comment on that option for why satisfying\n // the warmup instead would pull the whole prebuilt SPA into the project's\n // dev module graph.\n if ((options as { scan?: boolean } | undefined)?.scan) return undefined;\n if (!inEditorTree(importer)) return undefined;\n const url = urls[source];\n if (url) return url;\n const resolved = await this.resolve(source, importer, { ...options, skipSelf: true });\n if (!resolved || resolved.external) return resolved ?? undefined;\n return isOwnSource(stripQuery(resolved.id))\n ? { ...resolved, id: markEditorTree(resolved.id) }\n : resolved;\n },\n };\n}\n", "/**\n * The tool-contribution FILENAME CONVENTION \u2014 the one definition for every\n * program that asks \"is this file a contribution module?\": the dev server's\n * scanner and `src/`-watcher classifier (`server/server-utils.ts`,\n * `server/project-tools.ts`), and the page-side readers that must reach the\n * same verdict about the same files. Lives in `src/` and names no DOM so the\n * server TypeScript program can import it \u2014 the same split\n * `game-globals-prelude.ts` documents for the globals prelude.\n */\n\n/**\n * The two editor-side folders of a project (ARCHITECTURE-CORE \u00A7The project\n * model): `src/contributions/` \u2014 what the project adds to the editor\n * (documents, inspectors, utilities, analytics, kinds, finders) \u2014 and\n * `src/tools/` \u2014 the tools a person or an agent invokes (`*.tool.ts`).\n * Neither is bundled at Play; both reload the editor, never the game.\n */\nexport const CONTRIBUTIONS_DIR = 'src/contributions';\nexport const TOOLS_DIR = 'src/tools';\nexport const EDITOR_LANE_DIRS = [CONTRIBUTIONS_DIR, TOOLS_DIR] as const;\n\n/** Whether a project-relative (or absolute, `/`-normalized) path sits in the editor's lane. */\nexport function isEditorLanePath(path: string): boolean {\n const normalized = path.replaceAll('\\\\', '/');\n return EDITOR_LANE_DIRS.some(\n (dir) => normalized.startsWith(`${dir}/`) || normalized.includes(`/${dir}/`),\n );\n}\n\nexport const TOOL_CONTRIBUTION_SUFFIXES = [\n '.document',\n '.inspector',\n '.asset-inspector',\n '.result',\n '.utility',\n '.analytics',\n // A STATUS-BAR item (`workspace-status-registry.ts`): compact, passive,\n // registered under `tool:<id>` like a utility tab.\n '.status',\n // A configuration KIND contribution (ARCHITECTURE-CORE \u00A7The project model);\n // read by the hosts that load the manifest, never mounted as UI.\n '.kind',\n // A FINDER contribution \u2014 registered into the finder registry by the host\n // that resolves the document table (the browser), never mounted as UI.\n '.finder',\n // The LOOK points (`@volter/editor-sdk/looks`): a workspace layout, a keymap\n // and a style bundle are DATA \u2014 registered by the host, mounted by no UI\n // point. What makes \"the Blender\" a build is a package contributing these.\n '.layout',\n '.keymap',\n '.style',\n // A COMMAND table (`@volter/editor-sdk/commands`): session verbs a package\n // answers, registered with the host's relay; data, no UI.\n '.command',\n // The CHROME points (`@volter/editor-sdk/chrome`): palette actions and\n // application-menu items; data the host renders in its own chrome.\n '.action',\n '.menu',\n // A HEADER item: a component in the project header's transport cluster.\n '.header',\n // A SERVICE (`@volter/editor-sdk/services`): code a package runs while its\n // contributions are loaded \u2014 started after a pass, stopped before the next.\n '.service',\n] as const;\n\nconst TOOL_CONTRIBUTION_EXTENSIONS = ['.tsx', '.jsx', '.ts'] as const;\n\nexport type ChromeContributionKind = 'action' | 'menu' | 'header';\n\n/** Which chrome point a contribution file names, or null. */\nexport function chromeContributionKind(fileName: string): ChromeContributionKind | null {\n for (const kind of ['action', 'menu', 'header'] as const)\n if (TOOL_CONTRIBUTION_EXTENSIONS.some((extension) => fileName.endsWith(`.${kind}${extension}`)))\n return kind;\n return null;\n}\n\nexport function isServiceContribution(fileName: string): boolean {\n return TOOL_CONTRIBUTION_EXTENSIONS.some((extension) =>\n fileName.endsWith(`.service${extension}`),\n );\n}\n\nexport function isCommandContribution(fileName: string): boolean {\n return TOOL_CONTRIBUTION_EXTENSIONS.some((extension) =>\n fileName.endsWith(`.command${extension}`),\n );\n}\n\nexport type LookContributionKind = 'layout' | 'keymap' | 'style';\n\n/** Which look point a contribution file names, or null for a module of\n * another kind. */\nexport function lookContributionKind(fileName: string): LookContributionKind | null {\n for (const kind of ['layout', 'keymap', 'style'] as const)\n if (TOOL_CONTRIBUTION_EXTENSIONS.some((extension) => fileName.endsWith(`.${kind}${extension}`)))\n return kind;\n return null;\n}\n\n/** A kind contribution: scanned with the rest, mounted by no UI point. */\n/** A finder contribution: registered by the document-table host, mounted by no UI point. */\nexport function isFinderContribution(fileName: string): boolean {\n return TOOL_CONTRIBUTION_EXTENSIONS.some((extension) => fileName.endsWith(`.finder${extension}`));\n}\n\nexport function isConfigurationKindContribution(fileName: string): boolean {\n return TOOL_CONTRIBUTION_EXTENSIONS.some((extension) => fileName.endsWith(`.kind${extension}`));\n}\n\n/** Whether one file name is a contribution module by the convention above. */\nexport function isToolContributionModule(fileName: string): boolean {\n return TOOL_CONTRIBUTION_EXTENSIONS.some((extension) =>\n TOOL_CONTRIBUTION_SUFFIXES.some((suffix) => fileName.endsWith(`${suffix}${extension}`)),\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,100 @@
1
+ // vite-plugin-product-contributions.ts
2
+ import { readFileSync } from "node:fs";
3
+ import { createRequire } from "node:module";
4
+ import { dirname, isAbsolute, join } from "node:path";
5
+ import { pathToFileURL } from "node:url";
6
+ var PRODUCT_CONTRIBUTIONS_PREFIX = "vgai:contributions/";
7
+ function productContributionsModuleSource(packageName, declared) {
8
+ const rows = declared.map((entry) => {
9
+ const relative = entry.replace(/^\.\//, "");
10
+ const specifier = `${packageName}/${relative}`;
11
+ const importable = specifier.replace(/\.(tsx|ts|jsx|js)$/, "");
12
+ return ` { entryPath: ${JSON.stringify(specifier)}, load: () => import(${JSON.stringify(importable)}) },`;
13
+ });
14
+ return [
15
+ `// ${packageName}'s package.json#vgai.contributions, read at build time by`,
16
+ "// packages/editor/vite-plugin-product-contributions.ts.",
17
+ "export default [",
18
+ ...rows,
19
+ "];",
20
+ ""
21
+ ].join("\n");
22
+ }
23
+ function readDeclaredContributions(manifestPath, packageName) {
24
+ let manifest;
25
+ try {
26
+ manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
27
+ } catch (error) {
28
+ throw new Error(
29
+ `${manifestPath} is not readable (${error instanceof Error ? error.message : String(error)}), so ${packageName}'s contributions cannot be composed into this product.`
30
+ );
31
+ }
32
+ const declared = manifest.vgai?.contributions;
33
+ if (declared === void 0)
34
+ throw new Error(
35
+ `${packageName} declares no package.json#vgai.contributions, so there is nothing for a product to mount from it. A package that contributes declares its modules there; a package that only exports code is imported by name instead.`
36
+ );
37
+ if (!Array.isArray(declared) || declared.some((entry) => typeof entry !== "string"))
38
+ throw new Error(
39
+ `${packageName}'s package.json#vgai.contributions must be an array of ./-relative modules.`
40
+ );
41
+ return declared;
42
+ }
43
+ function locateManifest(packageName, importer) {
44
+ const from = importer && isAbsolute(importer) ? importer : join(process.cwd(), "index.js");
45
+ const require2 = createRequire(pathToFileURL(from));
46
+ try {
47
+ return require2.resolve(`${packageName}/package.json`);
48
+ } catch {
49
+ const resolvedFrom = createRequire(pathToFileURL(from));
50
+ const found = resolvedFrom.resolve(packageName);
51
+ let dir = dirname(found);
52
+ for (; ; ) {
53
+ const candidate = join(dir, "package.json");
54
+ try {
55
+ if (JSON.parse(readFileSync(candidate, "utf8")).name === packageName) return candidate;
56
+ } catch {
57
+ }
58
+ const parent = dirname(dir);
59
+ if (parent === dir)
60
+ throw new Error(
61
+ `${packageName} is not installed where ${from} can resolve it, so this product cannot mount its contributions. Declare it as a dependency of the product package.`
62
+ );
63
+ dir = parent;
64
+ }
65
+ }
66
+ }
67
+ function productContributionsPlugin() {
68
+ const manifests = /* @__PURE__ */ new Map();
69
+ return {
70
+ name: "vgai-product-contributions",
71
+ resolveId(id, importer) {
72
+ if (!id.startsWith(PRODUCT_CONTRIBUTIONS_PREFIX)) return null;
73
+ const packageName = id.slice(PRODUCT_CONTRIBUTIONS_PREFIX.length);
74
+ if (packageName === "")
75
+ throw new Error(
76
+ `"${id}" names no package \u2014 the form is \`${PRODUCT_CONTRIBUTIONS_PREFIX}<package>\`.`
77
+ );
78
+ const virtual = `\0${id}`;
79
+ manifests.set(virtual, locateManifest(packageName, importer));
80
+ return virtual;
81
+ },
82
+ load(id) {
83
+ const manifestPath = manifests.get(id);
84
+ if (manifestPath === void 0) return null;
85
+ const packageName = id.slice(`\0${PRODUCT_CONTRIBUTIONS_PREFIX}`.length);
86
+ this.addWatchFile(manifestPath);
87
+ return productContributionsModuleSource(
88
+ packageName,
89
+ readDeclaredContributions(manifestPath, packageName)
90
+ );
91
+ }
92
+ };
93
+ }
94
+ export {
95
+ PRODUCT_CONTRIBUTIONS_PREFIX,
96
+ productContributionsModuleSource,
97
+ productContributionsPlugin,
98
+ readDeclaredContributions
99
+ };
100
+ //# sourceMappingURL=vite-plugin-product-contributions.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../vite-plugin-product-contributions.ts"],
4
+ "sourcesContent": ["/**\n * `vgai:contributions/<package>` \u2014 a package's DECLARED contributions, read at\n * build/serve time and served as a module of static `import()`s.\n *\n * A PRODUCT is code (ARCHITECTURE-CORE \u00A7The target shape, rule 8: \"Compositions\n * are code; the frame's and the loader's manifests are declarations and stay\").\n * `packages/game-editor/src/index.ts` and `packages/model-editor/src/index.ts`\n * name the packages they mount, in TypeScript, and each name is spelled as an\n * import of this virtual module:\n *\n * import blender from 'vgai:contributions/@vgai/blender';\n *\n * whose body this plugin synthesizes from that package's own\n * `package.json#vgai.contributions`:\n *\n * export default [\n * { entryPath: '@vgai/blender/contributions/blender.command.ts',\n * load: () => import('@vgai/blender/contributions/blender.command') },\n * \u2026\n * ];\n *\n * The declaration is the ONE source. Nothing is committed that a script\n * generates, and a package that grows a contribution grows every product that\n * names it with no second edit anywhere \u2014 which is the defect the generated\n * table (`builds.generated.ts`, 529 committed lines derived from `builds/*.json`)\n * existed to remove and then re-introduced from the other side: the table was\n * committed, so it went stale, and a pre-commit check had to exist to notice.\n *\n * WHY A PLUGIN AND NOT `import.meta.glob`. A glob is a path pattern over THIS\n * package's tree; what a product mounts is another package's own list, and a\n * package's contributions live behind its export map, not at a path a consumer\n * may guess. So the plugin reads the manifest the loader already reads\n * (`server/project-tools.ts`'s `packageContributionModules` reads the same key\n * for a PROJECT's declared packages) and emits the same `{ entryPath, load }`\n * shape `tool-loader.ts` consumes. `vite-plugin-module-doorways.ts` is the\n * precedent for the mechanism: `resolveId` maps a private id, `load` answers\n * with a literal module body of static statements, and every specifier in it\n * goes through the serving instance's own resolver.\n *\n * THE `entryPath` IS THE PACKAGE SPECIFIER, with its extension, because that is\n * what the SESSION reports for the same module (`project-tools.ts` records a\n * package's contribution by the manifest's own `./contributions/x.ts` spelling)\n * and `tool-loader.ts` dedupes a package the product bundles against one the\n * open project declares BY THAT STRING. The `load` import drops the extension\n * for the same reason the old generator did: `@vgai/x/contributions/*` is an\n * export-map wildcard, and the bundler resolves the extension.\n *\n * WHERE THE MANIFEST IS FOUND. From the IMPORTER \u2014 the product module doing the\n * importing \u2014 through Node resolution of `<name>/package.json`, so the product\n * reads the package its own install resolves. `resolveId` is the only hook with\n * an importer, so it resolves the manifest and remembers it for `load`.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, isAbsolute, join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { Plugin } from 'vite';\n\n/** The specifier prefix a product writes. Part of the kit's public surface: a\n * product package's source contains this string and nothing else about how a\n * contribution is found. */\nexport const PRODUCT_CONTRIBUTIONS_PREFIX = 'vgai:contributions/';\n\n/** One contribution a product bundles: the package specifier `tool-loader.ts`\n * records as the module's `file`, and the lazy import the bundler follows. */\nexport interface BundledContribution {\n readonly entryPath: string;\n readonly load: () => Promise<unknown>;\n}\n\n/** The module text served for one package's declared contributions. Exported so\n * the closure meter can read the same list this serves without re-deriving the\n * rule (`scripts/validate-editor-closure.mjs`). */\nexport function productContributionsModuleSource(\n packageName: string,\n declared: readonly string[],\n): string {\n const rows = declared.map((entry) => {\n const relative = entry.replace(/^\\.\\//, '');\n const specifier = `${packageName}/${relative}`;\n const importable = specifier.replace(/\\.(tsx|ts|jsx|js)$/, '');\n return (\n ` { entryPath: ${JSON.stringify(specifier)}, ` +\n `load: () => import(${JSON.stringify(importable)}) },`\n );\n });\n return [\n `// ${packageName}'s package.json#vgai.contributions, read at build time by`,\n '// packages/editor/vite-plugin-product-contributions.ts.',\n 'export default [',\n ...rows,\n '];',\n '',\n ].join('\\n');\n}\n\n/** A package's declared contribution modules, or a throw naming the package. */\nexport function readDeclaredContributions(manifestPath: string, packageName: string): string[] {\n let manifest: { vgai?: { contributions?: unknown } };\n try {\n manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as typeof manifest;\n } catch (error) {\n throw new Error(\n `${manifestPath} is not readable (${error instanceof Error ? error.message : String(error)}), ` +\n `so ${packageName}'s contributions cannot be composed into this product.`,\n );\n }\n const declared = manifest.vgai?.contributions;\n if (declared === undefined)\n throw new Error(\n `${packageName} declares no package.json#vgai.contributions, so there is nothing for a ` +\n 'product to mount from it. A package that contributes declares its modules there; a ' +\n 'package that only exports code is imported by name instead.',\n );\n if (!Array.isArray(declared) || declared.some((entry) => typeof entry !== 'string'))\n throw new Error(\n `${packageName}'s package.json#vgai.contributions must be an array of ./-relative modules.`,\n );\n return declared as string[];\n}\n\n/**\n * Resolve `<name>/package.json` from the importing module's own directory.\n *\n * `createRequire` walks `node_modules` upward exactly as the runtime does, so a\n * product resolves the package version its own install carries \u2014 and in this\n * workspace that is the checkout's symlink, which is the same file the estate\n * scan reads.\n */\nfunction locateManifest(packageName: string, importer: string | undefined): string {\n const from = importer && isAbsolute(importer) ? importer : join(process.cwd(), 'index.js');\n const require = createRequire(pathToFileURL(from));\n try {\n return require.resolve(`${packageName}/package.json`);\n } catch {\n // An export map without a `./package.json` entry: fall back to the package\n // directory Node resolves for the bare name's own files.\n const resolvedFrom = createRequire(pathToFileURL(from));\n const found = resolvedFrom.resolve(packageName);\n let dir = dirname(found);\n for (;;) {\n const candidate = join(dir, 'package.json');\n try {\n if (JSON.parse(readFileSync(candidate, 'utf8')).name === packageName) return candidate;\n } catch {\n /* keep walking */\n }\n const parent = dirname(dir);\n if (parent === dir)\n throw new Error(\n `${packageName} is not installed where ${from} can resolve it, so this product cannot ` +\n 'mount its contributions. Declare it as a dependency of the product package.',\n );\n dir = parent;\n }\n }\n}\n\n/**\n * The ONE plugin serving every `vgai:contributions/<package>` a product names.\n *\n * Registered on the repo-root `vite.config.ts` \u2014 which is both the product\n * BUILD's config and the dev session's `configFile`\n * (`packages/editor/server/dev.ts`), so one registration answers both hosts.\n * The PACKAGED host's project-rooted instance never sees a product module (the\n * product is a built chunk there), so it registers nothing.\n */\nexport function productContributionsPlugin(): Plugin {\n const manifests = new Map<string, string>();\n return {\n name: 'vgai-product-contributions',\n resolveId(id, importer) {\n if (!id.startsWith(PRODUCT_CONTRIBUTIONS_PREFIX)) return null;\n const packageName = id.slice(PRODUCT_CONTRIBUTIONS_PREFIX.length);\n if (packageName === '')\n throw new Error(\n `\"${id}\" names no package \u2014 the form is \\`${PRODUCT_CONTRIBUTIONS_PREFIX}<package>\\`.`,\n );\n const virtual = `\\0${id}`;\n manifests.set(virtual, locateManifest(packageName, importer));\n return virtual;\n },\n load(id) {\n const manifestPath = manifests.get(id);\n if (manifestPath === undefined) return null;\n const packageName = id.slice(`\\0${PRODUCT_CONTRIBUTIONS_PREFIX}`.length);\n // Watched, so a package that grows a contribution refreshes the product\n // in a live session instead of waiting for a restart.\n this.addWatchFile(manifestPath);\n return productContributionsModuleSource(\n packageName,\n readDeclaredContributions(manifestPath, packageName),\n );\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["require"]
7
+ }