@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,56 @@
1
+ /**
2
+ * The git-workflow wire — the status shape `/__editor/git/*` answers with,
3
+ * declared ONCE in a leaf module both sides import (the browser client in
4
+ * `../share-control-client.ts`, the producing `../../server/git-workflow.ts`).
5
+ * Import-free so the server's tsconfig can reach it without the client's
6
+ * module graph. The share wire next door (`@volter/editor-sdk/share`) had this
7
+ * fix applied first; the git wire in the same panel had been re-spelled
8
+ * inline, twenty lines below the header describing that fix.
9
+ */
10
+
11
+ export interface GitChangedPath {
12
+ path: string;
13
+ index: string;
14
+ worktree: string;
15
+ }
16
+
17
+ export interface GitDiffHunk {
18
+ id: string;
19
+ path: string;
20
+ staged: boolean;
21
+ header: string;
22
+ additions: number;
23
+ deletions: number;
24
+ }
25
+
26
+ export interface GitHistoryCommit {
27
+ sha: string;
28
+ shortSha: string;
29
+ author: string;
30
+ authoredAt: string;
31
+ subject: string;
32
+ }
33
+
34
+ export interface GitWorkflowStatus {
35
+ available: boolean;
36
+ repositoryId: string;
37
+ worktreeId: string;
38
+ worktreeRoot: string;
39
+ projectRelativePath: string;
40
+ branch: string | null;
41
+ headCommit: string | null;
42
+ baseRef: string | null;
43
+ upstream: string | null;
44
+ remoteUrl: string | null;
45
+ dirty: boolean;
46
+ ahead: number | null;
47
+ behind: number | null;
48
+ baseAhead: number | null;
49
+ baseBehind: number | null;
50
+ changed: GitChangedPath[];
51
+ hunks: GitDiffHunk[];
52
+ history: GitHistoryCommit[];
53
+ conflicts: string[];
54
+ rebaseInProgress: boolean;
55
+ github: boolean;
56
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Play-mode console log persistence — agent/CLI-tooling introspection, so it
3
+ * is bucketed with the CLI control channel.
4
+ */
5
+
6
+ import { assertEditorServerResponse, editorServerJson } from '../editor-server-response';
7
+ import { BASE } from './base';
8
+ // ---------------------------------------------------------------------------
9
+ // Play-mode console log persistence
10
+ // ---------------------------------------------------------------------------
11
+
12
+ export interface LogEntry {
13
+ t: number;
14
+ level: string;
15
+ source?: string;
16
+ sub?: string;
17
+ msg: string;
18
+ meta?: Record<string, unknown>;
19
+ /** Engine fixed-step counter at write time —
20
+ * present only while a live play session's debug seam can be read, so
21
+ * entries correlate frame-exactly with `ctx.debug.emit` events. */
22
+ tick?: number;
23
+ /** Accumulated sim-seconds at write time — same source as `tick`. */
24
+ simT?: number;
25
+ /** The world this run was presenting when the entry was written. Present
26
+ * only once the run's roots have mounted and a world is unambiguous (see
27
+ * `play-mode.ts`'s `playLogRunStamp`) — entries written during boot, and
28
+ * runs that present no world at all, honestly carry none. */
29
+ world?: string;
30
+ /** The loop's live time scale at write time (`game.loop.timeScale`) — 1 is
31
+ * real time, 0 is paused, and an instrument can change it mid-run, which is
32
+ * exactly why it is per-entry and not in the file's identity header. */
33
+ simSpeed?: number;
34
+ }
35
+
36
+ /** Start a new log session. Returns the filename, or null on failure.
37
+ * Browser mode writes the SAME `logs/play-*.jsonl` record through the
38
+ * StorageBackend (`play-log/browser-play-log.ts`) — the Analytics utility's
39
+ * Gameplay Sessions read it, and a downloaded project carries its history —
40
+ * while a staged example/ingest stays a no-op (no storage home). */
41
+ export async function startLogSession(name?: string | null): Promise<string | null> {
42
+ try {
43
+ const res = await fetch(`${BASE}/log-session`, {
44
+ method: 'POST',
45
+ headers: { 'Content-Type': 'application/json' },
46
+ // `name` (optional — `vgai play --name <text>`) is passed through RAW;
47
+ // the server owns the slugifier, so there is exactly one definition of
48
+ // what the run is called on disk and in the journal.
49
+ body: JSON.stringify({ action: 'start', ...(name ? { name } : {}) }),
50
+ });
51
+ const data = await editorServerJson<{ ok: boolean; file: string }>(
52
+ res,
53
+ 'Could not start a play log session',
54
+ );
55
+ return data.file;
56
+ } catch {
57
+ return null;
58
+ }
59
+ }
60
+
61
+ /** End the current log session. Browser mode closes the storage-backed log. */
62
+ export async function endLogSession(): Promise<void> {
63
+ try {
64
+ const res = await fetch(`${BASE}/log-session`, {
65
+ method: 'POST',
66
+ headers: { 'Content-Type': 'application/json' },
67
+ body: JSON.stringify({ action: 'end' }),
68
+ });
69
+ assertEditorServerResponse(res, 'Could not end the play log session');
70
+ } catch {
71
+ /* best-effort */
72
+ }
73
+ }
74
+
75
+ /** Flush a batch of log entries. Browser mode appends to the storage-backed
76
+ * log (never a network call — this runs on a `setInterval` while Play is
77
+ * running, and a dead endpoint here is the retry-loop anti-pattern A2's SSE
78
+ * guards exist to avoid). */
79
+ export async function flushLogEntries(entries: LogEntry[]): Promise<boolean> {
80
+ if (entries.length === 0) return true;
81
+ try {
82
+ const res = await fetch(`${BASE}/log-entries`, {
83
+ method: 'POST',
84
+ headers: { 'Content-Type': 'application/json' },
85
+ body: JSON.stringify({ entries }),
86
+ });
87
+ assertEditorServerResponse(res, 'Could not flush play log entries');
88
+ return true;
89
+ } catch {
90
+ return false;
91
+ }
92
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * `/__editor/compatibility` — WHICH Node process is serving this editor, and
3
+ * whether its source is still the source it started with.
4
+ *
5
+ * Every other call in `api/` assumes the answer is stable for the page's
6
+ * lifetime; `requireEditorCompatibility` is what turns "the server moved
7
+ * underneath us" into a loud error instead of a confusing one later.
8
+ */
9
+
10
+ import {
11
+ assertEditorCompatibility,
12
+ type EditorServerCompatibility,
13
+ editorServerUnavailableError,
14
+ missingCompatibilityError,
15
+ } from '@volter/editor-sdk/session/editor-compatibility';
16
+ import { assertEditorServerResponse } from '../editor-server-response';
17
+ import { BASE } from './base';
18
+
19
+ function parseEditorCompatibility(value: unknown): EditorServerCompatibility | null {
20
+ if (!value || typeof value !== 'object') return null;
21
+ const candidate = value as Partial<EditorServerCompatibility>;
22
+ if (
23
+ candidate.apiVersion !== 1 ||
24
+ (typeof candidate.engineVersion !== 'string' && candidate.engineVersion !== null) ||
25
+ typeof candidate.manifestVersion !== 'number' ||
26
+ typeof candidate.startedAt !== 'string' ||
27
+ !candidate.source ||
28
+ (candidate.source.state !== 'current' && candidate.source.state !== 'restart-required')
29
+ ) {
30
+ return null;
31
+ }
32
+ if (
33
+ candidate.source.state === 'restart-required' &&
34
+ (typeof candidate.source.changedPath !== 'string' ||
35
+ typeof candidate.source.changedAt !== 'string')
36
+ ) {
37
+ return null;
38
+ }
39
+ return candidate as EditorServerCompatibility;
40
+ }
41
+
42
+ /** Read the immutable identity of the local Node process serving this editor. */
43
+ export async function getEditorCompatibility(): Promise<EditorServerCompatibility | null> {
44
+ let res: Response;
45
+ try {
46
+ res = await fetch(`${BASE}/compatibility`, { cache: 'no-store' });
47
+ } catch (error) {
48
+ throw editorServerUnavailableError(error instanceof Error ? error.message : String(error));
49
+ }
50
+ if (res.status >= 500) throw editorServerUnavailableError(`HTTP ${res.status}`);
51
+ try {
52
+ // This route's own copy of the page-fallback discrimination predates
53
+ // `editor-server-response.ts`; the reader now owns it. `null` (not a throw)
54
+ // stays the answer for "no editor server here" — that is the whole question
55
+ // this probe exists to ask, and `requireEditorCompatibility` turns it into
56
+ // the named `missingCompatibilityError()`.
57
+ assertEditorServerResponse(res, `GET ${BASE}/compatibility`);
58
+ } catch {
59
+ return null;
60
+ }
61
+ try {
62
+ return parseEditorCompatibility(await res.json());
63
+ } catch {
64
+ return null;
65
+ }
66
+ }
67
+
68
+ /** Require a current handshake before any operation that activates a project. */
69
+ export async function requireEditorCompatibility(): Promise<EditorServerCompatibility> {
70
+ const identity = await getEditorCompatibility();
71
+ if (!identity) throw missingCompatibilityError();
72
+ assertEditorCompatibility(identity);
73
+ return identity;
74
+ }
@@ -0,0 +1,355 @@
1
+ /**
2
+ * Choosing, creating and OPENING a project — the New Project screen's client
3
+ * half, plus the runtime project switch.
4
+ *
5
+ * The user-triggered actions with no browser equivalent throw a clear, honest
6
+ * `Error` rather than doing a doomed fetch (`createProject`, `browseFolder`,
7
+ * `openProjectOnServer`, `revealInFinder`); the browser-mode UI either hides
8
+ * the affordance or catches the throw into an existing error banner.
9
+ */
10
+
11
+ import {
12
+ assertProjectCompatibility,
13
+ editorServerUnavailableError,
14
+ isStartupRecovery,
15
+ ProjectCompatibilityError,
16
+ } from '@volter/editor-sdk/session/editor-compatibility';
17
+ import type { ProjectInspection } from '@volter/editor-project/inspection';
18
+ import {
19
+ assertEditorServerAnswered,
20
+ assertEditorServerResponse,
21
+ editorServerJson,
22
+ } from '../editor-server-response';
23
+ import { BASE } from './base';
24
+ import { requireEditorCompatibility } from './project-identity';
25
+
26
+ /** One row of the launcher's recent-projects list. */
27
+ export interface RecentProject {
28
+ name: string;
29
+ path: string;
30
+ lastOpened: string;
31
+ thumbnail?: string;
32
+ }
33
+ /** List recently opened projects — the folders this machine's sessions have
34
+ * opened, tracked by the editor server. */
35
+ export async function listRecentProjects(): Promise<RecentProject[]> {
36
+ try {
37
+ const res = await fetch(`${BASE}/recent-projects`);
38
+ const data = await editorServerJson<{ projects: RecentProject[] }>(
39
+ res,
40
+ 'Could not list recent projects',
41
+ );
42
+ return data.projects;
43
+ } catch {
44
+ return [];
45
+ }
46
+ }
47
+
48
+ /** Forget one launcher entry without touching the project folder. */
49
+ export async function removeRecentProject(path: string): Promise<void> {
50
+ const response = await fetch(`${BASE}/recent-projects`, {
51
+ method: 'DELETE',
52
+ headers: { 'Content-Type': 'application/json' },
53
+ body: JSON.stringify({ path }),
54
+ });
55
+ assertEditorServerResponse(response, 'Could not remove recent project');
56
+ }
57
+
58
+ /** User-global launcher preferences (G5). */
59
+ export interface LauncherSettings {
60
+ reopenLastProject: boolean;
61
+ }
62
+
63
+ const DEFAULT_LAUNCHER_SETTINGS: LauncherSettings = { reopenLastProject: false };
64
+
65
+ /** Read the launcher preferences. Any failure degrades to the documented
66
+ * defaults — a preferences read must never be able to block boot. */
67
+ export async function getLauncherSettings(): Promise<LauncherSettings> {
68
+ try {
69
+ const res = await fetch(`${BASE}/launcher-settings`);
70
+ const data = await editorServerJson<Partial<LauncherSettings>>(
71
+ res,
72
+ 'Could not read launcher settings',
73
+ );
74
+ return {
75
+ reopenLastProject:
76
+ typeof data.reopenLastProject === 'boolean'
77
+ ? data.reopenLastProject
78
+ : DEFAULT_LAUNCHER_SETTINGS.reopenLastProject,
79
+ };
80
+ } catch {
81
+ return { ...DEFAULT_LAUNCHER_SETTINGS };
82
+ }
83
+ }
84
+
85
+ /** Persist a launcher preference. Unlike the read above this throws on
86
+ * failure: a toggle that silently does nothing would leave the checkbox
87
+ * lying about what happens at the next launch. */
88
+ export async function updateLauncherSettings(
89
+ update: Partial<LauncherSettings>,
90
+ ): Promise<LauncherSettings> {
91
+ const res = await fetch(`${BASE}/launcher-settings`, {
92
+ method: 'PUT',
93
+ headers: { 'Content-Type': 'application/json' },
94
+ body: JSON.stringify(update),
95
+ });
96
+ return await editorServerJson<LauncherSettings>(res, 'Could not save launcher settings');
97
+ }
98
+
99
+ /** Create a project from a registry source. The server validates the plain
100
+ * string against the scaffolder's live capability tuple. */
101
+ export async function createProject(
102
+ name: string,
103
+ location: string,
104
+ template: string,
105
+ exampleId?: string,
106
+ presentation?: string,
107
+ additions: readonly string[] = [],
108
+ ): Promise<{ ok: boolean; path?: string; config?: { name: string }; error?: string }> {
109
+ const res = await fetch(`${BASE}/create-project`, {
110
+ method: 'POST',
111
+ headers: { 'Content-Type': 'application/json' },
112
+ body: JSON.stringify({
113
+ name,
114
+ location,
115
+ template,
116
+ ...(exampleId ? { exampleId } : {}),
117
+ ...(presentation ? { presentation } : {}),
118
+ ...(additions.length > 0 ? { additions } : {}),
119
+ }),
120
+ });
121
+ // The route reports its own refusals in `{ ok: false, error }` with a non-2xx
122
+ // status, and the New Project form renders that string — so only the "did the
123
+ // editor server answer at all" half applies here.
124
+ assertEditorServerAnswered(res, 'Could not create the project');
125
+ return (await res.json()) as {
126
+ ok: boolean;
127
+ path?: string;
128
+ config?: { name: string };
129
+ error?: string;
130
+ };
131
+ }
132
+
133
+ /** Open a native folder picker dialog. Returns the selected path, or null if cancelled. */
134
+ export async function browseFolder(title?: string): Promise<string | null> {
135
+ try {
136
+ const res = await fetch(`${BASE}/browse-folder`, {
137
+ method: 'POST',
138
+ headers: { 'Content-Type': 'application/json' },
139
+ body: JSON.stringify({ title }),
140
+ });
141
+ const data = await editorServerJson<{ path: string | null }>(
142
+ res,
143
+ 'Could not open the folder picker',
144
+ );
145
+ return data.path;
146
+ } catch {
147
+ return null;
148
+ }
149
+ }
150
+
151
+ /** Inspect an arbitrary local folder without opening it or writing VGAI files. */
152
+ export async function inspectProjectFolder(
153
+ path: string,
154
+ ): Promise<{ path: string; report: ProjectInspection }> {
155
+ const res = await fetch(`${BASE}/inspect-project`, {
156
+ method: 'POST',
157
+ headers: { 'Content-Type': 'application/json' },
158
+ body: JSON.stringify({ path }),
159
+ });
160
+ assertEditorServerAnswered(res, `Could not inspect ${path}`);
161
+ const payload = (await res.json()) as {
162
+ ok?: boolean;
163
+ path?: string;
164
+ report?: ProjectInspection;
165
+ error?: string;
166
+ };
167
+ if (!res.ok || !payload.path || !payload.report) {
168
+ throw new Error(payload.error ?? `Could not inspect ${path}.`);
169
+ }
170
+ return { path: payload.path, report: payload.report };
171
+ }
172
+
173
+ /** Add the one-file VGAI metadata bridge after the user approves an inspection. */
174
+ export async function adaptProjectFolder(
175
+ path: string,
176
+ selection?: { surface?: ProjectInspection['suggestedSurface']; entry?: string },
177
+ ): Promise<{ path: string; writes: string[] }> {
178
+ const res = await fetch(`${BASE}/adapt-project`, {
179
+ method: 'POST',
180
+ headers: { 'Content-Type': 'application/json' },
181
+ body: JSON.stringify({ path, ...selection }),
182
+ });
183
+ assertEditorServerAnswered(res, `Could not add Volter Editor metadata to ${path}`);
184
+ const payload = (await res.json()) as { path?: string; writes?: string[]; error?: string };
185
+ if (!res.ok || !payload.path || !payload.writes) {
186
+ throw new Error(payload.error ?? `Could not add Volter Editor metadata to ${path}.`);
187
+ }
188
+ return { path: payload.path, writes: payload.writes };
189
+ }
190
+
191
+ /** Reveal a file or folder in the OS file manager. */
192
+ export async function revealInFinder(targetPath: string): Promise<void> {
193
+ const res = await fetch(`${BASE}/reveal`, {
194
+ method: 'POST',
195
+ headers: { 'Content-Type': 'application/json' },
196
+ body: JSON.stringify({ path: targetPath }),
197
+ });
198
+ // Every caller is a fire-and-forget menu action, so this rejection reaches
199
+ // the editor console through the page's `unhandledrejection` capture
200
+ // (`editor-console.ts`) — which is still a report, where the unread response
201
+ // was a file manager that never opened and nothing said so.
202
+ assertEditorServerResponse(res, `Could not reveal ${targetPath}`);
203
+ }
204
+
205
+ /** Save a viewport thumbnail for the current project — background bookkeeping
206
+ * for the recent-projects list, not a user-facing promise. */
207
+ export async function saveThumbnail(dataUrl: string): Promise<boolean> {
208
+ try {
209
+ const res = await fetch(`${BASE}/save-thumbnail`, {
210
+ method: 'POST',
211
+ headers: { 'Content-Type': 'application/json' },
212
+ body: JSON.stringify({ dataUrl }),
213
+ });
214
+ assertEditorServerResponse(res, 'Could not save the project thumbnail');
215
+ return true;
216
+ } catch {
217
+ return false;
218
+ }
219
+ }
220
+
221
+ export interface ServerProject {
222
+ path: string;
223
+ config: {
224
+ manifestVersion: 2;
225
+ name: string;
226
+ version: string;
227
+ engine: { version: string };
228
+ [key: string]: unknown;
229
+ };
230
+ /** Whether the project ships src/ui/registry.ts (scene-UI project mode, D9). */
231
+ hasUiRegistry?: boolean;
232
+ /** Whether this server is the no-monorepo-checkout packaged runtime
233
+ * (`packages/editor/server/packaged.ts`) — see `binding-resolver.ts`'s
234
+ * `isPackagedRuntime` for why a react world's mount needs this. */
235
+ packaged?: boolean;
236
+ /** The engine package resolved from this project's own node_modules graph. */
237
+ enginePackage?: {
238
+ name: '@vgai/game-runtime';
239
+ version: string | null;
240
+ path: string;
241
+ installPath: string;
242
+ linked: boolean;
243
+ } | null;
244
+ }
245
+
246
+ /**
247
+ * What the server says it is serving — with the failures kept apart from the
248
+ * answer "nothing".
249
+ *
250
+ * `getCurrentServerProject` (below) flattens all three negatives to `null`,
251
+ * which is fine for a background read that only wants the happy path. It is
252
+ * NOT fine at boot: `null` there routes to the launcher, so a lost request or
253
+ * an unreadable manifest silently claimed the server had no project while it
254
+ * was serving one. See `boot-routing.ts`'s `decideServerProjectBoot`.
255
+ */
256
+ export type ServerProjectProbe =
257
+ | { status: 'project'; project: ServerProject }
258
+ | { status: 'none' }
259
+ /** Serving `path`, but the server could not describe it (broken manifest). */
260
+ | { status: 'unreadable'; path: string; error: string }
261
+ /** The ask itself failed — server down, mid-restart, malformed answer. */
262
+ | { status: 'unknown'; error: string };
263
+
264
+ interface ServerProjectResponse {
265
+ project: ServerProject | null;
266
+ serving?: { path?: unknown; error?: unknown } | null;
267
+ }
268
+
269
+ /** Ask the server what it serves, keeping the reason when it cannot say. */
270
+ export async function probeCurrentServerProject(): Promise<ServerProjectProbe> {
271
+ // Browser mode has no Node dev server to ask — same honest no-fetch
272
+ // degrade as the other background reads in this file.
273
+ let data: ServerProjectResponse;
274
+ try {
275
+ const res = await fetch(`${BASE}/project`);
276
+ data = await editorServerJson<ServerProjectResponse>(res, `No answer from ${BASE}/project`);
277
+ } catch (error) {
278
+ return {
279
+ status: 'unknown',
280
+ error: error instanceof Error ? error.message : String(error),
281
+ };
282
+ }
283
+ if (data.project) return { status: 'project', project: data.project };
284
+ const serving = data.serving;
285
+ if (serving && typeof serving.path === 'string') {
286
+ return {
287
+ status: 'unreadable',
288
+ path: serving.path,
289
+ error: typeof serving.error === 'string' ? serving.error : 'unknown error',
290
+ };
291
+ }
292
+ if (data.project === null) return { status: 'none' };
293
+ return { status: 'unknown', error: `Unrecognized ${BASE}/project response` };
294
+ }
295
+
296
+ /** Query the server for the currently active project (if any). Every failure
297
+ * reads as "no project" — see `probeCurrentServerProject` for the callers
298
+ * (boot) that must not make that trade. */
299
+ export async function getCurrentServerProject(): Promise<ServerProject | null> {
300
+ const probe = await probeCurrentServerProject();
301
+ return probe.status === 'project' ? probe.project : null;
302
+ }
303
+
304
+ /** Open/switch to a project by its filesystem path. */
305
+ export async function openProjectOnServer(projectPath: string): Promise<{
306
+ ok: boolean;
307
+ config?: {
308
+ manifestVersion: 2;
309
+ name: string;
310
+ version: string;
311
+ engine: { version: string };
312
+ [key: string]: unknown;
313
+ };
314
+ }> {
315
+ const compatibility = await requireEditorCompatibility();
316
+ const res = await fetch(`${BASE}/open-project`, {
317
+ method: 'POST',
318
+ headers: { 'Content-Type': 'application/json' },
319
+ body: JSON.stringify({ path: projectPath }),
320
+ });
321
+ let payload: unknown;
322
+ try {
323
+ // The fallback check goes INSIDE this try so a page-fallback answer reaches
324
+ // the same startup-recovery error class the parse failure already used —
325
+ // now naming the cause instead of "invalid response".
326
+ assertEditorServerAnswered(res, `Could not open project at ${projectPath}`);
327
+ payload = await res.json();
328
+ } catch (cause) {
329
+ throw editorServerUnavailableError(
330
+ cause instanceof Error ? cause.message : `HTTP ${res.status} returned an invalid response`,
331
+ );
332
+ }
333
+ if (!res.ok) {
334
+ if (payload && typeof payload === 'object') {
335
+ const failure = payload as Record<string, unknown>;
336
+ if (typeof failure['error'] === 'string' && isStartupRecovery(failure['recovery'])) {
337
+ throw new ProjectCompatibilityError(failure['error'], failure['recovery']);
338
+ }
339
+ if (typeof failure['error'] === 'string') throw new Error(failure['error']);
340
+ }
341
+ throw new Error(`Could not open project at ${projectPath}: HTTP ${res.status}`);
342
+ }
343
+ const result = payload as {
344
+ ok: boolean;
345
+ config?: {
346
+ manifestVersion: 2;
347
+ name: string;
348
+ version: string;
349
+ engine: { version: string };
350
+ [key: string]: unknown;
351
+ };
352
+ };
353
+ if (result.config) assertProjectCompatibility(result.config, compatibility);
354
+ return result;
355
+ }