@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,29 @@
1
+ /**
2
+ * The helpers shared across `register<Family>Routes` modules — extracted with
3
+ * the routes that already used them when they moved out of `editor-server.ts`.
4
+ * Route bodies themselves are byte-preserved by the split; nothing here
5
+ * changes what any route answers.
6
+ */
7
+
8
+ import type { Request, Response } from 'express';
9
+
10
+ /**
11
+ * An `AbortSignal` that fires when the CLIENT gives up, so a long git or
12
+ * network operation stops with the request that asked for it rather than
13
+ * running to completion for nobody.
14
+ */
15
+ export function requestOperationSignal(req: Request): AbortSignal {
16
+ const controller = new AbortController();
17
+ req.once('aborted', () => controller.abort());
18
+ return controller.signal;
19
+ }
20
+
21
+ /**
22
+ * The share-host verbs' error answer. 409 for the one recoverable case (the
23
+ * owner has to open their editor tab before a host identity can be bound),
24
+ * 400 for everything else.
25
+ */
26
+ export function shareControlError(res: Response, error: unknown): void {
27
+ const message = error instanceof Error ? error.message : String(error);
28
+ res.status(message.includes('Open the local editor tab') ? 409 : 400).json({ error: message });
29
+ }
@@ -0,0 +1,138 @@
1
+ /**
2
+ * `/__editor/served-modules` — the ONE door by which the Code-OSS frame finds
3
+ * the editor.
4
+ *
5
+ * WHO ASKS. The fork's workbench contribution (docs/CODE-OSS.md). It boots into
6
+ * a VS Code page, hands over its parts, and then needs the vgai editor's own
7
+ * entry point to import — the PRODUCT's entry, which mounts the kit's bridge and
8
+ * so swaps the SDK layout host that renders our panels into those parts. The
9
+ * contribution reads `modules[].url` for the id `vscode-bridge`, imports exactly
10
+ * that, and reads `mountVgai` off it.
11
+ * `vgaiSessionOrigin.ts` also uses this route as its "is there a session here"
12
+ * probe, so it answers 200 even when it has nothing to serve.
13
+ *
14
+ * WHAT IT SERVES: the PRODUCT's one source entry — `@vgai/game-editor`'s or
15
+ * `@vgai/model-editor`'s `src/index.ts`, which composes the product and
16
+ * re-exports `mountVgai` (`packages/editor/src/frame/product.ts`). Which
17
+ * product that is comes from the project's own dependencies, resolved by the
18
+ * CLI and handed over (`session-product.ts`); the kit's own mount,
19
+ * `frame/bridge.tsx`'s `mountEditor`, is not served to anybody and names no
20
+ * product.
21
+ *
22
+ * WHERE THE URL COMES FROM is the host's, not this route's, because the two
23
+ * hosts serve the editor differently and only they know how:
24
+ *
25
+ * - `dev.ts` runs Vite over the checkout, so the product entry is an ordinary
26
+ * module in the graph and the URL is its path, stamped with its own mtime.
27
+ * - `packaged.ts` serves the PRODUCT's production build, so the URL is the
28
+ * built entry's hashed chunk.
29
+ *
30
+ * A host with no bundler behind it supplies no answer at all, and a session
31
+ * whose project declares no product supplies `null`; this route says either by
32
+ * name, with the id the contribution was looking for — a frame that cannot find
33
+ * the editor must read as a refusal, never as an empty list.
34
+ *
35
+ * THE QUERY KEY MAY NEVER BE `v` — see {@link ServedModuleAnswer.url}.
36
+ */
37
+
38
+ import { PRODUCT_INSTALL_LINES } from '@volter/editor-sdk/session/product-locator';
39
+ import type { Request, Response } from 'express';
40
+ import type { EditorServerRouter } from '../editor-server';
41
+ import type { RouteContext } from './context';
42
+
43
+ /**
44
+ * The one id this door serves, and the one the fork's contribution looks for
45
+ * (`vgaiBlender.contribution.ts`). It is a wire constant shared by two
46
+ * repositories: changing it here without changing it there is a frame that
47
+ * mounts nothing.
48
+ */
49
+ export const FRAME_BRIDGE_MODULE_ID = 'vscode-bridge';
50
+
51
+ export interface ServedModuleAnswer {
52
+ readonly id: string;
53
+ /**
54
+ * The import URL, carrying the file's own mtime in dev and the build's hash
55
+ * when packaged. A changed bridge is a changed URL and therefore a fresh
56
+ * transform; an unchanged one reuses Vite's cache.
57
+ *
58
+ * THE QUERY KEY IS `mtime` AND MAY NEVER BE `v`, and that spelling is the
59
+ * whole of walk 3's session-restart break (measured 2026-09-20). Vite's
60
+ * transform middleware decides its cache header with
61
+ * `DEP_VERSION_RE = /[?&](v=[\w.-]+)\b/` — any `?v=` at all — and answers a
62
+ * match with `Cache-Control: max-age=31536000, immutable`, the header meant
63
+ * for content-addressed dep chunks. So `?v=<mtime>` made the browser keep
64
+ * this module's TRANSFORMED BODY for a year without revalidating, and that
65
+ * body has Vite's rewritten imports baked into it:
66
+ * `…/node_modules/.vite-editor/v2-<key>/deps/react.js?v=<browserHash>`.
67
+ * Close the session, start another, and every ordinary editor module (served
68
+ * `no-cache`) revalidates onto the new generation while the cached bridge
69
+ * replays the old one — two React instances in one page, which the editor
70
+ * reports as `Invalid hook call` / `Cannot read properties of null (reading
71
+ * 'useState')` at `AppRoot`. That is why the documented recovery needed BOTH
72
+ * a fresh browser profile (the poison is the HTTP cache) and
73
+ * `rm -rf node_modules/.vite-editor` (so the stale generation stops
74
+ * resolving). With `mtime` the response is `no-cache`, the browser
75
+ * revalidates against the ETag, and an unchanged bridge still costs one 304.
76
+ */
77
+ readonly url: string;
78
+ }
79
+
80
+ export interface ServedModuleRefusal {
81
+ readonly id: string | null;
82
+ readonly message: string;
83
+ }
84
+
85
+ export function registerServedModuleRoutes(router: EditorServerRouter, ctx: RouteContext): void {
86
+ router.get('/__editor/served-modules', (_req: Request, res: Response) => {
87
+ res.set('Cache-Control', 'no-store');
88
+ const answer = ctx.options.frameBridgeUrl;
89
+ if (answer === undefined) {
90
+ res.json({
91
+ modules: [],
92
+ refusals: [
93
+ {
94
+ id: FRAME_BRIDGE_MODULE_ID,
95
+ message:
96
+ 'This session serves no module graph, so it cannot serve the editor to the Code-OSS ' +
97
+ 'frame (no bundler behind it). `volter-editor edit` sessions — the dev checkout and the ' +
98
+ "project's own installed @vgai/editor — both can.",
99
+ },
100
+ ],
101
+ });
102
+ return;
103
+ }
104
+ let url: string | null;
105
+ try {
106
+ url = answer();
107
+ } catch (error) {
108
+ res.json({
109
+ modules: [],
110
+ refusals: [
111
+ {
112
+ id: FRAME_BRIDGE_MODULE_ID,
113
+ message: error instanceof Error ? error.message : String(error),
114
+ },
115
+ ],
116
+ });
117
+ return;
118
+ }
119
+ if (url === null) {
120
+ res.json({
121
+ modules: [],
122
+ refusals: [
123
+ {
124
+ id: FRAME_BRIDGE_MODULE_ID,
125
+ message:
126
+ 'This session is serving no vgai product, so there is no editor for the Code-OSS ' +
127
+ 'frame to import. A product is the running program — the editor IS ' +
128
+ '@vgai/game-editor or @vgai/model-editor — and which one runs is what the project ' +
129
+ 'installed. Install one and run `volter-editor edit` again:\n' +
130
+ `${PRODUCT_INSTALL_LINES.join('\n')}`,
131
+ },
132
+ ],
133
+ });
134
+ return;
135
+ }
136
+ res.json({ modules: [{ id: FRAME_BRIDGE_MODULE_ID, url }], refusals: [] });
137
+ });
138
+ }
@@ -0,0 +1,196 @@
1
+ /**
2
+ * `/__editor/heartbeat`, the heartbeat worker script, `/__editor/tab/**` and
3
+ * `/__editor/tab-yielded` — the TAB BIJECTION's HTTP surface.
4
+ *
5
+ * Per edited game, one and only one tab: extras yield, a lost tab self-heals,
6
+ * shutdown closes it. These routes are deliberately trivial, because presence
7
+ * has to keep working no matter what is wrong with the rest of the page — the
8
+ * worker POSTs a beat whenever its own socket cannot carry one, and a yielded
9
+ * tab lands on a static page rather than a running editor.
10
+ *
11
+ * The decisions all live in `tab-lifecycle.ts` and the control plane; this
12
+ * module is the doorway.
13
+ */
14
+
15
+ import type { Request, Response } from 'express';
16
+ import { renderEditorBrandPage } from '../editor-brand-html';
17
+ import type { EditorServerRouter } from '../editor-server';
18
+ import { allowCrossOriginFrameEmbedding } from '../server-utils';
19
+ import { readTabBootstrapSource, TAB_BOOTSTRAP_PATH } from '../tab-bootstrap';
20
+ import {
21
+ parseBeat,
22
+ parseTabClose,
23
+ TAB_CLOSE_PATH,
24
+ TAB_HEARTBEAT_WORKER_PATH,
25
+ TAB_HEARTBEAT_WORKER_SOURCE,
26
+ } from '../tab-heartbeat';
27
+ import type { RouteContext } from './context';
28
+ import type { ControlPlane } from './control-plane';
29
+
30
+ export function registerSessionTabRoutes(
31
+ router: EditorServerRouter,
32
+ ctx: RouteContext,
33
+ plane: ControlPlane,
34
+ ): void {
35
+ const { hostTabLifecycle, participantTabLifecycles, tabBijectionOptions, trustedShareIdentity } =
36
+ ctx;
37
+ const { handleTabRoute } = plane;
38
+
39
+ // ---- The tab bootstrap (tab-bootstrap.ts) ----
40
+ //
41
+ // What makes a PAGE a TAB, for a page vgai does not author: the Code-OSS
42
+ // frame loads this exact script — index.html's own inline bootstrap, read
43
+ // out of index.html, never copied — and from there it mints an identity,
44
+ // beats, and departs like any other tab. See tab-bootstrap.ts's header.
45
+ router.get(TAB_BOOTSTRAP_PATH, (_req: Request, res: Response) => {
46
+ let source: string;
47
+ try {
48
+ source = readTabBootstrapSource();
49
+ } catch (error) {
50
+ // A frame that cannot get this script is a tab that never beats, so the
51
+ // failure is stated in the body the page will have in its console —
52
+ // never an empty 200 that looks like it worked.
53
+ res.status(500).type('text/plain').send(String(error));
54
+ return;
55
+ }
56
+ res.setHeader('Content-Type', 'text/javascript; charset=utf-8');
57
+ // Never cached, for the heartbeat worker's reason and one more: Electron's
58
+ // HTTP cache is what made a desktop page straddle two module generations
59
+ // (docs/CODE-OSS.md §Desktop traps), and the bootstrap is the one script
60
+ // whose staleness the session cannot detect.
61
+ res.setHeader('Cache-Control', 'no-store');
62
+ allowCrossOriginFrameEmbedding(res);
63
+ res.send(source);
64
+ });
65
+
66
+ // ---- The tab heartbeat (tab-heartbeat.ts) ----
67
+ //
68
+ // The worker script, and the POST the worker falls back to whenever its own
69
+ // socket cannot carry a beat. Both are deliberately trivial: presence must
70
+ // survive whatever is wrong with the rest of the page.
71
+ router.get(TAB_HEARTBEAT_WORKER_PATH, (_req: Request, res: Response) => {
72
+ res.setHeader('Content-Type', 'text/javascript; charset=utf-8');
73
+ // Never cached: a stale worker is a tab that beats a protocol the server
74
+ // has moved on from, and the file is under 4 KB.
75
+ res.setHeader('Cache-Control', 'no-store');
76
+ allowCrossOriginFrameEmbedding(res);
77
+ res.send(TAB_HEARTBEAT_WORKER_SOURCE);
78
+ });
79
+
80
+ router.post('/__editor/heartbeat', (req: Request, res: Response) => {
81
+ const beat = parseBeat(req.body);
82
+ if (beat === null) {
83
+ res.status(400).json({ error: 'heartbeat requires { tabId, epoch, seq, visibility }' });
84
+ return;
85
+ }
86
+ res.json({ reply: hostTabLifecycle.onBeat(beat) });
87
+ });
88
+
89
+ // THE PAGE'S GOODBYE. `pagehide` → `navigator.sendBeacon`, which is the one
90
+ // transport the browser promises to deliver for a document that is already
91
+ // gone — so this route must do nothing but record and answer. It is what
92
+ // lets the table say `closed`/`reloading` where it could previously only
93
+ // watch the beats stop and call it `crashed`. No response body: a beacon's
94
+ // sender is gone and cannot read one.
95
+ router.post(TAB_CLOSE_PATH, (req: Request, res: Response) => {
96
+ const beacon = parseTabClose(req.body);
97
+ if (beacon === null) {
98
+ res.status(400).json({ error: 'tab close requires { tabId, epoch }' });
99
+ return;
100
+ }
101
+ hostTabLifecycle.onTabClose(beacon);
102
+ for (const lifecycle of participantTabLifecycles.values()) lifecycle?.onTabClose(beacon);
103
+ res.status(204).end();
104
+ });
105
+
106
+ // ---- Tab bijection (one browser tab per edited game — tab-lifecycle.ts) ----
107
+ //
108
+ // POST /__editor/tab/ensure — `vgai edit`/`create`'s idempotent
109
+ // convergence: focus/retarget the blessed tab, wait for an arriving one,
110
+ // or open exactly one. `{ open: false }` (the caller's --no-open) never
111
+ // opens. When bijection is off for this session, answer honestly from the
112
+ // raw SSE count so the CLI can decide for itself.
113
+ router.post('/__editor/tab/ensure', (req: Request, res: Response) => {
114
+ const open = (req.body as { open?: unknown } | undefined)?.['open'] !== false;
115
+ if (!tabBijectionOptions) {
116
+ // Bijection is off for this session, but the TABLE still knows whether
117
+ // a tab is here — answer from it, not from a socket count.
118
+ res.json({
119
+ status: hostTabLifecycle.blessedTabId() !== null ? 'focused' : 'disabled',
120
+ });
121
+ return;
122
+ }
123
+ res.json({ status: hostTabLifecycle.ensure(open) });
124
+ });
125
+
126
+ // POST /__editor/tab/route — the page saying which surface it is showing
127
+ // ('project' = the editor on this session's project; 'no-project' = the
128
+ // launcher or the startup-failure surface). A launcher tab holds the same
129
+ // SSE connection as an editor tab, so the bijection SEES it (before this it
130
+ // held none at all, and the lifecycle happily opened a second tab beside a
131
+ // perfectly good one); the route is what keeps `ensure` honest about
132
+ // whether that tab is on the project yet.
133
+ router.post('/__editor/tab/route', (req: Request, res: Response) => {
134
+ const outcome = handleTabRoute(
135
+ (req.body ?? {}) as Record<string, unknown>,
136
+ trustedShareIdentity(req),
137
+ );
138
+ if (outcome.status === 200) res.json({ ok: true });
139
+ else res.status(outcome.status).json({ error: outcome.error });
140
+ });
141
+
142
+ // POST /__editor/tab/claim — the yield page's "Use here instead": the
143
+ // current blessed tab is told to yield; the claimant reloads `/` and its
144
+ // fresh connection takes the blessing.
145
+ router.post('/__editor/tab/claim', (req: Request, res: Response) => {
146
+ const claimedParticipantId = (req.body as { participantId?: unknown } | undefined)
147
+ ?.participantId;
148
+ const trusted = trustedShareIdentity(req);
149
+ if (
150
+ trusted &&
151
+ typeof claimedParticipantId === 'string' &&
152
+ trusted.participantId !== claimedParticipantId
153
+ ) {
154
+ res.status(403).json({ error: 'A shared tab can only claim its own participant.' });
155
+ return;
156
+ }
157
+ const participantId = trusted?.participantId ?? claimedParticipantId;
158
+ const lifecycle =
159
+ typeof participantId === 'string'
160
+ ? participantTabLifecycles.get(participantId)
161
+ : trusted
162
+ ? undefined
163
+ : hostTabLifecycle;
164
+ lifecycle?.claim();
165
+ res.json({ ok: true });
166
+ });
167
+
168
+ // POST /__editor/tab/expect-restart — a successor server is about to take
169
+ // this port (source-change restart): keep the tab, it will reconnect.
170
+ router.post('/__editor/tab/expect-restart', (_req: Request, res: Response) => {
171
+ for (const lifecycle of new Set([hostTabLifecycle, ...participantTabLifecycles.values()])) {
172
+ lifecycle?.expectRestart();
173
+ }
174
+ res.json({ ok: true });
175
+ });
176
+
177
+ // GET /__editor/tab-yielded — the static page a yielded tab lands on when
178
+ // `window.close()` is refused (user-opened tabs). Minimal on purpose: the
179
+ // editor must never RUN in two tabs for one session.
180
+ router.get('/__editor/tab-yielded', (_req: Request, res: Response) => {
181
+ res.type('html').send(
182
+ renderEditorBrandPage({
183
+ subject: 'Editor open in another tab',
184
+ description: 'This Volter Editor session is active in another browser tab.',
185
+ contentHtml:
186
+ "<h1>Editor open in another tab</h1><p>This game's editor is active elsewhere.</p>" +
187
+ '<button id="claim">Use here instead</button>',
188
+ scriptHtml:
189
+ 'document.getElementById("claim").addEventListener("click",async()=>{' +
190
+ 'const participantId=new URLSearchParams(location.search).get("participantId");' +
191
+ 'try{await fetch("/__editor/tab/claim",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({participantId})})}catch{}' +
192
+ 'location.replace("/")});',
193
+ }),
194
+ );
195
+ });
196
+ }
@@ -0,0 +1,121 @@
1
+ /**
2
+ * THE TWO SHARED SETTINGS LAYERS on disk (ARCHITECTURE-CORE §Editor chrome,
3
+ * "Settings have four layers with named homes"):
4
+ *
5
+ * GET/POST /__editor/settings/user ~/.vgai/settings.json
6
+ * GET/POST /__editor/settings/project <project>/.vgai/settings.json
7
+ *
8
+ * A read validates the file against `EditorSettingsSchema` and, when it does
9
+ * not parse, answers `{ settings: {}, issues }` naming the file's problems so
10
+ * the editor still opens and the person sees exactly what to fix. A write is
11
+ * refused (400, same issues) rather than persisting a document the next read
12
+ * would reject. Whole-document replace, like `/__editor/editor-state`: the
13
+ * client store is the one writer and merges its own patches.
14
+ *
15
+ * The user file's home is `VGAI_USER_SETTINGS_PATH` when set (the same
16
+ * override idiom as `VGAI_ACCOUNT_PATH`), else `~/.vgai/settings.json`.
17
+ */
18
+ import { randomUUID } from 'node:crypto';
19
+ import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
20
+ import { homedir } from 'node:os';
21
+ import { dirname, join, resolve } from 'node:path';
22
+ import type { Request, Response } from 'express';
23
+ import { type EditorSettings, parseEditorSettings } from '@volter/editor-project/settings/schema';
24
+ import type { EditorServerRouter } from '../editor-server';
25
+ import type { RouteContext } from './context';
26
+
27
+ export const USER_SETTINGS_PATH = process.env['VGAI_USER_SETTINGS_PATH']
28
+ ? resolve(process.env['VGAI_USER_SETTINGS_PATH'])
29
+ : join(homedir(), '.vgai', 'settings.json');
30
+
31
+ export function projectSettingsPath(projectRoot: string): string {
32
+ return join(projectRoot, '.vgai', 'settings.json');
33
+ }
34
+
35
+ export interface SettingsFileRead {
36
+ readonly settings: EditorSettings;
37
+ /** Validation problems with the file on disk, empty when it parsed (or is absent). */
38
+ readonly issues: readonly string[];
39
+ readonly path: string;
40
+ }
41
+
42
+ export async function readSettingsFile(path: string): Promise<SettingsFileRead> {
43
+ let raw: string;
44
+ try {
45
+ raw = await readFile(path, 'utf-8');
46
+ } catch {
47
+ return { settings: {}, issues: [], path };
48
+ }
49
+ let parsed: unknown;
50
+ try {
51
+ parsed = JSON.parse(raw);
52
+ } catch (cause) {
53
+ return { settings: {}, issues: [`not JSON: ${(cause as Error).message}`], path };
54
+ }
55
+ const result = parseEditorSettings(parsed);
56
+ return result.settings
57
+ ? { settings: result.settings, issues: [], path }
58
+ : { settings: {}, issues: result.issues, path };
59
+ }
60
+
61
+ const pendingWrites = new Map<string, Promise<void>>();
62
+
63
+ export async function writeSettingsFile(path: string, settings: EditorSettings): Promise<void> {
64
+ const text = `${JSON.stringify(settings, null, 2)}\n`;
65
+ // Applying a style sets several axes in one turn. Concurrent truncating
66
+ // writes used to interleave, leaving a JSON document with another's tail.
67
+ // Order this server's writes and publish atomically for other sessions.
68
+ const write = (pendingWrites.get(path) ?? Promise.resolve())
69
+ .catch(() => {})
70
+ .then(async () => {
71
+ await mkdir(dirname(path), { recursive: true });
72
+ const temporary = `${path}.${randomUUID()}.tmp`;
73
+ try {
74
+ await writeFile(temporary, text, { encoding: 'utf-8', mode: 0o600 });
75
+ await rename(temporary, path);
76
+ } finally {
77
+ await rm(temporary, { force: true });
78
+ }
79
+ });
80
+ pendingWrites.set(path, write);
81
+ try {
82
+ await write;
83
+ } finally {
84
+ if (pendingWrites.get(path) === write) pendingWrites.delete(path);
85
+ }
86
+ }
87
+
88
+ export function registerSettingsRoutes(router: EditorServerRouter, ctx: RouteContext): void {
89
+ const register = (layer: 'user' | 'project', pathFor: () => string | null) => {
90
+ router.get(`/__editor/settings/${layer}`, async (_req: Request, res: Response) => {
91
+ const path = pathFor();
92
+ if (!path) {
93
+ res.json({ settings: {}, issues: [], path: null });
94
+ return;
95
+ }
96
+ res.json(await readSettingsFile(path));
97
+ });
98
+ router.post(`/__editor/settings/${layer}`, async (req: Request, res: Response) => {
99
+ const path = pathFor();
100
+ if (!path) {
101
+ res.status(400).json({ error: 'No project open.' });
102
+ return;
103
+ }
104
+ const result = parseEditorSettings(req.body);
105
+ if (!result.settings) {
106
+ res.status(400).json({ error: `Invalid ${layer} settings.`, issues: result.issues });
107
+ return;
108
+ }
109
+ try {
110
+ await writeSettingsFile(path, result.settings);
111
+ res.json({ ok: true, path });
112
+ } catch (cause) {
113
+ res.status(500).json({ error: `Could not write ${path}: ${(cause as Error).message}` });
114
+ }
115
+ });
116
+ };
117
+ register('user', () => USER_SETTINGS_PATH);
118
+ register('project', () =>
119
+ ctx.projectRoot === ctx.engineRoot ? null : projectSettingsPath(ctx.projectRoot),
120
+ );
121
+ }