@volter/editor-core 0.5.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (719) hide show
  1. package/BUNDLED_NOTICES +1527 -0
  2. package/LICENSE +686 -0
  3. package/LICENSE-APACHE +202 -0
  4. package/NOTICE +18 -0
  5. package/README.md +24 -0
  6. package/dist/build/chunk-JS4D4XZ3.js +175 -0
  7. package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
  8. package/dist/build/vite-plugin-product-contributions.js +100 -0
  9. package/dist/build/vite-plugin-product-contributions.js.map +7 -0
  10. package/dist/build/vite-plugin-shared-react.js +25 -0
  11. package/dist/build/vite-plugin-shared-react.js.map +7 -0
  12. package/dist/build/vite-plugin-shared-three.js +86 -0
  13. package/dist/build/vite-plugin-shared-three.js.map +7 -0
  14. package/dist/server/chunk-KMJC7AGO.js +98 -0
  15. package/dist/server/chunk-KMJC7AGO.js.map +7 -0
  16. package/dist/server/chunk-PSILUMGS.js +46 -0
  17. package/dist/server/chunk-PSILUMGS.js.map +7 -0
  18. package/dist/server/frame-proxy.js +255 -0
  19. package/dist/server/frame-proxy.js.map +7 -0
  20. package/dist/server/open-browser.js +53 -0
  21. package/dist/server/open-browser.js.map +7 -0
  22. package/dist/server/process-shutdown.js +127 -0
  23. package/dist/server/process-shutdown.js.map +7 -0
  24. package/dist/server/session-registry.js +141 -0
  25. package/dist/server/session-registry.js.map +7 -0
  26. package/dist/server/spawn-opener.js +11 -0
  27. package/dist/server/spawn-opener.js.map +7 -0
  28. package/dist/server/worktree-identity.js +11 -0
  29. package/dist/server/worktree-identity.js.map +7 -0
  30. package/dist-server/packaged.mjs +88816 -0
  31. package/package.json +118 -0
  32. package/scripts/build-plugins.mjs +14 -0
  33. package/scripts/build-server.mjs +26 -0
  34. package/scripts/build-session.mjs +9 -0
  35. package/server/account-credentials.ts +60 -0
  36. package/server/account-service.ts +1434 -0
  37. package/server/adapter-region-includes.ts +47 -0
  38. package/server/asset-catalog-v2.ts +175 -0
  39. package/server/asset-history-snapshots.ts +196 -0
  40. package/server/asset-ledger-store.ts +195 -0
  41. package/server/asset-library-routes.ts +1595 -0
  42. package/server/blender-wasm-artifact.ts +430 -0
  43. package/server/boot-timings.ts +106 -0
  44. package/server/canonical-path.ts +50 -0
  45. package/server/checkout-workspace-preflight.ts +349 -0
  46. package/server/cloud-asset-catalog.ts +158 -0
  47. package/server/coding-inference-launch.ts +237 -0
  48. package/server/collaboration-account-client.ts +202 -0
  49. package/server/collaboration-attribution.ts +122 -0
  50. package/server/collaboration-session.ts +934 -0
  51. package/server/comfyui-bridge.ts +248 -0
  52. package/server/console-ledger.ts +499 -0
  53. package/server/creation-site-transform.ts +304 -0
  54. package/server/creation-site-write.ts +648 -0
  55. package/server/data-file-serialize.ts +158 -0
  56. package/server/editor-brand-html.ts +72 -0
  57. package/server/editor-control-socket.ts +366 -0
  58. package/server/editor-server-options.ts +190 -0
  59. package/server/editor-server.ts +1483 -0
  60. package/server/editor-sse.ts +352 -0
  61. package/server/engine-provenance.ts +169 -0
  62. package/server/engine-source-restart.ts +117 -0
  63. package/server/frame-bridge.ts +115 -0
  64. package/server/frame-proxy.ts +490 -0
  65. package/server/frame-workbench.ts +259 -0
  66. package/server/frontend-handoff.ts +229 -0
  67. package/server/game-globals-shadow.ts +113 -0
  68. package/server/gameplay-session-retention.ts +149 -0
  69. package/server/gameplay-sessions.ts +123 -0
  70. package/server/generation-jobs.ts +201 -0
  71. package/server/generation-reconciler.ts +137 -0
  72. package/server/generative-execution-context.ts +59 -0
  73. package/server/git-workflow.ts +612 -0
  74. package/server/harness-chat-caller.ts +36 -0
  75. package/server/harness-chat-service.ts +1681 -0
  76. package/server/idle-shutdown.ts +170 -0
  77. package/server/js-profiling-policy.ts +52 -0
  78. package/server/launcher-settings.ts +84 -0
  79. package/server/local-asset-catalog.ts +410 -0
  80. package/server/managed-account-defaults.ts +22 -0
  81. package/server/mock-control-plane.ts +540 -0
  82. package/server/model-import-conversion.ts +345 -0
  83. package/server/native-credential-store.ts +162 -0
  84. package/server/open-browser.ts +118 -0
  85. package/server/packaged.ts +1192 -0
  86. package/server/play-stall.ts +126 -0
  87. package/server/process-shutdown.ts +218 -0
  88. package/server/product-presets.ts +55 -0
  89. package/server/project-build-artifact.ts +95 -0
  90. package/server/project-components.ts +100 -0
  91. package/server/project-dependency-invalidation.ts +114 -0
  92. package/server/project-file-scan.ts +235 -0
  93. package/server/project-hmr-files.ts +215 -0
  94. package/server/project-install-roots.ts +210 -0
  95. package/server/project-kinds.ts +71 -0
  96. package/server/project-mcp-servers.ts +82 -0
  97. package/server/project-module-freshness.ts +109 -0
  98. package/server/project-module-instance.ts +375 -0
  99. package/server/project-optimize-deps-entries.ts +827 -0
  100. package/server/project-output-writer.ts +679 -0
  101. package/server/project-package-origin.ts +63 -0
  102. package/server/project-root-surface.ts +831 -0
  103. package/server/project-scratch-path.ts +47 -0
  104. package/server/project-script-hmr.ts +619 -0
  105. package/server/project-serving-plugins.ts +236 -0
  106. package/server/project-tools.ts +653 -0
  107. package/server/project-validation.ts +250 -0
  108. package/server/project-verbs.ts +127 -0
  109. package/server/project-view.ts +52 -0
  110. package/server/project-watch.ts +1134 -0
  111. package/server/project-work-coordinator.ts +288 -0
  112. package/server/provider-credentials.ts +331 -0
  113. package/server/recent-projects-store.ts +98 -0
  114. package/server/redact-secrets.ts +71 -0
  115. package/server/repository-presence.ts +267 -0
  116. package/server/routes/account.ts +357 -0
  117. package/server/routes/agents.ts +60 -0
  118. package/server/routes/assets.ts +154 -0
  119. package/server/routes/build.ts +13 -0
  120. package/server/routes/collaboration.ts +595 -0
  121. package/server/routes/configurations.ts +419 -0
  122. package/server/routes/context.ts +264 -0
  123. package/server/routes/control-plane.ts +1811 -0
  124. package/server/routes/logs.ts +272 -0
  125. package/server/routes/project-identity.ts +302 -0
  126. package/server/routes/project-open.ts +429 -0
  127. package/server/routes/project-source.ts +686 -0
  128. package/server/routes/project-state.ts +383 -0
  129. package/server/routes/relay.ts +1029 -0
  130. package/server/routes/route-helpers.ts +29 -0
  131. package/server/routes/served-modules.ts +138 -0
  132. package/server/routes/session-tabs.ts +196 -0
  133. package/server/routes/settings.ts +121 -0
  134. package/server/routes/share-control.ts +486 -0
  135. package/server/routes/themes.ts +116 -0
  136. package/server/routes/tools.ts +230 -0
  137. package/server/routes/worktrees.ts +595 -0
  138. package/server/scoped-game-css.ts +461 -0
  139. package/server/server-utils.ts +1194 -0
  140. package/server/session-product.ts +112 -0
  141. package/server/session-registry.ts +230 -0
  142. package/server/share-claims.ts +138 -0
  143. package/server/share-host.ts +526 -0
  144. package/server/share-session-gateway.ts +1362 -0
  145. package/server/share-tunnel.ts +123 -0
  146. package/server/spawn-opener.ts +74 -0
  147. package/server/support/play/log-format.ts +76 -0
  148. package/server/support/play/session-record.ts +199 -0
  149. package/server/support/project/build-discipline.ts +718 -0
  150. package/server/support/project/inspection-node.ts +119 -0
  151. package/server/support/project/log-naming.ts +54 -0
  152. package/server/support/project/provenance.ts +290 -0
  153. package/server/support/project/run-name.ts +18 -0
  154. package/server/support/project/session-journal.ts +830 -0
  155. package/server/support/project/shared.ts +327 -0
  156. package/server/tab-bootstrap.ts +62 -0
  157. package/server/tab-heartbeat.ts +477 -0
  158. package/server/tab-lifecycle.ts +550 -0
  159. package/server/tab-presence.ts +1508 -0
  160. package/server/team-agent-mirror.ts +95 -0
  161. package/server/twin-auth.ts +138 -0
  162. package/server/vendored-lock-recorder.ts +968 -0
  163. package/server/worktree-identity.ts +121 -0
  164. package/server/worktree-management.ts +398 -0
  165. package/server/worktree-retention.d.mts +13 -0
  166. package/server/worktree-retention.mjs +205 -0
  167. package/src/EditorContext.tsx +169 -0
  168. package/src/account.ts +333 -0
  169. package/src/action-registry.ts +532 -0
  170. package/src/active-product.ts +74 -0
  171. package/src/active-project.ts +155 -0
  172. package/src/adapter-editor-config.ts +25 -0
  173. package/src/adapter-observation.ts +49 -0
  174. package/src/animation/stage-transport.ts +379 -0
  175. package/src/animation/three-clips-subject.ts +172 -0
  176. package/src/api/asset-library-wire.ts +45 -0
  177. package/src/api/assets.ts +365 -0
  178. package/src/api/base.ts +10 -0
  179. package/src/api/build.ts +99 -0
  180. package/src/api/git-wire.ts +56 -0
  181. package/src/api/logs.ts +92 -0
  182. package/src/api/project-identity.ts +74 -0
  183. package/src/api/project-open.ts +355 -0
  184. package/src/api/project-source.ts +162 -0
  185. package/src/api/project-state.ts +107 -0
  186. package/src/api/relay.ts +268 -0
  187. package/src/api/settings.ts +36 -0
  188. package/src/api/themes.ts +45 -0
  189. package/src/api/worktrees.ts +257 -0
  190. package/src/asset-compare-core.ts +171 -0
  191. package/src/asset-compare.ts +294 -0
  192. package/src/asset-editor-context.tsx +100 -0
  193. package/src/asset-events.ts +97 -0
  194. package/src/asset-inspector-actions.ts +87 -0
  195. package/src/asset-preview-framing.ts +357 -0
  196. package/src/asset-preview.ts +2802 -0
  197. package/src/asset-selection-viewer-registry.ts +113 -0
  198. package/src/asset-selection.ts +133 -0
  199. package/src/asset-workflow/asset-capabilities.ts +344 -0
  200. package/src/asset-workflow/asset-import-jobs.ts +106 -0
  201. package/src/asset-workflow/asset-ledger-backend.ts +126 -0
  202. package/src/asset-workflow/asset-ledger.ts +156 -0
  203. package/src/asset-workflow/asset-materialization-report.ts +140 -0
  204. package/src/asset-workflow/asset-pack-manifest.ts +320 -0
  205. package/src/asset-workflow/asset-types.ts +142 -0
  206. package/src/asset-workflow/asset-workflow-quality.ts +61 -0
  207. package/src/asset-workflow/audio-preview-player.ts +193 -0
  208. package/src/asset-workflow/audio-waveform.ts +22 -0
  209. package/src/asset-workflow/cloud-asset-client.ts +263 -0
  210. package/src/asset-workflow/folder-preview.ts +345 -0
  211. package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
  212. package/src/asset-workflow/image-view-scale.ts +32 -0
  213. package/src/asset-workflow/import-contract.ts +124 -0
  214. package/src/asset-workflow/ledger-write-lock.ts +244 -0
  215. package/src/asset-workflow/model-inspection.ts +818 -0
  216. package/src/asset-workflow/pixi-spritesheet.ts +197 -0
  217. package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
  218. package/src/asset-workflow/project-asset-commands.ts +23 -0
  219. package/src/asset-workflow/project-asset-health.ts +139 -0
  220. package/src/asset-workflow/project-asset-operations.ts +154 -0
  221. package/src/asset-workflow/project-asset-roots.ts +68 -0
  222. package/src/asset-workflow/project-content.ts +288 -0
  223. package/src/asset-workflow/project-source-index.ts +550 -0
  224. package/src/asset-workflow/thumbnail-system.ts +256 -0
  225. package/src/authoring/active-adapter.ts +199 -0
  226. package/src/authoring/active-systems.ts +422 -0
  227. package/src/authoring/adapter-key.ts +18 -0
  228. package/src/authoring/authoring-asset-url.ts +27 -0
  229. package/src/authoring/bootstrap-state.ts +49 -0
  230. package/src/authoring/boundary-authoring-adapter.ts +184 -0
  231. package/src/authoring/breakpoint-state.ts +43 -0
  232. package/src/authoring/canvas-scene-guides.ts +76 -0
  233. package/src/authoring/component-instance-root.ts +171 -0
  234. package/src/authoring/composite-authoring-adapter.ts +2110 -0
  235. package/src/authoring/consumer-actions.ts +520 -0
  236. package/src/authoring/css-numeric-style.ts +97 -0
  237. package/src/authoring/design-time-layers.ts +849 -0
  238. package/src/authoring/design-time-mount-registry.ts +235 -0
  239. package/src/authoring/design-time-settle.ts +343 -0
  240. package/src/authoring/edit-mode-authoring.ts +619 -0
  241. package/src/authoring/eyedropper-session.ts +60 -0
  242. package/src/authoring/instance-source-menu-register.ts +13 -0
  243. package/src/authoring/instance-source-menu.ts +135 -0
  244. package/src/authoring/layered-pick.ts +183 -0
  245. package/src/authoring/live-gesture-lock.ts +50 -0
  246. package/src/authoring/live-object-transform.ts +62 -0
  247. package/src/authoring/mount-failure-report.ts +154 -0
  248. package/src/authoring/mounted-root-subjects.ts +144 -0
  249. package/src/authoring/no-authoring-adapter.ts +55 -0
  250. package/src/authoring/null-inspection-subjects.tsx +75 -0
  251. package/src/authoring/object3d-document-persistence.ts +106 -0
  252. package/src/authoring/object3d-document-session-registry.ts +120 -0
  253. package/src/authoring/object3d-document-session.ts +1326 -0
  254. package/src/authoring/object3d-gesture-controller.ts +113 -0
  255. package/src/authoring/panel-authoring.ts +121 -0
  256. package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
  257. package/src/authoring/prefab-instance-section-model.ts +55 -0
  258. package/src/authoring/project-authoring-session.ts +105 -0
  259. package/src/authoring/provenance.ts +99 -0
  260. package/src/authoring/quarks-particle-systems.ts +19 -0
  261. package/src/authoring/react-canvas-navigation.ts +255 -0
  262. package/src/authoring/react-design-canvas-style.ts +20 -0
  263. package/src/authoring/react-story-board.ts +937 -0
  264. package/src/authoring/selection-scope.ts +195 -0
  265. package/src/authoring/shell-document-ops.ts +169 -0
  266. package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
  267. package/src/authoring/shell-viewport-policy.ts +48 -0
  268. package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
  269. package/src/authoring/stories-scope.ts +35 -0
  270. package/src/authoring/story-board-chrome-fit.ts +107 -0
  271. package/src/authoring/story-board-presentation.ts +111 -0
  272. package/src/authoring/three-projection-core.ts +226 -0
  273. package/src/authoring/viewport-pick-context.ts +40 -0
  274. package/src/authoring/viewport-raycast.ts +240 -0
  275. package/src/authoring/viewport-tool-context.ts +73 -0
  276. package/src/authoring/world-canvas-viewport-state.ts +35 -0
  277. package/src/authoring/world-hidden-viewport.ts +152 -0
  278. package/src/authoring/world-pan-state.ts +198 -0
  279. package/src/authoring/world-session-state.ts +101 -0
  280. package/src/authoring/write-pipe.ts +173 -0
  281. package/src/availability-tick.ts +66 -0
  282. package/src/bitmap-label.ts +120 -0
  283. package/src/blender-tab-metrics.ts +161 -0
  284. package/src/board-open-actions.ts +20 -0
  285. package/src/boot-routing.ts +391 -0
  286. package/src/build-identity.ts +15 -0
  287. package/src/bytes-codec.ts +62 -0
  288. package/src/camera-authoring.ts +175 -0
  289. package/src/cancellation-reason.ts +58 -0
  290. package/src/canvas-preview-frames.ts +482 -0
  291. package/src/capture-camera-pose.ts +77 -0
  292. package/src/chrome-registry.ts +159 -0
  293. package/src/chrome-slot-registry.ts +91 -0
  294. package/src/collaboration-client.ts +264 -0
  295. package/src/collaboration-presence.ts +41 -0
  296. package/src/command-dispatch.ts +19 -0
  297. package/src/command-listener.ts +2743 -0
  298. package/src/command-registry.ts +70 -0
  299. package/src/component-board-registry.ts +205 -0
  300. package/src/component-states-registry.ts +200 -0
  301. package/src/components/AgentPresentationNotice.tsx +75 -0
  302. package/src/components/AlignToolbar.tsx +204 -0
  303. package/src/components/AppRoot.tsx +394 -0
  304. package/src/components/ApplicationMenus.tsx +415 -0
  305. package/src/components/AssetBrowser.tsx +2843 -0
  306. package/src/components/AssetEditorShell.tsx +216 -0
  307. package/src/components/AssetInspectorToolSection.tsx +124 -0
  308. package/src/components/BoardRulers.tsx +354 -0
  309. package/src/components/CameraInfo.tsx +81 -0
  310. package/src/components/CanvasSceneViewport.tsx +556 -0
  311. package/src/components/CapabilityCoverageSection.tsx +185 -0
  312. package/src/components/CenterDocuments.tsx +22 -0
  313. package/src/components/ChromeSlot.tsx +20 -0
  314. package/src/components/CodeView.tsx +470 -0
  315. package/src/components/CollaborationHeaderControl.css +74 -0
  316. package/src/components/CompactInspectorCard.tsx +190 -0
  317. package/src/components/CompactInspectorShell.tsx +39 -0
  318. package/src/components/ConsolePanel.css +55 -0
  319. package/src/components/ConsolePanel.tsx +270 -0
  320. package/src/components/DefaultEditorLayout.tsx +106 -0
  321. package/src/components/DocumentHeaderStrip.tsx +96 -0
  322. package/src/components/DocumentShelfRail.tsx +45 -0
  323. package/src/components/DocumentThumbnail.tsx +345 -0
  324. package/src/components/EditorLeaseGuard.tsx +372 -0
  325. package/src/components/ErrorBanner.tsx +123 -0
  326. package/src/components/FolderPreviewTile.tsx +159 -0
  327. package/src/components/GameHierarchy.tsx +3842 -0
  328. package/src/components/GameplaySessionTimeline.tsx +295 -0
  329. package/src/components/InspectionProjection.tsx +968 -0
  330. package/src/components/Inspector.tsx +233 -0
  331. package/src/components/InspectorCanvasPreview.tsx +35 -0
  332. package/src/components/InspectorFieldsSection.tsx +290 -0
  333. package/src/components/InspectorObjectPreview.tsx +57 -0
  334. package/src/components/InspectorStoriesSection.tsx +92 -0
  335. package/src/components/InspectorToolSection.tsx +96 -0
  336. package/src/components/InspectorTransformSection.tsx +245 -0
  337. package/src/components/LightExplorerPanel.tsx +433 -0
  338. package/src/components/MediaProperties.tsx +145 -0
  339. package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
  340. package/src/components/Object3DDocumentToolbar.css +100 -0
  341. package/src/components/Object3DDocumentToolbar.tsx +454 -0
  342. package/src/components/Object3DDocumentViewport.tsx +58 -0
  343. package/src/components/ProjectHeader.css +617 -0
  344. package/src/components/ProjectHeader.tsx +328 -0
  345. package/src/components/ProjectLayout.tsx +249 -0
  346. package/src/components/ReactCanvasControls.tsx +284 -0
  347. package/src/components/RootSelectionOverlay.tsx +3162 -0
  348. package/src/components/RootTextEditor.tsx +79 -0
  349. package/src/components/SaveStatus.tsx +70 -0
  350. package/src/components/StageHost.tsx +1954 -0
  351. package/src/components/StageOverlays.tsx +21 -0
  352. package/src/components/StartupErrorScreen.tsx +76 -0
  353. package/src/components/StartupLoadingScreen.tsx +65 -0
  354. package/src/components/StatsOverlay.tsx +78 -0
  355. package/src/components/SurfaceStateOverlay.tsx +24 -0
  356. package/src/components/ToolContributionSurfaces.tsx +65 -0
  357. package/src/components/ToolHost.tsx +370 -0
  358. package/src/components/ToolObject3DPreview.tsx +39 -0
  359. package/src/components/Toolbar.tsx +595 -0
  360. package/src/components/TransientHint.tsx +44 -0
  361. package/src/components/TransportStrip.tsx +174 -0
  362. package/src/components/VersionControlSection.tsx +470 -0
  363. package/src/components/VgaiLogo.css +83 -0
  364. package/src/components/VgaiLogo.tsx +35 -0
  365. package/src/components/ViewportControlsHint.tsx +60 -0
  366. package/src/components/ViewportFurniture.tsx +401 -0
  367. package/src/components/ViewportOverlay.tsx +145 -0
  368. package/src/components/ViewportOverlaysMenu.tsx +153 -0
  369. package/src/components/ViewportShadingMenu.tsx +300 -0
  370. package/src/components/ViewportViewMenu.tsx +101 -0
  371. package/src/components/WorkspaceDocumentSurface.tsx +204 -0
  372. package/src/components/WorkspaceUtilitySurface.tsx +22 -0
  373. package/src/components/WorktreeSwitcher.css +239 -0
  374. package/src/components/WorktreeSwitcher.tsx +890 -0
  375. package/src/components/account-documents.tsx +1162 -0
  376. package/src/components/asset-documents.tsx +812 -0
  377. package/src/components/asset-editor-persistence.ts +216 -0
  378. package/src/components/asset-selection-section.tsx +535 -0
  379. package/src/components/asset-thumbnails.tsx +312 -0
  380. package/src/components/asset-viewers/AudioViewer.tsx +201 -0
  381. package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
  382. package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
  383. package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  384. package/src/components/asset-viewers/ImageViewer.tsx +300 -0
  385. package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
  386. package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
  387. package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
  388. package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
  389. package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
  390. package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
  391. package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
  392. package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
  393. package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
  394. package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
  395. package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  396. package/src/components/asset-viewers/VideoViewer.tsx +101 -0
  397. package/src/components/asset-viewers/shader-source.ts +144 -0
  398. package/src/components/asset-workflow.css +731 -0
  399. package/src/components/board-guides.ts +150 -0
  400. package/src/components/compact-inspector.css +539 -0
  401. package/src/components/core-utilities.tsx +90 -0
  402. package/src/components/editor-notifications.css +40 -0
  403. package/src/components/engine-workspace.css +274 -0
  404. package/src/components/inspector-preview-section.tsx +238 -0
  405. package/src/components/inspector-property-grouping.ts +64 -0
  406. package/src/components/inspector-revert-label.ts +20 -0
  407. package/src/components/inspector-selection.ts +42 -0
  408. package/src/components/inspector-stories-gating.ts +171 -0
  409. package/src/components/inspector-transform-subject.ts +11 -0
  410. package/src/components/inspector-transform.ts +75 -0
  411. package/src/components/kind-documents.tsx +500 -0
  412. package/src/components/palette-action-publisher.tsx +140 -0
  413. package/src/components/primitives/DraftColorInput.tsx +74 -0
  414. package/src/components/product-shell.css +1829 -0
  415. package/src/components/project-tool-documents.tsx +410 -0
  416. package/src/components/scene-documents.tsx +223 -0
  417. package/src/components/stage-keyboard.tsx +37 -0
  418. package/src/components/stage-overlay-set.tsx +107 -0
  419. package/src/components/stage-presence-markers.ts +478 -0
  420. package/src/components/standard-viewport-dressing.ts +417 -0
  421. package/src/components/status-contributions.tsx +403 -0
  422. package/src/components/tool-documents.tsx +309 -0
  423. package/src/components/tool-schema-form.tsx +262 -0
  424. package/src/components/use-after-paint.ts +41 -0
  425. package/src/components/use-project-image-assets.ts +86 -0
  426. package/src/components/viewport-header-controls.css +90 -0
  427. package/src/components/viewport-surface-status.tsx +55 -0
  428. package/src/components/workspace-history.ts +32 -0
  429. package/src/components/workspace-static-panel-registry.tsx +152 -0
  430. package/src/components/workspace-surfaces.css +621 -0
  431. package/src/components/world-documents.tsx +586 -0
  432. package/src/components/world-overlay-gestures.ts +1694 -0
  433. package/src/composite-screenshot.ts +1641 -0
  434. package/src/console-sync.ts +131 -0
  435. package/src/constraint-helper.ts +338 -0
  436. package/src/content-entry-source-registry.ts +184 -0
  437. package/src/coverage/authoring-seam-evidence.ts +300 -0
  438. package/src/coverage/canvas-reveal.ts +192 -0
  439. package/src/coverage/design-time-surfaces.ts +101 -0
  440. package/src/coverage/live-seam-evidence.ts +11 -0
  441. package/src/coverage/ontology-invariants.ts +466 -0
  442. package/src/coverage/session-vitals.ts +501 -0
  443. package/src/coverage/system-seam-evidence.ts +72 -0
  444. package/src/crash-null-boundary.ts +36 -0
  445. package/src/creation-site-edit.ts +1479 -0
  446. package/src/creation-site-registry.ts +160 -0
  447. package/src/delegate-harness-registry.ts +143 -0
  448. package/src/document-context-registry.ts +177 -0
  449. package/src/document-open-registry.ts +200 -0
  450. package/src/document-preview-source.ts +20 -0
  451. package/src/document-renderer-session.ts +138 -0
  452. package/src/editor-api.ts +46 -0
  453. package/src/editor-chrome-capture.ts +139 -0
  454. package/src/editor-commands.ts +164 -0
  455. package/src/editor-console.ts +563 -0
  456. package/src/editor-current-view.ts +82 -0
  457. package/src/editor-document-probe.ts +881 -0
  458. package/src/editor-git-client.ts +115 -0
  459. package/src/editor-host-door.ts +462 -0
  460. package/src/editor-hotkeys.ts +842 -0
  461. package/src/editor-lease-view.ts +39 -0
  462. package/src/editor-lease.ts +415 -0
  463. package/src/editor-mode.ts +19 -0
  464. package/src/editor-notifications.ts +140 -0
  465. package/src/editor-presence.ts +563 -0
  466. package/src/editor-presentation-activity.ts +50 -0
  467. package/src/editor-presentation-notice.ts +42 -0
  468. package/src/editor-runtime.tsx +145 -0
  469. package/src/editor-server-response.ts +86 -0
  470. package/src/editor-session-attribution.ts +75 -0
  471. package/src/editor-session-mode.ts +54 -0
  472. package/src/editor-shell-store.ts +1304 -0
  473. package/src/editor-state-facets.ts +74 -0
  474. package/src/editor-styles.css +33 -0
  475. package/src/editor-view-presentation.ts +810 -0
  476. package/src/editor-viewport.ts +5302 -0
  477. package/src/entity-lod.ts +31 -0
  478. package/src/entity-object.ts +91 -0
  479. package/src/files/file-provider.ts +62 -0
  480. package/src/files/project-files.ts +264 -0
  481. package/src/finders/index.ts +136 -0
  482. package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
  483. package/src/frame/bridge.tsx +1408 -0
  484. package/src/frame/product.ts +77 -0
  485. package/src/gameplay-dom-recording.ts +319 -0
  486. package/src/gameplay-export-state.ts +14 -0
  487. package/src/gameplay-replay.ts +417 -0
  488. package/src/gameplay-session-time.ts +9 -0
  489. package/src/gameplay-sessions.ts +204 -0
  490. package/src/harness-chat-types.ts +253 -0
  491. package/src/hierarchy-component-marks.ts +298 -0
  492. package/src/hierarchy-drop.ts +91 -0
  493. package/src/hierarchy-expansion-state.ts +80 -0
  494. package/src/hierarchy-header-slot.ts +52 -0
  495. package/src/hierarchy-internals.ts +197 -0
  496. package/src/hierarchy-kind-icon.ts +217 -0
  497. package/src/hierarchy-mark-reader.ts +73 -0
  498. package/src/hierarchy-menu-registry.ts +67 -0
  499. package/src/hierarchy-node-rows.ts +307 -0
  500. package/src/hierarchy-panel-view.ts +280 -0
  501. package/src/hierarchy-projection.ts +76 -0
  502. package/src/hierarchy-row-cache.ts +243 -0
  503. package/src/hierarchy-row-model.ts +308 -0
  504. package/src/hierarchy-rows.ts +11 -0
  505. package/src/hierarchy-walk.ts +86 -0
  506. package/src/history/editor-session.ts +25 -0
  507. package/src/history/history-commands.ts +147 -0
  508. package/src/history/history-delegate.ts +163 -0
  509. package/src/history/history-limit-notices.ts +43 -0
  510. package/src/history/history-service.ts +1173 -0
  511. package/src/history/persistence-coordinator.ts +35 -0
  512. package/src/history/project-file-history.ts +386 -0
  513. package/src/history/project-root-history-backends.ts +139 -0
  514. package/src/history/resource-registry.ts +209 -0
  515. package/src/history/snapshot-store.ts +103 -0
  516. package/src/history/source-history-backend.ts +546 -0
  517. package/src/history/types.ts +124 -0
  518. package/src/hmr-registration-group.ts +67 -0
  519. package/src/hmr-stable-react-context.ts +23 -0
  520. package/src/hotkeys.ts +188 -0
  521. package/src/inference-diagnostics.ts +69 -0
  522. package/src/initial-project.ts +80 -0
  523. package/src/inspection/active-subject.ts +578 -0
  524. package/src/inspection/active-surface.ts +142 -0
  525. package/src/inspection/compose.ts +1064 -0
  526. package/src/inspection/display.ts +170 -0
  527. package/src/inspection/document-subject.ts +109 -0
  528. package/src/inspection/game-subject.ts +85 -0
  529. package/src/inspection/model.ts +542 -0
  530. package/src/inspection/null-subject.ts +115 -0
  531. package/src/inspection/serialize.ts +357 -0
  532. package/src/inspection/use-active-inspection.ts +180 -0
  533. package/src/inspector-presentation.ts +201 -0
  534. package/src/inspector-section-registry.ts +221 -0
  535. package/src/instance-source-actions.ts +163 -0
  536. package/src/instanced-presentation.ts +164 -0
  537. package/src/js-heap.ts +71 -0
  538. package/src/key-actions.ts +91 -0
  539. package/src/keymap-presets.ts +401 -0
  540. package/src/layout-policy.ts +31 -0
  541. package/src/learn-links.ts +73 -0
  542. package/src/light-explorer-model.ts +134 -0
  543. package/src/live-canvas-frame.ts +55 -0
  544. package/src/live-document.ts +279 -0
  545. package/src/live-module-source.ts +230 -0
  546. package/src/live-session-registry.ts +220 -0
  547. package/src/live-transition.ts +633 -0
  548. package/src/manifest-project.ts +107 -0
  549. package/src/model-thumbnail.ts +523 -0
  550. package/src/native-selection-style.ts +202 -0
  551. package/src/object3d-document-write-policy.ts +137 -0
  552. package/src/packaged-runtime.ts +108 -0
  553. package/src/palettes/maya.palette.json +57 -0
  554. package/src/palettes/substance.palette.json +57 -0
  555. package/src/pasteboard-module.ts +81 -0
  556. package/src/performance-profiler.ts +367 -0
  557. package/src/performance-sources.ts +69 -0
  558. package/src/play-boot-phase.ts +145 -0
  559. package/src/presentation-surface.ts +248 -0
  560. package/src/project-adapter.ts +1143 -0
  561. package/src/project-asset-refresh.ts +26 -0
  562. package/src/project-declaration-refresh.ts +31 -0
  563. package/src/project-local-state.ts +118 -0
  564. package/src/project-manager.ts +243 -0
  565. package/src/project-module-changes.ts +163 -0
  566. package/src/project-module-split.ts +266 -0
  567. package/src/project-provenance.ts +115 -0
  568. package/src/project-ready.ts +42 -0
  569. package/src/project-session-reset.ts +67 -0
  570. package/src/project-shape.ts +68 -0
  571. package/src/project-tool-discovery.ts +66 -0
  572. package/src/project-tools.ts +107 -0
  573. package/src/project-work-types.ts +149 -0
  574. package/src/projection/three.ts +898 -0
  575. package/src/projection/types.ts +44 -0
  576. package/src/readiness.ts +113 -0
  577. package/src/reflection-probe-helper.ts +142 -0
  578. package/src/reported-play-state.ts +90 -0
  579. package/src/resolve-relative-specifier.ts +33 -0
  580. package/src/scene-document-plan.ts +315 -0
  581. package/src/scene-framing.ts +315 -0
  582. package/src/scene-live-open.ts +210 -0
  583. package/src/scene-view-fog.ts +89 -0
  584. package/src/scoped-game-css.ts +152 -0
  585. package/src/session-orphan-record.ts +193 -0
  586. package/src/session-tombstone.ts +126 -0
  587. package/src/settings/settings-provider.ts +82 -0
  588. package/src/settings-store.ts +345 -0
  589. package/src/shared-view-restore.ts +42 -0
  590. package/src/shell-store-door.ts +45 -0
  591. package/src/source-conflict.ts +122 -0
  592. package/src/spatial-handle-visuals.ts +332 -0
  593. package/src/stage-context.ts +341 -0
  594. package/src/stage-store-registry.ts +63 -0
  595. package/src/stale-chunk-recovery.ts +34 -0
  596. package/src/state-report-deferral.ts +73 -0
  597. package/src/storage/host-files-storage.ts +97 -0
  598. package/src/storage/http-storage.ts +174 -0
  599. package/src/storage/index.ts +75 -0
  600. package/src/storage/mem-storage.ts +149 -0
  601. package/src/storage/path-lock.ts +44 -0
  602. package/src/storage/paths.ts +26 -0
  603. package/src/storage/types.ts +116 -0
  604. package/src/stories/StoryComponentThumbnail.tsx +184 -0
  605. package/src/stories/StoryPreviewMount.tsx +306 -0
  606. package/src/stories/component-content-source.tsx +106 -0
  607. package/src/stories/component-states-source.ts +78 -0
  608. package/src/stories/compose-project-stories.ts +255 -0
  609. package/src/stories/pixi-story-model.ts +30 -0
  610. package/src/stories/prefabs-finder.ts +54 -0
  611. package/src/stories/prefabs-from-stories.ts +182 -0
  612. package/src/stories/project-story-discovery.ts +78 -0
  613. package/src/stories/project-story-regions.ts +24 -0
  614. package/src/stories/story-actions.ts +54 -0
  615. package/src/stories/story-capture-command.ts +124 -0
  616. package/src/stories/story-capture.ts +584 -0
  617. package/src/stories/story-declared-medium.ts +126 -0
  618. package/src/stories/story-discovery.ts +176 -0
  619. package/src/stories/story-document-openers.ts +36 -0
  620. package/src/stories/story-dom-runtime.ts +78 -0
  621. package/src/stories/story-grouping.ts +111 -0
  622. package/src/stories/story-lane.ts +88 -0
  623. package/src/stories/story-mount-turn.ts +27 -0
  624. package/src/stories/story-opener.ts +260 -0
  625. package/src/stories/story-pixi-preview.ts +408 -0
  626. package/src/stories/story-presentation.ts +215 -0
  627. package/src/stories/story-registry.ts +517 -0
  628. package/src/stories/story-three-preview.ts +807 -0
  629. package/src/stories/three-story-model.ts +96 -0
  630. package/src/story-three-preview-runtime.ts +56 -0
  631. package/src/surface-keyboard.ts +112 -0
  632. package/src/surface-state.ts +124 -0
  633. package/src/tab-bootstrap.js +628 -0
  634. package/src/tab-census.ts +198 -0
  635. package/src/tab-lifecycle-client.ts +196 -0
  636. package/src/theme-library.ts +844 -0
  637. package/src/theme-preference.ts +378 -0
  638. package/src/theme.css +3437 -0
  639. package/src/three-viewport/bone-selection-highlight.ts +119 -0
  640. package/src/three-viewport/camera-fit.ts +41 -0
  641. package/src/three-viewport/interactive-renderer.ts +132 -0
  642. package/src/three-viewport/selection-brackets.ts +310 -0
  643. package/src/three-viewport/selection-outline.ts +183 -0
  644. package/src/three-viewport/skeleton-helper.ts +61 -0
  645. package/src/three-viewport/source-color.ts +167 -0
  646. package/src/three-viewport/studio-environment.ts +96 -0
  647. package/src/three-viewport-presentation.ts +23 -0
  648. package/src/tool-contribution-play.ts +74 -0
  649. package/src/tool-loader.ts +1798 -0
  650. package/src/transform-mode-request.ts +57 -0
  651. package/src/transient-hint.ts +78 -0
  652. package/src/trigger-volume-helper.ts +116 -0
  653. package/src/ui-source/adapter-region-includes.ts +241 -0
  654. package/src/ui-source/ensure-import.ts +132 -0
  655. package/src/ui-source/file-region-resolver.ts +302 -0
  656. package/src/ui-source/inspect.ts +775 -0
  657. package/src/ui-source/oid-transform.ts +1845 -0
  658. package/src/ui-source/plan-csf-story.ts +196 -0
  659. package/src/ui-source/plan-extract-component.ts +421 -0
  660. package/src/ui-source/plan-fork-component.ts +621 -0
  661. package/src/ui-source/plan-named-style.ts +95 -0
  662. package/src/ui-source/plan-source-edit.ts +353 -0
  663. package/src/ui-source/r3f-contract-resolver.ts +327 -0
  664. package/src/ui-source/r3f-diagnostic-index.ts +165 -0
  665. package/src/ui-source/r3f-environment-binding.ts +133 -0
  666. package/src/ui-source/r3f-joint-binding.ts +251 -0
  667. package/src/ui-source/r3f-lod-binding.ts +91 -0
  668. package/src/ui-source/r3f-particle-binding.ts +235 -0
  669. package/src/ui-source/r3f-physics-binding.ts +483 -0
  670. package/src/ui-source/r3f-project-contracts.ts +444 -0
  671. package/src/ui-source/relative-import-specifier.ts +34 -0
  672. package/src/ui-source/reparent-guard.ts +544 -0
  673. package/src/ui-source/source-edit-request.ts +97 -0
  674. package/src/ui-source/source-write-backend.ts +618 -0
  675. package/src/ui-source/syntactic-prop-specs.ts +296 -0
  676. package/src/ui-source/tier-source-write-backend.ts +279 -0
  677. package/src/ui-source/ts-ast.ts +171 -0
  678. package/src/ui-source/utility-class-support.ts +169 -0
  679. package/src/ui-source/write-component-default.ts +133 -0
  680. package/src/ui-source/writer.ts +1989 -0
  681. package/src/viewport-activation-timings.ts +840 -0
  682. package/src/viewport-authoring-policy.ts +186 -0
  683. package/src/viewport-controls-hint.ts +57 -0
  684. package/src/viewport-door.ts +237 -0
  685. package/src/viewport-shading-boundary.ts +12 -0
  686. package/src/vite-error-surface.ts +141 -0
  687. package/src/wait-until.ts +37 -0
  688. package/src/workspace-areas.ts +156 -0
  689. package/src/workspace-aux-commands.ts +11 -0
  690. package/src/workspace-available-documents.ts +127 -0
  691. package/src/workspace-core-utilities.ts +31 -0
  692. package/src/workspace-document-ids.ts +59 -0
  693. package/src/workspace-document-registry.ts +612 -0
  694. package/src/workspace-document-restore.ts +145 -0
  695. package/src/workspace-host-commands.ts +141 -0
  696. package/src/workspace-persistence-gate.ts +40 -0
  697. package/src/workspace-play-utilities.ts +44 -0
  698. package/src/workspace-presets.ts +425 -0
  699. package/src/workspace-regions.ts +294 -0
  700. package/src/workspace-state-persistence.ts +536 -0
  701. package/src/workspace-static-panels.ts +73 -0
  702. package/src/workspace-status-registry.ts +121 -0
  703. package/src/workspace-style.ts +239 -0
  704. package/src/workspace-utility-commands.ts +74 -0
  705. package/src/workspace-utility-registry.ts +263 -0
  706. package/src/workspace-viewport-rect.ts +97 -0
  707. package/src/world-adoption.ts +115 -0
  708. package/src/world-document-routing.ts +104 -0
  709. package/vite-plugin-creation-site-write.ts +184 -0
  710. package/vite-plugin-creation-site.ts +80 -0
  711. package/vite-plugin-game-static.ts +303 -0
  712. package/vite-plugin-module-doorways.ts +336 -0
  713. package/vite-plugin-product-contributions.ts +197 -0
  714. package/vite-plugin-project-game-static.ts +125 -0
  715. package/vite-plugin-project-jsx-js.ts +65 -0
  716. package/vite-plugin-project-root-absolute-assets.ts +359 -0
  717. package/vite-plugin-shared-react.ts +420 -0
  718. package/vite-plugin-shared-three.ts +203 -0
  719. package/vite-plugin-ui-oid.ts +2106 -0
