@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,357 @@
1
+ /**
2
+ * `/__editor/account/**` — the GLOBAL VGAI account: sign-in, provider
3
+ * credentials, plan/credits/checkout, and the sealed development-twin portal.
4
+ *
5
+ * Never project state: every route here answers the same way whether or not a
6
+ * project is open, which is why this family is registered ahead of the
7
+ * project-serving middleware and is the only one that needs nothing from the
8
+ * session beyond `EditorAccountService`.
9
+ */
10
+
11
+ import express, { type Request, type Response } from 'express';
12
+ import { ProviderCredentialIdSchema } from '@volter/editor-sdk/account';
13
+ import { renderEditorBrandPage } from '../editor-brand-html';
14
+ import type { EditorServerRouter } from '../editor-server';
15
+ import type { RouteContext } from './context';
16
+
17
+ export function registerAccountRoutes(router: EditorServerRouter, ctx: RouteContext): void {
18
+ const { account } = ctx;
19
+
20
+ // ---- Global VGAI account (never project state) ----
21
+ router.get('/__editor/account', async (_req: Request, res: Response) => {
22
+ try {
23
+ res.json(await account.snapshot());
24
+ } catch (error) {
25
+ res.status(502).json({ error: error instanceof Error ? error.message : String(error) });
26
+ }
27
+ });
28
+ router.put(
29
+ '/__editor/account/provider-credentials/:provider',
30
+ async (req: Request, res: Response) => {
31
+ try {
32
+ const parsed = ProviderCredentialIdSchema.safeParse(req.params['provider']);
33
+ const key = (req.body as { key?: unknown }).key;
34
+ if (!parsed.success || typeof key !== 'string') {
35
+ res.status(400).json({ error: 'A supported provider and API key are required.' });
36
+ return;
37
+ }
38
+ res.json(await account.setProviderCredential(parsed.data, key));
39
+ } catch (error) {
40
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
41
+ }
42
+ },
43
+ );
44
+ router.delete(
45
+ '/__editor/account/provider-credentials/:provider',
46
+ async (req: Request, res: Response) => {
47
+ try {
48
+ const parsed = ProviderCredentialIdSchema.safeParse(req.params['provider']);
49
+ if (!parsed.success) {
50
+ res.status(400).json({ error: 'A supported provider is required.' });
51
+ return;
52
+ }
53
+ res.json(await account.deleteProviderCredential(parsed.data));
54
+ } catch (error) {
55
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
56
+ }
57
+ },
58
+ );
59
+ router.post(
60
+ '/__editor/account/provider-credentials/:provider/test',
61
+ async (req: Request, res: Response) => {
62
+ try {
63
+ const parsed = ProviderCredentialIdSchema.safeParse(req.params['provider']);
64
+ if (!parsed.success) {
65
+ res.status(400).json({ error: 'A supported provider is required.' });
66
+ return;
67
+ }
68
+ res.json(await account.testProviderCredential(parsed.data));
69
+ } catch (error) {
70
+ res.status(502).json({ error: error instanceof Error ? error.message : String(error) });
71
+ }
72
+ },
73
+ );
74
+ router.post('/__editor/account/mock-session', async (req: Request, res: Response) => {
75
+ try {
76
+ const body = req.body as { email?: unknown };
77
+ if (typeof body.email !== 'string') {
78
+ res.status(400).json({ error: 'email is required' });
79
+ return;
80
+ }
81
+ res.status(201).json(await account.signInMock(body.email));
82
+ } catch (error) {
83
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
84
+ }
85
+ });
86
+ // Managed sign-in against the deployed twin (placeholder IdP). Active only when the
87
+ // editor is launched with VGAI_TWIN_URL set; otherwise signInTwin throws a loud 400.
88
+ router.post('/__editor/account/twin-session', async (req: Request, res: Response) => {
89
+ try {
90
+ const body = req.body as { email?: unknown };
91
+ if (typeof body.email !== 'string') {
92
+ res.status(400).json({ error: 'email is required' });
93
+ return;
94
+ }
95
+ res.status(201).json(await account.signInTwin(body.email));
96
+ } catch (error) {
97
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
98
+ }
99
+ });
100
+ router.delete('/__editor/account/session', async (_req: Request, res: Response) => {
101
+ res.json(await account.signOut());
102
+ });
103
+ router.put('/__editor/account/spend-policy', async (req: Request, res: Response) => {
104
+ try {
105
+ res.json(await account.updateSpendPolicy(req.body));
106
+ } catch (error) {
107
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
108
+ }
109
+ });
110
+ router.put('/__editor/account/execution-route', async (req: Request, res: Response) => {
111
+ try {
112
+ const route = (req.body as { route?: unknown }).route;
113
+ if (route !== 'auto' && route !== 'mock' && route !== 'managed' && route !== 'byok') {
114
+ res.status(400).json({ error: 'route must be auto, mock, managed, or byok' });
115
+ return;
116
+ }
117
+ res.json(await account.setPreferredRoute(route));
118
+ } catch (error) {
119
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
120
+ }
121
+ });
122
+ router.put('/__editor/account/coding-inference', async (req: Request, res: Response) => {
123
+ try {
124
+ res.json(await account.setCodingInference(req.body));
125
+ } catch (error) {
126
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
127
+ }
128
+ });
129
+ router.post('/__editor/account/coding-inference/quote', async (req: Request, res: Response) => {
130
+ try {
131
+ res.json(await account.quoteCodingInference(req.body));
132
+ } catch (error) {
133
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
134
+ }
135
+ });
136
+ router.post('/__editor/account/checkout', async (req: Request, res: Response) => {
137
+ try {
138
+ const idempotencyKey = req.get('Idempotency-Key');
139
+ if (!idempotencyKey) {
140
+ res.status(400).json({ error: 'Idempotency-Key is required.' });
141
+ return;
142
+ }
143
+ res.json(
144
+ await account.checkout(String((req.body as { plan?: unknown }).plan ?? ''), idempotencyKey),
145
+ );
146
+ } catch (error) {
147
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
148
+ }
149
+ });
150
+ router.put('/__editor/account/plan', async (req: Request, res: Response) => {
151
+ try {
152
+ const action = (req.body as { action?: unknown }).action;
153
+ if (action !== 'cancel' && action !== 'resume') {
154
+ res.status(400).json({ error: 'action must be cancel or resume' });
155
+ return;
156
+ }
157
+ res.json(await account.updatePlan(action));
158
+ } catch (error) {
159
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
160
+ }
161
+ });
162
+ router.post('/__editor/account/credits', async (req: Request, res: Response) => {
163
+ try {
164
+ const idempotencyKey = req.get('Idempotency-Key');
165
+ if (!idempotencyKey) {
166
+ res.status(400).json({ error: 'Idempotency-Key is required.' });
167
+ return;
168
+ }
169
+ res.json(
170
+ await account.purchaseCredits(
171
+ String((req.body as { packId?: unknown }).packId ?? ''),
172
+ idempotencyKey,
173
+ ),
174
+ );
175
+ } catch (error) {
176
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
177
+ }
178
+ });
179
+ router.get('/__editor/account/usage', async (_req: Request, res: Response) => {
180
+ try {
181
+ res.json({ entries: await account.accountUsage() });
182
+ } catch (error) {
183
+ res.status(502).json({ error: error instanceof Error ? error.message : String(error) });
184
+ }
185
+ });
186
+ router.get('/__editor/account/catalog', async (_req: Request, res: Response) => {
187
+ try {
188
+ res.json(await account.accountCatalog());
189
+ } catch (error) {
190
+ res.status(502).json({ error: error instanceof Error ? error.message : String(error) });
191
+ }
192
+ });
193
+ router.post('/__editor/account/billing-portal', async (_req: Request, res: Response) => {
194
+ try {
195
+ res.json(await account.billingPortal());
196
+ } catch (error) {
197
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
198
+ }
199
+ });
200
+ router.post('/__editor/account/checkout/confirm', async (req: Request, res: Response) => {
201
+ try {
202
+ res.json(
203
+ await account.confirmCheckout(
204
+ String((req.body as { checkoutId?: unknown }).checkoutId ?? ''),
205
+ ),
206
+ );
207
+ } catch (error) {
208
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
209
+ }
210
+ });
211
+ router.get('/__editor/account/twin-portal', async (_req: Request, res: Response) => {
212
+ const snapshot = await account.snapshot();
213
+ if (!snapshot.authenticated || snapshot.accountEnvironment !== 'development-twin') {
214
+ res.status(404).send('Not found.');
215
+ return;
216
+ }
217
+ const escapeHtml = (value: string) =>
218
+ value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');
219
+ res
220
+ .status(200)
221
+ .type('html')
222
+ .set('Cache-Control', 'no-store')
223
+ .set(
224
+ 'Content-Security-Policy',
225
+ "default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; frame-ancestors 'none'",
226
+ )
227
+ .send(
228
+ `<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>Polar Twin portal</title><style>body{margin:0;background:#0d1017;color:#eef2ff;font:15px system-ui;display:grid;place-items:center;min-height:100vh}.card{width:min(520px,calc(100vw - 48px));padding:28px;border:1px solid #30394a;border-radius:14px;background:#151a24}h1{margin:0 0 18px;font-size:21px}.row{display:flex;justify-content:space-between;padding:12px 0;border-top:1px solid #293142}.muted{color:#97a1b4}.badge{display:inline-block;padding:4px 8px;border-radius:999px;background:#26334a;color:#9dc1ff;font-size:12px}a{display:inline-block;margin-top:20px;color:#a9c2ff}</style></head><body><main class="card"><span class="badge">SEALED POLAR TWIN</span><h1>Billing and invoices</h1><div class="row"><span class="muted">Account</span><strong>${escapeHtml(snapshot.user.email)}</strong></div><div class="row"><span class="muted">Plan</span><strong>${escapeHtml(snapshot.plan.name)}</strong></div><div class="row"><span class="muted">Included credits</span><strong>${snapshot.credits.included.toLocaleString()}</strong></div><div class="row"><span class="muted">Purchased credits</span><strong>${snapshot.credits.purchased.toLocaleString()}</strong></div><p class="muted">This local mirror contains fake Twin state only. Subscription changes remain in Volter Editor's Account document so they exercise the same account API as production.</p><a href="/">Return to Volter Editor</a></main></body></html>`,
229
+ );
230
+ });
231
+ router.get('/__editor/account/twin-checkout', async (req: Request, res: Response) => {
232
+ const checkoutId = String(req.query['checkout_id'] ?? '');
233
+ if (!/^[A-Za-z0-9_-]{1,200}$/.test(checkoutId)) {
234
+ res.status(400).send('Invalid Twin checkout id.');
235
+ return;
236
+ }
237
+ res
238
+ .status(200)
239
+ .type('html')
240
+ .set('Cache-Control', 'no-store')
241
+ .set(
242
+ 'Content-Security-Policy',
243
+ "default-src 'none'; style-src 'unsafe-inline'; form-action 'self'; base-uri 'none'; frame-ancestors 'none'",
244
+ )
245
+ .send(
246
+ `<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>Polar Twin checkout</title><style>body{margin:0;background:#0d1017;color:#eef2ff;font:15px system-ui;display:grid;place-items:center;min-height:100vh}.card{width:min(440px,calc(100vw - 48px));padding:28px;border:1px solid #30394a;border-radius:14px;background:#151a24;box-shadow:0 20px 70px #0008}h1{font-size:21px;margin:0 0 8px}p{color:#aeb7c8;line-height:1.5}.badge{display:inline-block;padding:4px 8px;border-radius:999px;background:#26334a;color:#9dc1ff;font-size:12px}button,a{display:inline-block;margin-top:14px;padding:10px 14px;border-radius:8px;border:0;background:#6d8dff;color:white;font-weight:650;text-decoration:none;cursor:pointer}small{display:block;margin-top:18px;color:#778196}</style></head><body><main class="card"><span class="badge">SEALED DEVELOPMENT TWIN</span><h1>Confirm fake Polar checkout</h1><p>This exercises Volter Editor's real checkout intent, fulfillment, and credit ledger without contacting a payment network.</p><form method="post" action="/__editor/account/twin-checkout"><input type="hidden" name="checkout_id" value="${checkoutId}"><button type="submit">Confirm fake payment</button></form><small>No card or live provider credential is used.</small></main></body></html>`,
247
+ );
248
+ });
249
+ router.post(
250
+ '/__editor/account/twin-checkout',
251
+ express.urlencoded({ extended: false, limit: '4kb' }),
252
+ async (req: Request, res: Response) => {
253
+ try {
254
+ await account.confirmTwinCheckout(
255
+ String((req.body as { checkout_id?: unknown }).checkout_id ?? ''),
256
+ );
257
+ res.redirect(303, '/');
258
+ } catch (error) {
259
+ res.status(400).send(error instanceof Error ? error.message : String(error));
260
+ }
261
+ },
262
+ );
263
+ router.post('/__editor/account/alerts/read', async (_req: Request, res: Response) => {
264
+ try {
265
+ res.json(await account.markAlertsRead());
266
+ } catch (error) {
267
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
268
+ }
269
+ });
270
+ router.post('/__editor/account/browser-authorization', async (req: Request, res: Response) => {
271
+ try {
272
+ const origin = req.headers.origin;
273
+ if (typeof origin !== 'string') {
274
+ res.status(400).json({ error: 'Browser sign-in requires the editor Origin header.' });
275
+ return;
276
+ }
277
+ res.status(201).json(await account.beginBrowserAuthorization(origin));
278
+ } catch (error) {
279
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
280
+ }
281
+ });
282
+ router.get('/__editor/account/authorization-methods', async (_req: Request, res: Response) => {
283
+ try {
284
+ res.json(await account.authorizationMethods());
285
+ } catch (error) {
286
+ res.status(502).json({ error: error instanceof Error ? error.message : String(error) });
287
+ }
288
+ });
289
+ router.get(
290
+ '/__editor/account/browser-authorization/callback',
291
+ async (req: Request, res: Response) => {
292
+ const state = typeof req.query['state'] === 'string' ? req.query['state'] : '';
293
+ const code = typeof req.query['code'] === 'string' ? req.query['code'] : '';
294
+ const providerError = typeof req.query['error'] === 'string' ? req.query['error'] : undefined;
295
+ try {
296
+ if (state && providerError) {
297
+ account.failBrowserAuthorization(state, `Account authorization failed: ${providerError}`);
298
+ throw new Error('The account provider rejected authorization.');
299
+ }
300
+ if (!state || !code) throw new Error('The account callback is missing code or state.');
301
+ await account.completeBrowserAuthorization(state, code);
302
+ res
303
+ .status(200)
304
+ .type('html')
305
+ .send(
306
+ renderEditorBrandPage({
307
+ subject: 'Signed in',
308
+ description: 'Volter account authorization is complete.',
309
+ contentHtml:
310
+ '<h1>Signed in to Volter Editor</h1><p>You can close this tab and return to the editor.</p>',
311
+ }),
312
+ );
313
+ } catch {
314
+ res
315
+ .status(400)
316
+ .type('html')
317
+ .send(
318
+ renderEditorBrandPage({
319
+ subject: 'Sign-in failed',
320
+ description: 'Volter account authorization did not complete.',
321
+ contentHtml: '<h1>Sign-in failed</h1><p>Return to the editor and try again.</p>',
322
+ }),
323
+ );
324
+ }
325
+ },
326
+ );
327
+ router.get('/__editor/account/browser-authorization/:id', async (req: Request, res: Response) => {
328
+ try {
329
+ const parameter = req.params['id'];
330
+ const id = Array.isArray(parameter) ? (parameter[0] ?? '') : (parameter ?? '');
331
+ const result = await account.pollBrowserAuthorization(id);
332
+ res.status(result.pending ? 202 : 200).json(result);
333
+ } catch (error) {
334
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
335
+ }
336
+ });
337
+ router.post('/__editor/account/device-authorization', async (_req: Request, res: Response) => {
338
+ try {
339
+ res.status(201).json(await account.beginDeviceAuthorization());
340
+ } catch (error) {
341
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
342
+ }
343
+ });
344
+ router.get(
345
+ '/__editor/account/device-authorization/:code',
346
+ async (req: Request, res: Response) => {
347
+ try {
348
+ const parameter = req.params['code'];
349
+ const code = Array.isArray(parameter) ? (parameter[0] ?? '') : (parameter ?? '');
350
+ const result = await account.pollDeviceAuthorization(code);
351
+ res.status(result.pending ? 202 : 200).json(result);
352
+ } catch (error) {
353
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
354
+ }
355
+ },
356
+ );
357
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * `/__editor/project-work/**` — the project's own work tracker.
3
+ *
4
+ * The coding-harness Chat's HTTP seam (`/__editor/harness-chat/**`) and its
5
+ * optional tmux display lane (`/__editor/harness-terminal/**`) were removed with
6
+ * the browser panel that was their only caller: the AI in the tab is the
7
+ * workbench's own Chat view now, filled by the bundled supercode frontend, which
8
+ * talks to the runtime directly over `frontend.v2` and needs no route of ours
9
+ * (ARCHITECTURE-CORE §The core is Code-OSS, rule 7). The harness SERVICE stays —
10
+ * a collaboration room's `@agent` dispatch and the worktree switch both drive it
11
+ * (`routes/collaboration.ts`, `routes/worktrees.ts`), and the session's frontend
12
+ * handoff starts the runtime it hands over.
13
+ */
14
+
15
+ import type { Request, Response } from 'express';
16
+ import type { ProjectWorkAction } from '../../src/project-work-types';
17
+ import type { EditorServerRouter } from '../editor-server';
18
+ import type { RouteContext } from './context';
19
+
20
+ export function registerAgentRoutes(router: EditorServerRouter, ctx: RouteContext): void {
21
+ const { projectWork } = ctx;
22
+
23
+ // ---- Project Work (ztrack × the existing Supercode controller) ----
24
+ router.get('/__editor/project-work', (_req: Request, res: Response) => {
25
+ res.json(projectWork.snapshot());
26
+ });
27
+
28
+ router.post('/__editor/project-work/action', (req: Request, res: Response) => {
29
+ try {
30
+ const body = req.body as Partial<ProjectWorkAction> | undefined;
31
+ if (
32
+ body?.type !== 'context' ||
33
+ typeof body.issueId !== 'string' ||
34
+ !body.issueId.trim() ||
35
+ body.issueId.length > 200
36
+ ) {
37
+ throw new Error('Project Work action requires { type: "context", issueId }.');
38
+ }
39
+ res.json({ context: projectWork.contextForIssue(body.issueId) });
40
+ } catch (error) {
41
+ res.status(400).json({ error: error instanceof Error ? error.message : String(error) });
42
+ }
43
+ });
44
+
45
+ router.get('/__editor/project-work/extension/:hash.js', (req: Request, res: Response) => {
46
+ const hash = req.params['hash'];
47
+ if (typeof hash !== 'string' || !/^[0-9a-f]{64}$/.test(hash)) {
48
+ res.status(404).end();
49
+ return;
50
+ }
51
+ const code = projectWork.extension(hash);
52
+ if (!code) {
53
+ res.status(404).end();
54
+ return;
55
+ }
56
+ res.setHeader('Content-Type', 'text/javascript; charset=utf-8');
57
+ res.setHeader('Cache-Control', 'private, max-age=31536000, immutable');
58
+ res.send(code);
59
+ });
60
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Listing and serving BINARY project content, plus the engine-repo thumbnails
3
+ * the New Project screen shows: `/__editor/project-components`,
4
+ * `/__editor/assets`, `/__editor/download`, `/__editor/learn-thumbnail`.
5
+ *
6
+ * Online asset BROWSING is a separate router
7
+ * (`asset-library-routes.ts`, mounted at `/__editor/asset-library`); this
8
+ * family is the local half — what is already in the project, and what the
9
+ * engine checkout itself ships.
10
+ */
11
+
12
+ import { readdir, readFile, stat } from 'node:fs/promises';
13
+ import { join } from 'node:path';
14
+ import { WEB_BUILD_ARTIFACT } from '@volter/editor-sdk/session/build-report';
15
+ import { isContainedRelativePath } from '@volter/editor-sdk/session/relative-path-guard';
16
+ import type { Request, Response } from 'express';
17
+ import type { EditorServerRouter } from '../editor-server';
18
+ import { projectBuildArtifactPath } from '../project-build-artifact';
19
+ import {
20
+ assetListingErrorResponse,
21
+ isCanonicalPathInside,
22
+ isPathInside,
23
+ resolveListedAssetRoot,
24
+ sanitizeContentDispositionFilename,
25
+ } from '../server-utils';
26
+ import type { RouteContext } from './context';
27
+
28
+ interface AssetEntry {
29
+ name: string;
30
+ type: 'file' | 'directory';
31
+ size: number;
32
+ mtime: number;
33
+ }
34
+
35
+
36
+ export function registerAssetRoutes(router: EditorServerRouter, ctx: RouteContext): void {
37
+ const { currentProjectComponents, engineRoot, trustedShareIdentity } = ctx;
38
+
39
+ // ---- Asset listing ----
40
+ router.get('/__editor/project-components', async (_req: Request, res: Response) => {
41
+ if (ctx.projectRoot === engineRoot) {
42
+ res.json({ components: [] });
43
+ return;
44
+ }
45
+ res.json({ components: await currentProjectComponents() });
46
+ });
47
+
48
+ router.get('/__editor/assets', async (req: Request, res: Response) => {
49
+ const dir = (req.query['dir'] as string) ?? '';
50
+ // `root` names WHICH of the project's asset roots to list — `public` (the
51
+ // default, and what every existing caller means) or `references`. It is an
52
+ // enum, never a path: the directory is resolved from the open project by
53
+ // `resolveListedAssetRoot`, so nothing a client sends can widen the scope.
54
+ const rootName = (req.query['root'] as string) ?? 'public';
55
+ if (rootName !== 'public' && rootName !== 'references') {
56
+ res.status(400).json({ error: 'Unknown asset root.' });
57
+ return;
58
+ }
59
+
60
+ // `dir === ''` IS the root listing and stays legal; everything else must be
61
+ // a contained project-relative path. (The old pair was `includes('..')`,
62
+ // which rejected a legitimate `..bak` folder, plus `rel.startsWith('..')`,
63
+ // which did the same one layer down.)
64
+ if (dir !== '' && !isContainedRelativePath(dir)) {
65
+ res.status(400).json({ error: 'Path traversal not allowed.' });
66
+ return;
67
+ }
68
+
69
+ const absRoot = resolveListedAssetRoot(ctx.projectRoot, engineRoot, rootName);
70
+ const absDir = join(absRoot, dir);
71
+
72
+ if (!isPathInside(absRoot, absDir)) {
73
+ res.status(400).json({ error: 'Path outside root.' });
74
+ return;
75
+ }
76
+
77
+ try {
78
+ if (trustedShareIdentity(req) && !(await isCanonicalPathInside(absRoot, absDir))) {
79
+ res.status(403).json({ error: 'Shared asset path leaves the public project root.' });
80
+ return;
81
+ }
82
+ const dirents = await readdir(absDir, { withFileTypes: true });
83
+ const entries: AssetEntry[] = [];
84
+
85
+ for (const d of dirents) {
86
+ if (d.name.startsWith('.')) continue;
87
+ const entryPath = join(absDir, d.name);
88
+ const s = await stat(entryPath);
89
+ if (d.isDirectory()) {
90
+ entries.push({ name: d.name, type: 'directory', size: 0, mtime: s.mtimeMs });
91
+ } else if (d.isFile()) {
92
+ entries.push({ name: d.name, type: 'file', size: s.size, mtime: s.mtimeMs });
93
+ }
94
+ }
95
+
96
+ entries.sort((a, b) => {
97
+ if (a.type !== b.type) return a.type === 'directory' ? -1 : 1;
98
+ return a.name.localeCompare(b.name);
99
+ });
100
+
101
+ res.json({ entries });
102
+ } catch (err: unknown) {
103
+ // S-8: a project with NO `public/` at all lists empty, it does not fail
104
+ // (see `assetListingErrorResponse` for why that is the true answer, and
105
+ // why a named subdirectory still 404s).
106
+ const outcome = assetListingErrorResponse(dir, (err as NodeJS.ErrnoException).code);
107
+ if (outcome.kind === 'empty') res.json({ entries: [] });
108
+ else res.status(outcome.status).json({ error: outcome.message });
109
+ }
110
+ });
111
+
112
+ // ---- Download build artifact ----
113
+ router.get('/__editor/download', async (req: Request, res: Response) => {
114
+ const file = (req.query['file'] as string) ?? '';
115
+
116
+ if (!isContainedRelativePath(file) || file.includes('/')) {
117
+ res.status(400).json({ error: 'Invalid file.' });
118
+ return;
119
+ }
120
+
121
+ if (file !== WEB_BUILD_ARTIFACT) {
122
+ res.status(404).json({ error: 'Unknown build artifact.' });
123
+ return;
124
+ }
125
+ const absPath = projectBuildArtifactPath(ctx.projectRoot);
126
+
127
+ try {
128
+ const data = await readFile(absPath);
129
+ const s = await stat(absPath);
130
+ res.writeHead(200, {
131
+ 'Content-Type': 'application/octet-stream',
132
+ // S7: strip control/quote chars from the user-supplied filename.
133
+ 'Content-Disposition': `attachment; filename="${sanitizeContentDispositionFilename(file)}"`,
134
+ 'Content-Length': s.size,
135
+ });
136
+ res.end(data);
137
+ } catch {
138
+ res.status(404).json({ error: 'File not found.' });
139
+ }
140
+ });
141
+ // ---- Registry/learn thumbnails (G4) ----
142
+ // Template-registry entries and example `learn` blocks reference their
143
+ // thumbnails as ENGINE-REPO-RELATIVE paths (data, not URLs — FT-11 keeps
144
+ // them regenerable in place). This read-only route serves those images so
145
+ // the wizard gallery can consume the paths generically with zero hardcoded
146
+ // directories. It is NOT a static file server: only paths the registry or
147
+ // an example manifest actually declares are servable (the §5 intent), and
148
+ // symlinks may not carry a read outside the engine root.
149
+ //
150
+ // Allowlist cache: declared PATHS only change with a registry/manifest
151
+ // edit, which in every supported flow comes with a server restart (G3's
152
+ // thumbnail regeneration rewrites the FILES, not the paths). Lazy so a
153
+ // deployment without examples/registry costs nothing until first use.
154
+ }
@@ -0,0 +1,13 @@
1
+ /** New-project choices belong to the running product. */
2
+ import type { Request, Response } from 'express';
3
+ import type { EditorServerRouter } from '../editor-server';
4
+ import { sessionCreatePresets } from '../product-presets';
5
+ import type { RouteContext } from './context';
6
+ export function registerBuildRoutes(router: EditorServerRouter, ctx: RouteContext): void {
7
+ router.get('/__editor/templates', async (_req: Request, res: Response) => {
8
+ try {
9
+ const presets = await sessionCreatePresets(ctx.projectRoot);
10
+ res.json({ templates: (presets?.declaration.templates ?? []).map(t => ({ id: t.id, title: t.name, description: t.description ?? '', source: `template:${t.id}` })) });
11
+ } catch (error) { res.status(500).json({error: error instanceof Error ? error.message : String(error)}); }
12
+ });
13
+ }