@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,250 @@
1
+ /**
2
+ * Validate-on-change (owner decision, GitHub issue #103): hand-editing
3
+ * project files is an accepted authoring path, so the dev server validates
4
+ * `vgai.project.json` on every write and
5
+ * surfaces failures immediately — instead of the previous behavior, where a
6
+ * bad hand-edit only errored at next load.
7
+ *
8
+ * This module owns CONTENT validation only — classify a path, then either
9
+ * parse+validate its JSON or, for a `src/` module, PARSE IT AS A PROGRAM and
10
+ * run the authoring detectors over it. It deliberately reuses the exact
11
+ * Zod-backed parser
12
+ * `validate-manifest.ts` ships to every project
13
+ * (`loadGameManifest`), never
14
+ * re-implementing schema logic. Debouncing, terminal/SSE/state reporting,
15
+ * and file-watcher wiring live in `editor-server.ts`, which owns the
16
+ * chokidar watchers and mutable project state this needs no knowledge of.
17
+ */
18
+
19
+ import { readFile } from 'node:fs/promises';
20
+ import { transform } from 'esbuild';
21
+ import { ZodError } from 'zod';
22
+ import { AssetParseError } from '@volter/editor-threejs/asset-parse-error';
23
+ import { loadGameManifest } from '@volter/editor-project/manifest/load';
24
+ import { r3fAuthoringDiagnostics } from '../src/ui-source/r3f-project-contracts';
25
+ import { oidSurfaceSourceConflicts, resolveProjectFileRegion } from './project-root-surface';
26
+ import { findVendoredTarget } from './vendored-lock-recorder';
27
+
28
+ export type ValidatableKind = 'manifest' | 'source';
29
+
30
+ export interface ValidateProjectFileOptions {
31
+ /** The engine checkout, so a source file can be tested against the vendored
32
+ * game locks (`vendor/games/<id>.UPSTREAM.lock`). Omitted by callers that
33
+ * have no checkout to test against, which simply validates everything. */
34
+ readonly engineRoot?: string | undefined;
35
+ }
36
+
37
+ /**
38
+ * Classify an absolute file path as one of the validate-on-change formats, or
39
+ * `null` if it's none of them. The manifest is a single fixed-name file at
40
+ * the project root (matched by basename — `vgai.project.json` never appears anywhere
41
+ * else in a project).
42
+ */
43
+ export function classifyValidatableFile(absPath: string): ValidatableKind | null {
44
+ if (/[/\\]src[/\\].*\.[cm]?[jt]sx?$/.test(absPath)) return 'source';
45
+ const base = absPath.split(/[/\\]/).pop();
46
+ if (base === 'vgai.project.json') return 'manifest';
47
+ return null;
48
+ }
49
+
50
+ export interface ValidationOk {
51
+ ok: true;
52
+ warnings?: string[];
53
+ }
54
+
55
+ export interface ValidationFail {
56
+ ok: false;
57
+ /** One formatted message per issue — `path.to.field: message` for Zod
58
+ * issues, or the raw error message for read/parse/cross-field failures. */
59
+ errors: string[];
60
+ warnings?: string[];
61
+ }
62
+
63
+ export type ValidationResult = ValidationOk | ValidationFail;
64
+
65
+ function formatIssues(
66
+ issues: readonly { path: readonly PropertyKey[]; message: string }[],
67
+ ): string[] {
68
+ // Zod v4's issue `path` is typed `PropertyKey[]` (it can carry a `symbol`
69
+ // for branded keys) — `Array.prototype.join` calls the implicit `ToString`
70
+ // coercion on each element, which THROWS for a bare symbol. Map through
71
+ // `String()` explicitly so this stays safe even on that rare path.
72
+ return issues.map((issue) => `${issue.path.map(String).join('.') || '(root)'}: ${issue.message}`);
73
+ }
74
+
75
+ /** Run the Zod-backed manifest parser. Throws on failure (same contract as
76
+ * `loadGameManifest`) — `validateProjectFile` below is the one place that
77
+ * catches it. */
78
+ function parseByKind(json: unknown): void {
79
+ loadGameManifest(json);
80
+ }
81
+
82
+ /** Map a thrown parse error to its reported message list — one formatted
83
+ * entry per Zod issue for schema violations, or the raw message for a
84
+ * manifest cross-field `Error` (`loadGameManifest` throws those directly).
85
+ *
86
+ * Exported because it is the ONE readable rendering of a manifest failure:
87
+ * `project-view.ts` reports the same failure over `/__editor/project`'s
88
+ * `serving.error`, and a raw `ZodError.message` there is a pretty-printed
89
+ * JSON array of issue objects — the failing key is in it, buried twelve lines
90
+ * deep, which is not a diagnosis anyone reads. */
91
+ export function errorsFor(err: unknown): string[] {
92
+ if (err instanceof AssetParseError) return formatIssues(err.issues);
93
+ if (err instanceof ZodError) return formatIssues(err.issues);
94
+ return [err instanceof Error ? err.message : String(err)];
95
+ }
96
+
97
+ /** The esbuild loader for a project source file, chosen exactly the way the
98
+ * dev server's own transform chooses it. That parity is the whole point:
99
+ * anything Vite will serve has to survive this parse, and anything that fails
100
+ * here would have failed the dev server's transform too. `.js` is `jsx`, not
101
+ * `js`, for the same parity reason: the dev server accepts JSX inside a
102
+ * project's `.js` files (the CRA-era idiom — `vite-plugin-project-jsx-js.ts`
103
+ * is the serving half and names all three seams), so redding them here would
104
+ * fill `vgai status` with false errors for a game that mounts fine. `jsx` is
105
+ * a strict parse superset of `js`, so nothing formerly valid now reds. */
106
+ function sourceLoader(absPath: string): 'ts' | 'tsx' | 'jsx' {
107
+ if (/\.tsx$/i.test(absPath)) return 'tsx';
108
+ if (/\.[cm]?ts$/i.test(absPath)) return 'ts';
109
+ return 'jsx';
110
+ }
111
+
112
+ /**
113
+ * Does this file PARSE? Returns one formatted message per syntax error, or an
114
+ * empty array when the file is syntactically fine.
115
+ *
116
+ * Nothing else in this module answers that question — the detectors below are
117
+ * regexes and an error-TOLERANT `ts.createSourceFile`, so a project file that
118
+ * cannot be compiled at all used to validate `{ ok: true }` and the promised
119
+ * loud path stayed silent. The failure then surfaced only when the browser
120
+ * re-fetched the module, as a Vite transform error, which is the channel this
121
+ * verdict exists to make redundant.
122
+ *
123
+ * esbuild's `transform` (already a declared dependency of this package) is the
124
+ * cheapest real parser available and is the same one Vite runs, so the verdict
125
+ * matches what the dev server will do with the file. `target: 'esnext'` keeps
126
+ * it a PARSE: no syntax lowering, so nothing is reported for an environment
127
+ * this check has no opinion about.
128
+ */
129
+ async function parseErrors(raw: string, absPath: string): Promise<string[]> {
130
+ try {
131
+ await transform(raw, { loader: sourceLoader(absPath), sourcefile: absPath, target: 'esnext' });
132
+ return [];
133
+ } catch (err) {
134
+ const messages = (err as { errors?: { text?: string; location?: EsbuildLocation }[] }).errors;
135
+ if (!Array.isArray(messages) || messages.length === 0) {
136
+ return [err instanceof Error ? err.message : String(err)];
137
+ }
138
+ return messages.map((message) => {
139
+ const text = message.text ?? 'syntax error';
140
+ const at = message.location;
141
+ // esbuild columns are 0-based; `+ 1` matches the 1-based `line:col` the
142
+ // R3F authoring warnings below already print.
143
+ return at ? `line ${at.line}:${at.column + 1}: ${text}` : text;
144
+ });
145
+ }
146
+ }
147
+
148
+ interface EsbuildLocation {
149
+ line: number;
150
+ column: number;
151
+ }
152
+
153
+ async function validateSource(
154
+ raw: string,
155
+ absPath: string,
156
+ opts?: ValidateProjectFileOptions,
157
+ ): Promise<ValidationResult> {
158
+ // Parse FIRST and short-circuit. Every detector below reads a source it
159
+ // cannot trust once the file is unparseable, so their findings would be
160
+ // noise stacked on top of the one error that actually matters.
161
+ const syntax = await parseErrors(raw, absPath);
162
+ if (syntax.length > 0) return { ok: false, errors: syntax };
163
+
164
+ // PARSE-ONLY inside a lock-recorded vendored game. Everything below this line
165
+ // is ADVICE TO EDIT THE FILE — "declare a react adapter root", "accept and
166
+ // spread the matching ThreeElements props", "add the ordinary R3F name prop"
167
+ // — and a vendored game's bytes are pinned by `vendor/games/<id>.UPSTREAM.lock`
168
+ // to the upstream commit. A real deviation there is a RECORDED PATCH with a
169
+ // written rationale, a deliberate act; a background linter repeating
170
+ // unactionable advice about upstream code on every boot is noise a reader
171
+ // cannot act on and cannot clear. The parse verdict above still applies,
172
+ // because that one is actionable: a vendored file that does not parse is a
173
+ // mount that will fail.
174
+ //
175
+ // Measured on the repo-vendored racing-game the moment the boot scan started
176
+ // covering the manifest's real source tree: 1 error + 13 warnings, all of
177
+ // them asking for edits to pinned upstream bytes — including
178
+ // `src/main.tsx`'s `createRoot`, the game's own standalone page entry, which
179
+ // the host shim deliberately never imports.
180
+ if (opts?.engineRoot && findVendoredTarget(absPath, opts.engineRoot)) return { ok: true };
181
+
182
+ // The R3F authoring rules apply to a `three` region and to nothing else, and
183
+ // "which region?" is the resolver's answer, never the file's own text. This
184
+ // call site has no live import graph, so it gets the graph-FREE half —
185
+ // declared region `include` globs and root entries — exactly as its
186
+ // `oidSurfaceSourceConflicts` sibling below does, and for the same reason:
187
+ // without a graph every non-entry file looks unplaced, and reporting on that
188
+ // basis is a claim the tier cannot support. The reach-dependent files are
189
+ // analyzed at stamp time (`vite-plugin-ui-oid.ts`), where the graph exists.
190
+ const knownThreeSurface = resolveProjectFileRegion(absPath).surface === 'three';
191
+ const warnings = [
192
+ ...r3fAuthoringDiagnostics(raw, absPath, { knownThreeSurface }).map(
193
+ (diagnostic) =>
194
+ `line ${diagnostic.line}:${diagnostic.col + 1} [${diagnostic.code}] ${diagnostic.message}`,
195
+ ),
196
+ // Task #45 — the OID-stamping surface conflicts that make an element
197
+ // unselectable in the editor. Only the graph-FREE subset belongs here (see
198
+ // `oidSurfaceSourceConflicts`); the reach-dependent ones are reported at
199
+ // stamp time by `vite-plugin-ui-oid.ts`, where a live import graph exists.
200
+ ...oidSurfaceSourceConflicts(absPath, raw).map(
201
+ (diagnostic) => `[${diagnostic.code}] ${diagnostic.message}`,
202
+ ),
203
+ ];
204
+ return { ok: true, ...(warnings.length > 0 ? { warnings } : {}) };
205
+ }
206
+
207
+ /**
208
+ * Validate one project file's on-disk content against the same schema the
209
+ * engine's runtime loader and `validate-scenes.ts`/`validate-manifest.ts`
210
+ * enforce. Never throws — a file-watcher callback has no caller to catch a
211
+ * throw, so every failure mode (unreadable file, malformed JSON, schema
212
+ * violation, manifest cross-field rule) collapses into a `ValidationFail`
213
+ * with one or more human-readable messages.
214
+ */
215
+ export async function validateProjectFile(
216
+ absPath: string,
217
+ kind: ValidatableKind,
218
+ opts?: ValidateProjectFileOptions,
219
+ ): Promise<ValidationResult> {
220
+ let raw: string;
221
+ try {
222
+ raw = await readFile(absPath, 'utf-8');
223
+ } catch (err) {
224
+ // Most commonly ENOENT — a delete (or a rename's transient unlink) racing
225
+ // the debounce timer. Not this module's job to distinguish; just report.
226
+ return {
227
+ ok: false,
228
+ errors: [`could not read file: ${err instanceof Error ? err.message : String(err)}`],
229
+ };
230
+ }
231
+
232
+ let json: unknown;
233
+ if (kind === 'source') return validateSource(raw, absPath, opts);
234
+
235
+ try {
236
+ json = JSON.parse(raw);
237
+ } catch (err) {
238
+ return {
239
+ ok: false,
240
+ errors: [`invalid JSON: ${err instanceof Error ? err.message : String(err)}`],
241
+ };
242
+ }
243
+
244
+ try {
245
+ parseByKind(json);
246
+ return { ok: true };
247
+ } catch (err) {
248
+ return { ok: false, errors: errorsFor(err) };
249
+ }
250
+ }
@@ -0,0 +1,127 @@
1
+ /**
2
+ * THE PROJECT'S OWN FILES, AS FACTS — the server half of the `project.*`
3
+ * coverage family (`src/coverage/project-verb-coverage.ts`).
4
+ *
5
+ * Two files the browser cannot read for itself, and neither is served as part
6
+ * of the project's asset tree: the project's `package.json` (the dev server
7
+ * serves `public/`-scoped assets, and a root-level read there returns the SPA
8
+ * fallback — the same trap that once hid `vgai.project.json` from a manifest
9
+ * reader), and the resolved manifest's root adapters.
10
+ *
11
+ * FACTS ONLY. Nothing here decides whether a verb is present: it reports the
12
+ * script names that exist and the adapter each root resolved to, and the pure
13
+ * rules on the client turn those into rows. Keeping the verdict client-side is
14
+ * what lets the whole table be unit-tested with no server, and keeps ONE place
15
+ * to read when a row's wording is wrong.
16
+ *
17
+ * `scripts: null` is reserved for "this project has no package.json" — which is
18
+ * a different answer from an empty scripts block, and the rules say so.
19
+ */
20
+
21
+ import { readFile } from 'node:fs/promises';
22
+ import { join } from 'node:path';
23
+ import { loadGameManifestDir } from '@volter/editor-project/manifest/load-file';
24
+
25
+ export interface ProjectVerbRootFact {
26
+ readonly id: string;
27
+ readonly type: string;
28
+ readonly identity: string;
29
+ }
30
+
31
+ export interface ProjectVerbFactsResponse {
32
+ /** Script NAMES only — a command line is not a fact any row reads, and not
33
+ * something to hand a browser. `null` ⇒ the question could not be answered;
34
+ * `[]` with {@link ProjectVerbFactsResponse.hasPackageJson} `false` is the
35
+ * MEASURED answer "there is no package.json here", which is a different
36
+ * thing and produces a different row. */
37
+ readonly scripts: readonly string[] | null;
38
+ /** Whether a readable `package.json` exists at the project root. */
39
+ readonly hasPackageJson: boolean;
40
+ /** Dependency NAMES (runtime + dev, merged), on the same discipline as
41
+ * {@link ProjectVerbFactsResponse.scripts}: names are facts a row reads, a
42
+ * version range is not. `null` ⇒ the question could not be answered.
43
+ *
44
+ * Read by the `system.*` family's DETECTOR half: a project that ships a
45
+ * physics library while nothing binds a physics adapter is a contradiction,
46
+ * and the host's "nothing built a physics world" inference is not safe to
47
+ * print as settled over it. */
48
+ readonly dependencies: readonly string[] | null;
49
+ /** Resolved manifest roots, or `null` when the manifest could not be read
50
+ * (which the client reports as unmeasured, never as a clean answer). */
51
+ readonly roots: readonly ProjectVerbRootFact[] | null;
52
+ /** Why a `null` above is null, in this module's own words. */
53
+ readonly unavailable: string | null;
54
+ }
55
+
56
+ /** Read both facts for `projectRoot`. Never throws: every failure becomes a
57
+ * named `unavailable`, because "I could not look" is a real answer here and
58
+ * an exception would be reported as "no project" by the caller. */
59
+ export async function readProjectVerbFacts(
60
+ projectRoot: string | null,
61
+ ): Promise<ProjectVerbFactsResponse> {
62
+ if (!projectRoot) {
63
+ return {
64
+ scripts: null,
65
+ hasPackageJson: false,
66
+ dependencies: null,
67
+ roots: null,
68
+ unavailable: 'no project folder is open, so there are no project files to read',
69
+ };
70
+ }
71
+ const reasons: string[] = [];
72
+ let scripts: readonly string[] | null = null;
73
+ let dependencies: readonly string[] | null = null;
74
+ let hasPackageJson = false;
75
+ try {
76
+ const parsed = JSON.parse(await readFile(join(projectRoot, 'package.json'), 'utf-8')) as {
77
+ scripts?: unknown;
78
+ dependencies?: unknown;
79
+ devDependencies?: unknown;
80
+ };
81
+ hasPackageJson = true;
82
+ scripts =
83
+ parsed.scripts && typeof parsed.scripts === 'object'
84
+ ? Object.keys(parsed.scripts as Record<string, unknown>)
85
+ : [];
86
+ const names = new Set<string>();
87
+ for (const block of [parsed.dependencies, parsed.devDependencies]) {
88
+ if (block && typeof block === 'object') {
89
+ for (const name of Object.keys(block as Record<string, unknown>)) names.add(name);
90
+ }
91
+ }
92
+ dependencies = [...names];
93
+ } catch (error) {
94
+ // ENOENT is the MEASURED answer "this project has no package.json" — an
95
+ // empty script set with `hasPackageJson: false`, which the rules report as
96
+ // a real gap. Any OTHER failure (unreadable, malformed JSON) is a fact
97
+ // nobody could read, and is named instead of being flattened into it.
98
+ const code = (error as { code?: unknown }).code;
99
+ if (code === 'ENOENT') {
100
+ scripts = [];
101
+ dependencies = [];
102
+ } else {
103
+ reasons.push(
104
+ `this project's package.json could not be read (${error instanceof Error ? error.message : String(error)})`,
105
+ );
106
+ }
107
+ }
108
+ let roots: readonly ProjectVerbRootFact[] | null = null;
109
+ try {
110
+ roots = loadGameManifestDir(projectRoot).roots.map((root) => ({
111
+ id: root.id,
112
+ type: root.adapter.type,
113
+ identity: root.adapter.identity,
114
+ }));
115
+ } catch (error) {
116
+ reasons.push(
117
+ `this project's vgai.project.json could not be resolved (${error instanceof Error ? error.message : String(error)})`,
118
+ );
119
+ }
120
+ return {
121
+ scripts,
122
+ hasPackageJson,
123
+ dependencies,
124
+ roots,
125
+ unavailable: reasons.length > 0 ? reasons.join('; ') : null,
126
+ };
127
+ }
@@ -0,0 +1,52 @@
1
+ /** Server-side editor view of the single v2 project configuration. */
2
+
3
+ import { hasRootOnSurface } from '@volter/editor-project/adapter/manifest-interpreter';
4
+ import { loadGameManifestDir } from '@volter/editor-project/manifest/load-file';
5
+ import { ensureProjectConfigurationKinds } from './project-kinds';
6
+ import { errorsFor } from './project-validation';
7
+
8
+ export type ProjectView = Record<string, unknown>;
9
+
10
+ export type ProjectViewResult = { ok: true; view: ProjectView } | { ok: false; error: string };
11
+
12
+ /**
13
+ * Read `vgai.project.json`, keeping the REASON a read failed.
14
+ *
15
+ * Boot routing needs that reason: a server serving a project whose manifest it
16
+ * cannot read is not the same thing as a server with no project open, and
17
+ * collapsing the two is what dropped the editor page onto the launcher for a
18
+ * project the server was — and still is — serving. There is no fallback config
19
+ * file; a missing or invalid manifest is still not a loadable project, it is
20
+ * just a loud one.
21
+ *
22
+ * The reason is rendered by `project-validation.ts`'s `errorsFor` — the same
23
+ * `path.to.field: message` form the watcher's terminal/console/`vgai status`
24
+ * legs already print — because this string is read by people and by agents:
25
+ * the editor's startup-error screen, `vgai sessions`, and `@vgai/live`'s
26
+ * refusal all quote it. A bare `ZodError.message` is a pretty-printed JSON
27
+ * array of issue objects; it contains the failing key and hides it.
28
+ */
29
+ export async function readProjectViewResult(root: string): Promise<ProjectViewResult> {
30
+ try {
31
+ const kindErrors = await ensureProjectConfigurationKinds(root);
32
+ if (kindErrors.length > 0) return { ok: false, error: kindErrors.join('\n') };
33
+ const manifest = loadGameManifestDir(root);
34
+ return {
35
+ ok: true,
36
+ view: {
37
+ ...manifest,
38
+ hasThreeRoot: hasRootOnSurface(manifest, 'three'),
39
+ rootCount: manifest.roots.length,
40
+ },
41
+ };
42
+ } catch (error) {
43
+ return { ok: false, error: errorsFor(error).join('\n') };
44
+ }
45
+ }
46
+
47
+ /** The view, or null when it could not be read. See `readProjectViewResult`
48
+ * when the caller must be able to say WHY. */
49
+ export async function readProjectView(root: string): Promise<ProjectView | null> {
50
+ const result = await readProjectViewResult(root);
51
+ return result.ok ? result.view : null;
52
+ }