@@ -0,0 +1,210 @@
1
+ /**
2
+ * WHERE A PROJECT'S MODULES REALLY LIVE ON DISK — the directory set a
3
+ * project-rooted Vite instance must be allowed to serve from
4
+ * (`server.fs.allow`).
5
+ *
6
+ * ## The measured defect
7
+ *
8
+ * `packaged.ts` used to allow exactly three paths: the project directory, the
9
+ * realpath of `<project>/node_modules` *when that directory exists*, and the
10
+ * editor package root. That set is correct for one shape of install — a
11
+ * standalone scaffold with its own flat `node_modules` — and wrong for every
12
+ * other shape a real project takes:
13
+ *
14
+ * - an npm WORKSPACE MEMBER (every `examples/<id>`, and any user monorepo
15
+ * game) has no `node_modules` of its own at all; npm hoists the install to
16
+ * the workspace root ABOVE the project folder;
17
+ * - a workspace member's own sibling packages resolve through SYMLINKS that
18
+ * land outside the project entirely (`@vgai/game-runtime` → `<repo>/packages/
19
+ * engine`), and Vite's `fs.allow` matches the symlink-RESOLVED path;
20
+ * - a git worktree shares one install, so even the walk-up `node_modules`
21
+ * can be a tree of links into another checkout.
22
+ *
23
+ * Measured live before this module existed, packaged editor + `examples/
24
+ * retro-shooter`: `/@fs/<repo>/packages/project/src/adapter/index.ts` → HTTP
25
+ * 403, i.e. the world's own engine imports were unreachable; and
26
+ * `react-data-grid/lib/styles.css?inline` (the data-tables document's grid
27
+ * stylesheet) came back `200 text/css` — RAW CSS where the importer expects a
28
+ * JS module — because with the file outside `fs.allow` the transform never ran
29
+ * and a raw-file route answered instead, which is what the browser reports as
30
+ * "Failed to fetch dynamically imported module".
31
+ *
32
+ * ## What this computes instead
33
+ *
34
+ * The same directories NODE would resolve from, asked the same way Node asks:
35
+ *
36
+ * 1. every `node_modules` directory on the walk UP from the project (this is
37
+ * literally Node's module lookup path), realpath'd, existing ones only; and
38
+ * 2. for each dependency the project's own `package.json` DECLARES, the real
39
+ * install root that dependency actually resolves to — the enclosing
40
+ * `node_modules` directory when it is a normal install (covering hoisting,
41
+ * symlinked worktree trees and pnpm's nested store), or the package's own
42
+ * real directory when it is a linked workspace sibling that lives outside
43
+ * any `node_modules` at all.
44
+ *
45
+ * Resolution is Node's (`createRequire` rooted at the project), never a
46
+ * hand-rolled path guess, so a shape this comment did not anticipate is still
47
+ * answered correctly. Entries contained in another entry are dropped, so the
48
+ * result is the smallest set that covers the project's real module graph — it
49
+ * never widens to "allow the whole filesystem" and never allows a directory no
50
+ * declared dependency resolves into.
51
+ */
52
+
53
+ import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
54
+ import { createRequire } from 'node:module';
55
+ import path from 'node:path';
56
+ import { searchForWorkspaceRoot } from 'vite';
57
+ import { isPathInside } from './server-utils';
58
+
59
+ /** Dependency fields whose entries a project's module graph can reach at
60
+ * serve time. `devDependencies` counts: the editor serves stories, tools and
61
+ * capability source, which import dev-only packages by design. */
62
+ const DEPENDENCY_FIELDS = [
63
+ 'dependencies',
64
+ 'devDependencies',
65
+ 'optionalDependencies',
66
+ 'peerDependencies',
67
+ ] as const;
68
+
69
+ function realDirectory(candidate: string): string | null {
70
+ try {
71
+ const real = realpathSync(candidate);
72
+ return statSync(real).isDirectory() ? real : null;
73
+ } catch {
74
+ return null;
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Every `node_modules` directory Node would consult on the walk up from `dir`
80
+ * — BOUNDED by the enclosing workspace root.
81
+ *
82
+ * The bound is Vite's own `searchForWorkspaceRoot` (lockfile / `workspaces`
83
+ * field / `.git`), which is exactly what Vite uses to compute its DEFAULT
84
+ * `fs.allow`, so this half of the set is no wider than the default a
85
+ * project-rooted Vite would have chosen for itself. Unbounded, the walk keeps
86
+ * climbing past the repository into `~/node_modules` and `/node_modules` —
87
+ * directories no project's resolution meaningfully depends on and which have
88
+ * no business in a serving allowlist. A dependency that genuinely does resolve
89
+ * from above the workspace root is still covered, one package at a time, by
90
+ * {@link packageServingRoot}.
91
+ */
92
+ function walkUpNodeModules(dir: string): string[] {
93
+ const found: string[] = [];
94
+ const bound = path.resolve(searchForWorkspaceRoot(dir));
95
+ let current = path.resolve(dir);
96
+ for (;;) {
97
+ if (path.basename(current) !== 'node_modules') {
98
+ const real = realDirectory(path.join(current, 'node_modules'));
99
+ if (real) found.push(real);
100
+ }
101
+ const parent = path.dirname(current);
102
+ if (current === bound || parent === current) return found;
103
+ current = parent;
104
+ }
105
+ }
106
+
107
+ /** The declared dependency names of the project at `projectDir`, or `[]` when
108
+ * it has no readable `package.json` (a project that has not been installed
109
+ * yet still serves its own source; the walk-up set covers what exists). */
110
+ function declaredDependencies(projectDir: string): string[] {
111
+ let manifest: Record<string, unknown>;
112
+ try {
113
+ manifest = JSON.parse(readFileSync(path.join(projectDir, 'package.json'), 'utf-8')) as Record<
114
+ string,
115
+ unknown
116
+ >;
117
+ } catch {
118
+ return [];
119
+ }
120
+ const names = new Set<string>();
121
+ for (const field of DEPENDENCY_FIELDS) {
122
+ const value = manifest[field];
123
+ if (value && typeof value === 'object') {
124
+ for (const name of Object.keys(value)) names.add(name);
125
+ }
126
+ }
127
+ return [...names];
128
+ }
129
+
130
+ /**
131
+ * The real directory serving `packageName` for a project rooted at
132
+ * `projectDir`, or `null` when it does not resolve.
133
+ *
134
+ * For an ordinary install this is the ENCLOSING `node_modules` directory (so
135
+ * one entry covers every package installed beside it, including the ones the
136
+ * project only reaches transitively). For a linked workspace sibling — whose
137
+ * real path contains no `node_modules` segment — it is that package's own
138
+ * directory, which is as tight as the allow entry can honestly be.
139
+ */
140
+ export function packageServingRoot(projectDir: string, packageName: string): string | null {
141
+ // Rooted at the project's own `package.json`, the same discipline
142
+ // `resolveInstalledPackageSrcDir` (server-utils.ts) uses.
143
+ const require = createRequire(path.join(projectDir, 'package.json'));
144
+ let resolved: string;
145
+ try {
146
+ // The manifest resolves for any package, including one whose `exports`
147
+ // map hides its entry point from a bare specifier resolve.
148
+ resolved = require.resolve(`${packageName}/package.json`);
149
+ } catch {
150
+ try {
151
+ resolved = require.resolve(packageName);
152
+ } catch {
153
+ return null;
154
+ }
155
+ }
156
+ let real: string;
157
+ try {
158
+ real = realpathSync(resolved);
159
+ } catch {
160
+ return null;
161
+ }
162
+ const segments = real.split(path.sep);
163
+ const enclosing = segments.lastIndexOf('node_modules');
164
+ if (enclosing >= 0) return segments.slice(0, enclosing + 1).join(path.sep);
165
+ // A linked workspace sibling, which lives in no `node_modules` at all: allow
166
+ // the package's own ROOT. Walking up to the nearest `package.json` rather
167
+ // than taking the resolved file's directory, because the fallback resolve
168
+ // above lands on the package's ENTRY (`<pkg>/src/index.ts` for a package
169
+ // whose `exports` map hides `./package.json`), and allowing `<pkg>/src`
170
+ // would serve the entry while 403'ing every sibling file it imports.
171
+ return packageRootOf(path.dirname(real));
172
+ }
173
+
174
+ /** The nearest ancestor of `dir` (inclusive) that holds a `package.json`. */
175
+ function packageRootOf(dir: string): string | null {
176
+ let current = dir;
177
+ for (;;) {
178
+ if (existsSync(path.join(current, 'package.json'))) return realDirectory(current);
179
+ const parent = path.dirname(current);
180
+ if (parent === current) return null;
181
+ current = parent;
182
+ }
183
+ }
184
+
185
+ /** Drop every entry contained in another entry. */
186
+ function minimalRoots(roots: readonly string[]): string[] {
187
+ const unique = [...new Set(roots)].filter((root) => root.length > 0);
188
+ return unique.filter(
189
+ (root) => !unique.some((other) => other !== root && isPathInside(other, root)),
190
+ );
191
+ }
192
+
193
+ /**
194
+ * Every real directory a project-rooted Vite instance must be able to serve
195
+ * from for the project's own module graph to resolve — the project itself
196
+ * plus its real install roots.
197
+ *
198
+ * Boot-time (and open-project-time) computation: an install that appears
199
+ * later is a dependency change, which already restarts or invalidates the
200
+ * module graph through its own path.
201
+ */
202
+ export function projectServingRoots(projectDir: string): string[] {
203
+ const projectReal = realDirectory(projectDir) ?? path.resolve(projectDir);
204
+ const roots = [projectReal, ...walkUpNodeModules(projectReal)];
205
+ for (const name of declaredDependencies(projectReal)) {
206
+ const root = packageServingRoot(projectReal, name);
207
+ if (root && existsSync(root)) roots.push(root);
208
+ }
209
+ return minimalRoots(roots);
210
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * The editor server's intake of a project's CONFIGURATION-KIND
3
+ * CONTRIBUTIONS (ARCHITECTURE-CORE §The project model): every
4
+ * `src/contributions/*.kind.ts` is evaluated through the same Vite SSR loader the
5
+ * operation catalog uses, and its `kind` export is registered in THIS
6
+ * process's engine registry before the manifest is read. Memoized on the
7
+ * modules' paths and mtimes, so a route pays nothing until a kind file
8
+ * changes.
9
+ */
10
+
11
+ import { statSync } from 'node:fs';
12
+ import {
13
+ contributedKindModulePaths,
14
+ registerKindModule,
15
+ } from '@volter/editor-project/manifest/kind-modules';
16
+ import type { ProjectModuleLoader } from './project-tools';
17
+
18
+ let loader: ProjectModuleLoader | null = null;
19
+ let signature = '';
20
+ let unregister: Array<() => void> = [];
21
+ let loadErrors: string[] = [];
22
+
23
+ /** The loader the server evaluates project modules with; set once at boot. */
24
+ export function setKindModuleLoader(next: ProjectModuleLoader | null): void {
25
+ loader = next;
26
+ }
27
+
28
+ export function kindModuleLoader(): ProjectModuleLoader | null {
29
+ return loader;
30
+ }
31
+
32
+ function currentSignature(paths: readonly string[]): string {
33
+ return paths
34
+ .map((path) => {
35
+ try {
36
+ return `${path}@${statSync(path).mtimeMs}`;
37
+ } catch {
38
+ return `${path}@gone`;
39
+ }
40
+ })
41
+ .join('|');
42
+ }
43
+
44
+ /** Register the project's kinds if their files changed since the last call.
45
+ * Returns the load errors, which the caller surfaces by name. */
46
+ export async function ensureProjectConfigurationKinds(
47
+ projectRoot: string,
48
+ ): Promise<readonly string[]> {
49
+ const paths = contributedKindModulePaths(projectRoot);
50
+ const next = `${projectRoot}::${currentSignature(paths)}`;
51
+ if (next === signature) return loadErrors;
52
+ for (const off of unregister) off();
53
+ unregister = [];
54
+ loadErrors = [];
55
+ if (paths.length > 0 && !loader) {
56
+ loadErrors.push(
57
+ "configuration kinds need the editor server's module host, which this session has not started",
58
+ );
59
+ } else {
60
+ for (const path of paths) {
61
+ try {
62
+ const module = await (loader as ProjectModuleLoader)(path);
63
+ unregister.push(registerKindModule(module, path));
64
+ } catch (error) {
65
+ loadErrors.push(`${path}: ${error instanceof Error ? error.message : String(error)}`);
66
+ }
67
+ }
68
+ }
69
+ signature = next;
70
+ return loadErrors;
71
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * THE PROJECT'S OWN MCP SERVERS, handed to the runtime the session starts.
3
+ *
4
+ * Every scaffolded project ships `.mcp.json` naming its own two servers — `vgai` and
5
+ * `blender` — and that file is how a person's Claude Code, run by hand in the project,
6
+ * reaches them. The AI IN THE TAB is the same agent (ARCHITECTURE-CORE §The core is
7
+ * Code-OSS, rule 7) and must reach the same servers.
8
+ *
9
+ * WHY IT CANNOT BE LEFT TO DISCOVERY, measured 2026-09-21 on a freshly scaffolded model
10
+ * project: Claude Code records per-project approval of a `.mcp.json` in `~/.claude.json`
11
+ * (`enabledMcpjsonServers`), and a project the person has never opened by hand has no
12
+ * entry — so a PROJECT-scoped server is not loaded. The runtime the session starts is
13
+ * `claude --print …`, which has no trust dialog to answer, so discovery can never turn
14
+ * into approval there. A freshly created project's agent would simply have no `blender`
15
+ * tool, silently.
16
+ *
17
+ * THE DOOR IS SUPERCODE'S AND ALREADY EXISTS: `RuntimeStartParams.mcp_servers`. Supercode's
18
+ * Claude backend writes them to a file and passes `--mcp-config <file>`
19
+ * (`crates/harness/src/runtime/adapters.rs`), which is an EXPLICIT caller-supplied config
20
+ * and therefore not subject to the project-approval gate at all. This module is only the
21
+ * read: the project's declaration, in the SDK's shape.
22
+ *
23
+ * IT IS NOT A SECOND DECLARATION. `.mcp.json` stays the one place a project names its
24
+ * servers; nothing here invents, defaults or merges one, and a project without the file
25
+ * hands over nothing.
26
+ */
27
+
28
+ import { readFileSync } from 'node:fs';
29
+ import { join } from 'node:path';
30
+
31
+ /** `RuntimeStartParams.mcp_servers`'s element, structurally — the SDK is an optional peer. */
32
+ export interface ProjectMcpServer {
33
+ readonly name: string;
34
+ readonly command: string;
35
+ readonly arguments?: readonly string[];
36
+ readonly env?: Readonly<Record<string, string>>;
37
+ }
38
+
39
+ function stringRecord(value: unknown): Record<string, string> | undefined {
40
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) return undefined;
41
+ const entries = Object.entries(value as Record<string, unknown>).filter(
42
+ (entry): entry is [string, string] => typeof entry[1] === 'string',
43
+ );
44
+ return entries.length > 0 ? Object.fromEntries(entries) : undefined;
45
+ }
46
+
47
+ /**
48
+ * The project's `.mcp.json`, as the SDK's `mcp_servers`. Empty for a project that declares
49
+ * none, and empty rather than thrown for a malformed one: a broken `.mcp.json` is the dev
50
+ * server's to report against the file, and failing the whole runtime start over it would
51
+ * cost the person their agent to say so.
52
+ *
53
+ * Only the STDIO shape is carried, because that is the shape the harnesses take as a
54
+ * launch: an entry with no string `command` is skipped rather than guessed at.
55
+ */
56
+ export function projectMcpServers(projectRoot: string): ProjectMcpServer[] {
57
+ let parsed: unknown;
58
+ try {
59
+ parsed = JSON.parse(readFileSync(join(projectRoot, '.mcp.json'), 'utf8'));
60
+ } catch {
61
+ return [];
62
+ }
63
+ const declared = (parsed as { mcpServers?: unknown } | null)?.mcpServers;
64
+ if (declared === null || typeof declared !== 'object' || Array.isArray(declared)) return [];
65
+ const servers: ProjectMcpServer[] = [];
66
+ for (const [name, value] of Object.entries(declared as Record<string, unknown>)) {
67
+ if (value === null || typeof value !== 'object') continue;
68
+ const entry = value as { command?: unknown; args?: unknown; env?: unknown };
69
+ if (typeof entry.command !== 'string' || entry.command === '') continue;
70
+ const args = Array.isArray(entry.args)
71
+ ? entry.args.filter((argument): argument is string => typeof argument === 'string')
72
+ : undefined;
73
+ const env = stringRecord(entry.env);
74
+ servers.push({
75
+ name,
76
+ command: entry.command,
77
+ ...(args && args.length > 0 ? { arguments: args } : {}),
78
+ ...(env ? { env } : {}),
79
+ });
80
+ }
81
+ return servers;
82
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * A project module loaded ON USE is as fresh as the file on disk — never as
3
+ * fresh as the file watcher happens to be.
4
+ *
5
+ * The problem, measured on the blind modeling bench (2026-09-05): an agent
6
+ * edits `src/models/barrel.ts` and runs `vgai screenshot src/models/barrel.ts`
7
+ * in the same breath. The look verb's Node half loads the module through
8
+ * Vite's SSR runner, whose module graph is invalidated by the FILE WATCHER —
9
+ * and the watcher's change event lands seconds after the write (FSEvents on
10
+ * macOS, a poll tick on drvfs). Inside that window the runner hands back the
11
+ * previous evaluation, the four views come out byte-identical to the last
12
+ * look, and the agent concludes its edit did nothing. Four sessions in five
13
+ * hit it; one restarted the editor before every look, one tried to rewrite
14
+ * the project's own module loader and broke it, one shipped on a stale
15
+ * picture.
16
+ *
17
+ * The fix is the pattern `project-dependency-invalidation.ts` already uses
18
+ * for installs: check ON USE. Before a load, every module reachable from the
19
+ * requested one that lives under the project root is stat'ed; a file whose
20
+ * mtime moved since it was last evaluated has its graph node invalidated
21
+ * explicitly (the same invalidation the watcher performs — clears the
22
+ * transform, so the runner's next `fetchModule` re-transforms and
23
+ * re-evaluates). After a load, the reachable set's mtimes are recorded. A
24
+ * watcher event that arrives later is harmless: an already-invalidated node
25
+ * invalidates again for nothing.
26
+ *
27
+ * Scope is the PROJECT's own files. `node_modules` and the engine checkout are
28
+ * not stat'ed: the first is immutable between installs (and installs have
29
+ * their own door), the second restarts the server when it moves.
30
+ */
31
+
32
+ import { statSync } from 'node:fs';
33
+ import { sep } from 'node:path';
34
+ import type { ViteDevServer } from 'vite';
35
+ import type { ProjectModuleLoader } from './project-tools';
36
+
37
+ interface GraphNode {
38
+ readonly id: string | null;
39
+ readonly file: string | null;
40
+ readonly importedModules: Set<GraphNode>;
41
+ }
42
+
43
+ interface Graph {
44
+ getModuleById(id: string): GraphNode | undefined;
45
+ invalidateModule(node: GraphNode): void;
46
+ }
47
+
48
+ function mtimeOf(file: string): number | undefined {
49
+ try {
50
+ return statSync(file).mtimeMs;
51
+ } catch {
52
+ return undefined; // deleted: the load itself will say so
53
+ }
54
+ }
55
+
56
+ /** Every graph node reachable from `entry` whose file sits under `root`. */
57
+ function reachableProjectNodes(entry: GraphNode, root: string): GraphNode[] {
58
+ const prefix = root.endsWith(sep) ? root : `${root}${sep}`;
59
+ const seen = new Set<GraphNode>();
60
+ const out: GraphNode[] = [];
61
+ const stack = [entry];
62
+ while (stack.length) {
63
+ const node = stack.pop() as GraphNode;
64
+ if (seen.has(node)) continue;
65
+ seen.add(node);
66
+ const file = node.file;
67
+ if (!file || !file.startsWith(prefix) || file.includes(`${sep}node_modules${sep}`)) continue;
68
+ out.push(node);
69
+ for (const child of node.importedModules) stack.push(child);
70
+ }
71
+ return out;
72
+ }
73
+
74
+ export function freshProjectModuleLoader(
75
+ vite: ViteDevServer,
76
+ getProjectRoot: () => string | undefined,
77
+ ): ProjectModuleLoader {
78
+ const graph = vite.environments.ssr.moduleGraph as unknown as Graph;
79
+ const evaluatedAt = new Map<string, number>();
80
+ return async (moduleId: string) => {
81
+ const root = getProjectRoot();
82
+ if (root) {
83
+ const entry = graph.getModuleById(moduleId);
84
+ if (entry) {
85
+ for (const node of reachableProjectNodes(entry, root)) {
86
+ const file = node.file as string;
87
+ const recorded = evaluatedAt.get(file);
88
+ const current = mtimeOf(file);
89
+ if (recorded !== undefined && current !== undefined && current !== recorded) {
90
+ graph.invalidateModule(node);
91
+ evaluatedAt.delete(file);
92
+ }
93
+ }
94
+ }
95
+ }
96
+ const loaded = await vite.ssrLoadModule(moduleId);
97
+ if (root) {
98
+ const entry = graph.getModuleById(moduleId);
99
+ if (entry) {
100
+ for (const node of reachableProjectNodes(entry, root)) {
101
+ const file = node.file as string;
102
+ const current = mtimeOf(file);
103
+ if (current !== undefined) evaluatedAt.set(file, current);
104
+ }
105
+ }
106
+ }
107
+ return loaded;
108
+ };
109
+ }