@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,653 @@
1
+ import {
2
+ type ProviderModeResolver,
3
+ withProviderExecution,
4
+ } from '@volter/editor-sdk/tools/provider-execution';
5
+ import type { EditorAccountService } from './account-service';
6
+ import { readGenerationJobs } from './generation-jobs';
7
+ /**
8
+ * Registered project-tool discovery and execution.
9
+ *
10
+ * Project modules stay ordinary TS/JS. This server-side boundary is the only
11
+ * loader: it reads explicit `package.json#vgai.tools` registrations, asks the
12
+ * owning Vite server to load each callable module in Node, validates the
13
+ * exported ToolDefinition, and dispatches through the existing internal SDK
14
+ * registry.
15
+ *
16
+ * CALLABLES are enumerated (`vgai.tools`); the project's own CONTRIBUTION
17
+ * MODULES are found by walking `src/contributions/` for the naming convention
18
+ * (`isToolContributionModule`); a DEPENDENCY's contribution modules are the
19
+ * ones it enumerates under its own `package.json#vgai.contributions`
20
+ * (`packageContributionModules`). They are still separate browser modules and
21
+ * are never imported here, merely listed.
22
+ */
23
+
24
+ import { readdir, readFile, realpath, stat } from 'node:fs/promises';
25
+ import { dirname, join, relative, resolve, sep } from 'node:path';
26
+ import type { ProductIdentity } from '@volter/editor-sdk/session/product-locator';
27
+ import type { z } from 'zod';
28
+ import type { GenerationJob, GenerationToolContribution } from '@volter/editor-sdk/generations';
29
+ import type {
30
+ ProjectToolCatalog,
31
+ ProjectToolCatalogEntry,
32
+ ProjectToolContribution,
33
+ ProjectToolLoadError,
34
+ } from '@volter/editor-sdk/project-tool-catalog';
35
+ import { noProjectModuleHostError } from '@volter/editor-sdk/project-tool-catalog';
36
+ import type { ToolDefinition, ToolOutcome } from '@volter/editor-sdk/tools/registry';
37
+ import { ToolRegistry } from '@volter/editor-sdk/tools/registry';
38
+ import { applyGenerationContribution } from './generation-jobs';
39
+ import { runWithGenerativeExecutionCapture } from './generative-execution-context';
40
+ import {
41
+ createProjectOutputWriter,
42
+ reconcileAcceptedGenerationProvenance,
43
+ } from './project-output-writer';
44
+ import { isToolContributionModule } from './server-utils';
45
+ import { productComposedPackages, sessionProduct } from './session-product';
46
+
47
+ export type ProjectModuleLoader = (absoluteModuleId: string) => Promise<unknown>;
48
+ export type {
49
+ ProjectToolCatalog,
50
+ ProjectToolCatalogEntry,
51
+ ProjectToolContribution,
52
+ ToolContributionPoint,
53
+ } from '@volter/editor-sdk/project-tool-catalog';
54
+
55
+ interface LoadedCatalog extends ProjectToolCatalog {
56
+ definitions: Map<string, ToolDefinition>;
57
+ generationContributions: Map<string, GenerationToolContribution>;
58
+ }
59
+
60
+ interface ToolModule {
61
+ absolutePath: string;
62
+ sourcePath: string;
63
+ registrationError?: string;
64
+ }
65
+
66
+ type ToolRegistration = string | { entry: string };
67
+
68
+ interface PackageJsonShape {
69
+ name?: string;
70
+ dependencies?: Record<string, string>;
71
+ devDependencies?: Record<string, string>;
72
+ vgai?: { tools?: ToolRegistration[]; contributions?: unknown };
73
+ }
74
+
75
+ async function readPackageJson(path: string): Promise<PackageJsonShape | null> {
76
+ try {
77
+ return JSON.parse(await readFile(path, 'utf8')) as PackageJsonShape;
78
+ } catch {
79
+ return null;
80
+ }
81
+ }
82
+
83
+ function registrationEntry(registration: ToolRegistration): string | null {
84
+ return typeof registration === 'string' ? registration : registration?.entry;
85
+ }
86
+
87
+ function validRelativeModule(spec: unknown): spec is string {
88
+ return typeof spec === 'string' && spec.startsWith('./') && !spec.includes('..');
89
+ }
90
+
91
+ /**
92
+ * Every contribution module below one directory, by the naming convention.
93
+ *
94
+ * Nothing lists these. A manifest listing them was a fact that lived in two
95
+ * places — the file exists AND the file is named — and the second copy was the
96
+ * only one that could ever be wrong. `directory` is walked recursively so a
97
+ * dependency may organise its UI however it likes (`src/editor/` today).
98
+ */
99
+ async function scanContributionModules(directory: string): Promise<string[]> {
100
+ let entries: import('node:fs').Dirent[];
101
+ try {
102
+ entries = (await readdir(directory, { withFileTypes: true })) as import('node:fs').Dirent[];
103
+ } catch {
104
+ return [];
105
+ }
106
+ const found: string[] = [];
107
+ for (const entry of entries) {
108
+ if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;
109
+ const absolute = join(directory, entry.name);
110
+ if (entry.isDirectory()) {
111
+ found.push(...(await scanContributionModules(absolute)));
112
+ } else if (entry.isFile() && isToolContributionModule(entry.name)) {
113
+ found.push(absolute);
114
+ }
115
+ }
116
+ return found;
117
+ }
118
+
119
+ /** Project-source contributions: `src/contributions/`, project-relative paths. */
120
+ async function projectContributionModules(projectRoot: string): Promise<ProjectToolContribution[]> {
121
+ const found = await scanContributionModules(resolve(projectRoot, 'src', 'contributions'));
122
+ return found
123
+ .map((absolute) => ({ entryPath: relative(projectRoot, absolute).split(sep).join('/') }))
124
+ .sort((a, b) => a.entryPath.localeCompare(b.entryPath));
125
+ }
126
+
127
+ /**
128
+ * A DEPENDENCY's contributions — the plug-in door of the universal editor
129
+ * (ARCHITECTURE-CORE §The universal editor, owner ruling 2026-09-15): a skew
130
+ * package (`@volter/editor-blender`, `@vgai/production`, …) enumerates its contribution
131
+ * modules under its own `package.json#vgai.contributions`, and the editor
132
+ * lists them for every dependency the OPEN PROJECT DECLARES.
133
+ *
134
+ * Declared, never scanned. There is still no walk of `node_modules`: a
135
+ * package that is not in the project's `dependencies`/`devDependencies`
136
+ * contributes nothing however it got installed, and a package that is
137
+ * declared contributes only what it enumerates — the same explicit
138
+ * registration idiom `vgai.tools` uses for callables. That is what keeps the
139
+ * surface visible: `package.json` names the package, the package's own
140
+ * `package.json` names the modules, and both are ordinary files a person
141
+ * reads. Entries are `./`-relative modules by the contribution naming
142
+ * convention; anything else is reported by name, never skipped silently.
143
+ *
144
+ * Paths are absolute (realpath, so a linked workspace package serves from
145
+ * its checkout) — `ProjectToolContribution.entryPath` was defined as
146
+ * "project-relative or package-absolute" for exactly this. A package is
147
+ * located by walking `node_modules` up from the project the way Node does
148
+ * (a workspace member's dependency is hoisted to the monorepo root), and
149
+ * NOT through `require.resolve`: that caches per process, and a long-lived
150
+ * editor server kept answering a package's OLD path after it was replaced
151
+ * on disk (measured 2026-09-15).
152
+ */
153
+ async function locatePackageJson(fromDir: string, name: string): Promise<string | null> {
154
+ let dir = fromDir;
155
+ for (;;) {
156
+ const candidate = join(dir, 'node_modules', ...name.split('/'), 'package.json');
157
+ try {
158
+ if ((await stat(candidate)).isFile()) return await realpath(candidate);
159
+ } catch {
160
+ /* not here; try the parent */
161
+ }
162
+ const parent = dirname(dir);
163
+ if (parent === dir) return null;
164
+ dir = parent;
165
+ }
166
+ }
167
+
168
+ /**
169
+ * PACKAGES THE EDITOR SHIPS FOR EVERY PROJECT IT OPENS, whatever the project's
170
+ * roots or its declared dependencies — "what is part of the editing SESSION
171
+ * itself", which no manifest can imply because it is not about the project at
172
+ * all: the agent-conversation surface is chrome over the worktree the editor is
173
+ * open on, the way the console and the status bar are.
174
+ *
175
+ * WHAT A PROJECT NEEDS TO RUN IS THE PROJECT'S OWN DECLARATION and nothing
176
+ * else. A list here used to IMPLY a lane from the manifest's roots —
177
+ * `@vgai/game` and `@vgai/dom` — resolved out of the EDITOR's own `node_modules` when the
178
+ * project declared none. It is deleted: the kit names no package (ARCHITECTURE-
179
+ * CORE §The target shape, rule 1), and the packages a session mounts beyond the
180
+ * project's own are the PRODUCT's, already in its bundle.
181
+ *
182
+ * `@vgai/asset-library` joins it on the same test and for the same reason
183
+ * (2026-09-18, phase 1 unit 10). The Library panel is a STOREFRONT the editor
184
+ * carries: it reaches our hosted catalog and it opens with a project that has
185
+ * no content at all, so no manifest can imply it — importing a result into the
186
+ * project is the last step, not the subject, exactly as the agent chat's
187
+ * subject is the harness and not the worktree it writes. It was a host static
188
+ * panel until that unit, present in every project whatever its manifest said,
189
+ * and this line is what keeps that true now that its surface is a package.
190
+ *
191
+ * THE PRODUCT ANSWERS SEPARATELY, and the difference is deliberate: a product
192
+ * bundles what its own entry composes (`packages/game-editor/src/index.ts`), so
193
+ * the model editor carries neither this package nor the game lane, and each
194
+ * panel's place renders the honest emptiness a chrome slot with no filler
195
+ * gives. This list is the SESSION's own answer, for chrome that is about the
196
+ * worktree rather than about the project.
197
+ *
198
+ * `@vgai/collaboration` joined on the same test (2026-09-19, phase 1 unit 15).
199
+ * Who is in a live editor SESSION is a fact about the session, not about the
200
+ * project: the people control and the presence publisher are wanted by a
201
+ * modeling-only worktree exactly as much as by a game, and no manifest could
202
+ * imply them.
203
+ */
204
+ // Empty since the launch-scope sweep (2026-09-20): `@vgai/agents`,
205
+ // `@vgai/asset-library` and `@vgai/collaboration` are archived at
206
+ // `archive/launch-scope-2026-09-20`; a session package returns here with them.
207
+ const SESSION_PACKAGES: readonly string[] = [];
208
+
209
+ /**
210
+ * EVERY PACKAGE THIS SESSION MOUNTS, from the two places one can come from.
211
+ *
212
+ * 1. THE PRODUCT'S COMPOSITION. `@vgai/game-editor`'s and
213
+ * `@vgai/model-editor`'s entries name the packages they mount in code, and
214
+ * those names are the product's own dependencies (the estate gate is what
215
+ * keeps the manifest equal to the composition —
216
+ * `scripts/validate-package-estate.mjs`, `productComposedPackages`). They
217
+ * resolve from the PRODUCT's install, so a project declaring none of them
218
+ * still opens in a whole editor. This is what the manifest-implied lanes
219
+ * used to do badly: they guessed five packages from a project's ROOTS and
220
+ * resolved them out of the editor's own tree, so every project got every
221
+ * lane (WORK.md step 3's census, count three).
222
+ *
223
+ * A product's package is listed by its PACKAGE SPECIFIER, not by path,
224
+ * because those modules are already in the product's bundle — the page
225
+ * imports them through the loader the product registered rather than
226
+ * fetching a second copy through `/@fs/` (`tool-loader.ts`'s
227
+ * `bundledPackageLoaders`, keyed by exactly this string).
228
+ *
229
+ * 2. THE PROJECT'S OWN DECLARED DEPENDENCIES — a tool over the project's
230
+ * content that the project pins itself (CLAUDE.md's 2026-09-15 amendment).
231
+ * Those are not in any bundle, so they are listed by absolute path and
232
+ * served from the filesystem.
233
+ *
234
+ * A package on BOTH lists is the product's: its copy is the one already in the
235
+ * page, and loading the project's second copy is a duplicate registration.
236
+ */
237
+ async function packageContributionModules(
238
+ projectRoot: string,
239
+ product: ProductIdentity | null,
240
+ loadErrors: ProjectToolLoadError[],
241
+ ): Promise<ProjectToolContribution[]> {
242
+ const projectPackage = await readPackageJson(resolve(projectRoot, 'package.json'));
243
+ const declared = Object.keys({
244
+ ...(projectPackage?.dependencies ?? {}),
245
+ ...(projectPackage?.devDependencies ?? {}),
246
+ }).sort();
247
+ const composed = product === null ? [] : productComposedPackages(product);
248
+ const bundled = new Set(composed);
249
+ const sources: Array<{ name: string; from: string; bundled: boolean }> = [
250
+ ...composed.map((name) => ({ name, from: (product as ProductIdentity).dir, bundled: true })),
251
+ ...[...declared, ...SESSION_PACKAGES.filter((name) => !declared.includes(name))]
252
+ .filter((name) => !bundled.has(name))
253
+ .map((name) => ({ name, from: projectRoot, bundled: false })),
254
+ ];
255
+ if (sources.length === 0) return [];
256
+ const found: ProjectToolContribution[] = [];
257
+ for (const { name, from, bundled: inBundle } of sources) {
258
+ const packageJsonPath = await locatePackageJson(from, name);
259
+ // Not installed: a package that cannot be found cannot contribute, and
260
+ // that is not an error — most dependencies are libraries with nothing
261
+ // to say here.
262
+ if (packageJsonPath === null) continue;
263
+ const manifest = await readPackageJson(packageJsonPath);
264
+ const registrations = manifest?.vgai?.contributions;
265
+ if (registrations === undefined) continue;
266
+ const source = `${name}/package.json#vgai.contributions`;
267
+ if (!Array.isArray(registrations)) {
268
+ loadErrors.push({ sourcePath: source, message: 'must be an array of ./-relative modules' });
269
+ continue;
270
+ }
271
+ const packageDir = dirname(packageJsonPath);
272
+ for (const [index, entry] of registrations.entries()) {
273
+ const sourcePath = `${source}[${index}]`;
274
+ if (!validRelativeModule(entry)) {
275
+ loadErrors.push({
276
+ sourcePath,
277
+ message: 'must be a ./-relative contribution module without parent traversal',
278
+ });
279
+ continue;
280
+ }
281
+ if (!isToolContributionModule(entry)) {
282
+ loadErrors.push({
283
+ sourcePath,
284
+ message:
285
+ 'is not a contribution module by name (*.document/.inspector/.asset-inspector/.result/.utility/.analytics/.kind/.finder .ts/.tsx)',
286
+ });
287
+ continue;
288
+ }
289
+ let absolutePath: string;
290
+ try {
291
+ absolutePath = await realpath(resolve(packageDir, entry));
292
+ } catch {
293
+ loadErrors.push({ sourcePath, message: `${entry} does not exist in ${name}` });
294
+ continue;
295
+ }
296
+ // The file is checked either way — a declaration naming a module that is
297
+ // not there is a load error, not a silent skip — but a BUNDLED package is
298
+ // reported by its specifier, which is the key its loader is registered
299
+ // under in the page.
300
+ found.push({
301
+ entryPath: inBundle ? `${name}/${entry.replace(/^\.\//, '')}` : absolutePath,
302
+ package: name,
303
+ });
304
+ }
305
+ }
306
+ return found;
307
+ }
308
+
309
+ async function projectToolModules(projectRoot: string): Promise<ToolModule[]> {
310
+ const projectPackage = await readPackageJson(resolve(projectRoot, 'package.json'));
311
+ const registrations = projectPackage?.vgai?.tools;
312
+ if (!Array.isArray(registrations)) return [];
313
+ return registrations.map((registration, index): ToolModule => {
314
+ const entry = registrationEntry(registration);
315
+ const registrationPath = `package.json#vgai.tools[${index}]`;
316
+ if (!validRelativeModule(entry)) {
317
+ return {
318
+ absolutePath: resolve(projectRoot, 'package.json'),
319
+ sourcePath: registrationPath,
320
+ registrationError: 'must be a ./-relative tool module without parent traversal',
321
+ };
322
+ }
323
+ const absolutePath = resolve(projectRoot, entry);
324
+ if (!absolutePath.startsWith(`${projectRoot}${sep}`)) {
325
+ return {
326
+ absolutePath,
327
+ sourcePath: registrationPath,
328
+ registrationError: 'resolves outside the project',
329
+ };
330
+ }
331
+ return { absolutePath, sourcePath: entry.slice(2) };
332
+ });
333
+ }
334
+
335
+ function operationShape(value: unknown): value is ToolDefinition {
336
+ if (value === null || typeof value !== 'object') return false;
337
+ const candidate = value as Partial<ToolDefinition>;
338
+ return (
339
+ typeof candidate.name === 'string' &&
340
+ typeof candidate.summary === 'string' &&
341
+ typeof candidate.description === 'string' &&
342
+ candidate.input !== null &&
343
+ typeof candidate.input === 'object' &&
344
+ typeof candidate.input.safeParse === 'function' &&
345
+ candidate.result !== null &&
346
+ typeof candidate.result === 'object' &&
347
+ typeof candidate.result.safeParse === 'function' &&
348
+ Array.isArray(candidate.errors) &&
349
+ candidate.requires !== null &&
350
+ typeof candidate.requires === 'object' &&
351
+ (candidate.host === 'node' ||
352
+ candidate.host === 'editor-browser' ||
353
+ candidate.host === 'runtime-page') &&
354
+ typeof candidate.mutates === 'boolean' &&
355
+ typeof candidate.supportsDryRun === 'boolean' &&
356
+ candidate.permission !== null &&
357
+ typeof candidate.permission === 'object' &&
358
+ typeof candidate.impl === 'function'
359
+ );
360
+ }
361
+
362
+ function generationContributionShape(value: unknown): value is GenerationToolContribution {
363
+ if (!value || typeof value !== 'object') return false;
364
+ const candidate = value as Partial<GenerationToolContribution>;
365
+ return (
366
+ typeof candidate.provider === 'string' &&
367
+ candidate.provider.length > 0 &&
368
+ ((candidate.role === 'submit' && typeof candidate.toJob === 'function') ||
369
+ ((candidate.role === 'poll' || candidate.role === 'cancel' || candidate.role === 'accept') &&
370
+ typeof candidate.toUpdate === 'function'))
371
+ );
372
+ }
373
+
374
+ function jsonSchema(schema: z.ZodType): unknown {
375
+ // Project schemas may come from a different Zod version than the bundled host.
376
+ return schema.toJSONSchema();
377
+ }
378
+
379
+ function toCatalogEntry(
380
+ definition: ToolDefinition,
381
+ sourcePath: string,
382
+ generation?: GenerationToolContribution,
383
+ ): ProjectToolCatalogEntry {
384
+ return {
385
+ name: definition.name,
386
+ summary: definition.summary,
387
+ description: definition.description,
388
+ sourcePath,
389
+ inputSchema: jsonSchema(definition.input),
390
+ resultSchema: jsonSchema(definition.result),
391
+ errors: definition.errors.map((error) => ({
392
+ code: error.code,
393
+ summary: error.summary,
394
+ ...(error.data ? { dataSchema: jsonSchema(error.data) } : {}),
395
+ })),
396
+ requires: { ...definition.requires },
397
+ host: definition.host,
398
+ mutates: definition.mutates,
399
+ supportsDryRun: definition.supportsDryRun,
400
+ longRunning: definition.longRunning === true,
401
+ permission: { ...definition.permission },
402
+ ...(generation ? { generation: { provider: generation.provider, role: generation.role } } : {}),
403
+ };
404
+ }
405
+
406
+ async function loadCatalog(
407
+ projectRoot: string,
408
+ loadModule: ProjectModuleLoader | undefined,
409
+ ): Promise<LoadedCatalog> {
410
+ // WHICH PRODUCT IS SERVING THIS PROJECT — resolved the same way the CLI
411
+ // resolved it, so the packages the page already has and the packages this
412
+ // catalog lists are the same set. `null` means no product (a session started
413
+ // by hand against a project that declares none); the catalog then holds only
414
+ // the project's own, and the frame's own door says why there is no editor.
415
+ const product = sessionProduct(projectRoot);
416
+ const definitions = new Map<string, ToolDefinition>();
417
+ const generationContributions = new Map<string, GenerationToolContribution>();
418
+ const tools: ProjectToolCatalogEntry[] = [];
419
+ const loadErrors: ProjectToolLoadError[] = [];
420
+ // Contributions are SCANNED, so they never depend on a callable loading —
421
+ // a project whose tool module throws still shows its documents' teaching
422
+ // errors rather than silently losing the whole UI half of the catalog.
423
+ const contributions = [
424
+ ...(await projectContributionModules(projectRoot)),
425
+ ...(await packageContributionModules(projectRoot, product, loadErrors)),
426
+ ];
427
+ const files = (await projectToolModules(projectRoot)).sort((a, b) =>
428
+ a.sourcePath.localeCompare(b.sourcePath),
429
+ );
430
+
431
+ const loadableFiles = files.filter((file) => {
432
+ if (!file.registrationError) return true;
433
+ loadErrors.push({ sourcePath: file.sourcePath, message: file.registrationError });
434
+ return false;
435
+ });
436
+
437
+ if (loadableFiles.length > 0 && !loadModule) {
438
+ loadErrors.push(noProjectModuleHostError());
439
+ return { tools, contributions, loadErrors, definitions, generationContributions };
440
+ }
441
+
442
+ const registry = new ToolRegistry();
443
+ for (const { absolutePath, sourcePath } of loadableFiles) {
444
+ try {
445
+ const imported = (await loadModule?.(absolutePath)) as Record<string, unknown> | undefined;
446
+ const definition = imported?.['tool'];
447
+ if (!operationShape(definition)) {
448
+ throw new Error(
449
+ 'does not export a complete `tool` definition; export `tool = defineTool({...})` from @vgai/sdk/tools',
450
+ );
451
+ }
452
+ if (!definition.name.startsWith('project.')) {
453
+ throw new Error(
454
+ `declares ${JSON.stringify(definition.name)}; project-local tool names must start with "project."`,
455
+ );
456
+ }
457
+ if (definition.mutates && definition.permission.risk === 'read') {
458
+ throw new Error(
459
+ `declares mutates:true with read risk; mutating operations must declare write or destructive risk`,
460
+ );
461
+ }
462
+ const advertisedGeneration = imported?.['generation'];
463
+ if (
464
+ advertisedGeneration !== undefined &&
465
+ !generationContributionShape(advertisedGeneration)
466
+ ) {
467
+ throw new Error(
468
+ 'exports invalid `generation` metadata; use a provider id, submit/poll/cancel/accept role, and the matching mapper function',
469
+ );
470
+ }
471
+ const generation = advertisedGeneration as GenerationToolContribution | undefined;
472
+ registry.register(definition);
473
+ const entry = toCatalogEntry(definition, sourcePath, generation);
474
+ definitions.set(definition.name, definition);
475
+ if (generation) generationContributions.set(definition.name, generation);
476
+ tools.push(entry);
477
+ } catch (error) {
478
+ loadErrors.push({
479
+ sourcePath,
480
+ message: error instanceof Error ? error.message : String(error),
481
+ });
482
+ }
483
+ }
484
+
485
+ tools.sort((a, b) => a.name.localeCompare(b.name));
486
+ return { tools, contributions, loadErrors, definitions, generationContributions };
487
+ }
488
+
489
+ export async function discoverProjectTools(
490
+ projectRoot: string,
491
+ loadModule: ProjectModuleLoader | undefined,
492
+ ): Promise<ProjectToolCatalog> {
493
+ const {
494
+ definitions: _definitions,
495
+ generationContributions: _generationContributions,
496
+ ...catalog
497
+ } = await loadCatalog(projectRoot, loadModule);
498
+ return catalog;
499
+ }
500
+
501
+ export type ProjectToolExecution =
502
+ | {
503
+ status: 200;
504
+ body: ToolOutcome & { generation?: GenerationJob; generationWarning?: string };
505
+ changedProject: boolean;
506
+ }
507
+ | {
508
+ status: 404 | 409;
509
+ body: { ok: false; error: { code: string; message: string } };
510
+ changedProject: false;
511
+ };
512
+
513
+ export async function executeProjectTool(options: {
514
+ account?: EditorAccountService | undefined;
515
+ projectRoot: string;
516
+ loadModule: ProjectModuleLoader | undefined;
517
+ name: string;
518
+ input: unknown;
519
+ confirmed: boolean;
520
+ /** WHICH mounted instance a game-driving tool should address (multiplayer
521
+ * authoring). Reaches the tool as `ctx.instance`; omitted is the sole
522
+ * instance. */
523
+ instance?: string;
524
+ signal?: AbortSignal;
525
+ }): Promise<ProjectToolExecution> {
526
+ const loaded = await loadCatalog(options.projectRoot, options.loadModule);
527
+ const definition = loaded.definitions.get(options.name);
528
+ if (!definition) {
529
+ return {
530
+ status: 404,
531
+ changedProject: false,
532
+ body: {
533
+ ok: false,
534
+ error: {
535
+ code: 'PROJECT_TOOL_NOT_FOUND',
536
+ message: `No registered project tool is named ${JSON.stringify(options.name)}.`,
537
+ },
538
+ },
539
+ };
540
+ }
541
+ if (definition.host !== 'node') {
542
+ return {
543
+ status: 409,
544
+ changedProject: false,
545
+ body: {
546
+ ok: false,
547
+ error: {
548
+ code: 'PROJECT_TOOL_HOST_UNAVAILABLE',
549
+ message:
550
+ `Project tool ${JSON.stringify(options.name)} declares host ${JSON.stringify(definition.host)}. ` +
551
+ 'This host currently executes Node-hosted project tools; call reusable browser/runtime functions directly.',
552
+ },
553
+ },
554
+ };
555
+ }
556
+ if ((definition.mutates || definition.permission.risk !== 'read') && !options.confirmed) {
557
+ return {
558
+ status: 409,
559
+ changedProject: false,
560
+ body: {
561
+ ok: false,
562
+ error: {
563
+ code: 'PROJECT_TOOL_CONFIRMATION_REQUIRED',
564
+ message:
565
+ `${definition.permission.risk} tool ${JSON.stringify(options.name)} requires explicit confirmation: ` +
566
+ definition.permission.summary +
567
+ ' Set confirm: true in the invocation options after authorization.',
568
+ },
569
+ },
570
+ };
571
+ }
572
+
573
+ const registry = new ToolRegistry();
574
+ registry.register(definition);
575
+ const generation = loaded.generationContributions.get(options.name);
576
+ // THE credential read for a generation job: this tool's OWN declared
577
+ // provider, one credential-manager item, at the moment the job runs. A tool
578
+ // that declares no provider reads nothing (`provider-credentials.ts`'s
579
+ // header states the rule and what a boot-time sweep costs).
580
+ if (generation && options.account) {
581
+ await options.account.ensureProviderCredential(generation.provider);
582
+ }
583
+ const provenanceInput = definition.input.safeParse(options.input);
584
+ const operationSource = loaded.tools.find((entry) => entry.name === options.name)?.sourcePath;
585
+ const resolveMode: ProviderModeResolver = async (provider, requestId) => {
586
+ const job = requestId
587
+ ? (await readGenerationJobs(options.projectRoot)).jobs.find(
588
+ (job) => job.provider === provider && job.externalId === requestId,
589
+ )
590
+ : undefined;
591
+ if (!options.account)
592
+ throw new Error('Provider execution requires the editor account service.');
593
+ return options.account.providerExecutionMode(provider, job?.mode);
594
+ };
595
+ const outcome = await withProviderExecution(
596
+ resolveMode,
597
+ () =>
598
+ runWithGenerativeExecutionCapture(() =>
599
+ registry.dispatch(options.name, options.input, {
600
+ projectRoot: options.projectRoot,
601
+ projectOutputs: createProjectOutputWriter(options.projectRoot, {
602
+ operationName: definition.name,
603
+ ...(operationSource ? { operationSource } : {}),
604
+ ...(provenanceInput.success ? { input: provenanceInput.data } : {}),
605
+ }),
606
+ ...(options.instance !== undefined ? { instance: options.instance } : {}),
607
+ ...(options.signal ? { signal: options.signal } : {}),
608
+ ...(options.loadModule ? { loadProjectModule: options.loadModule } : {}),
609
+ }),
610
+ ),
611
+ async (job) => {
612
+ await applyGenerationContribution(
613
+ options.projectRoot,
614
+ {
615
+ role: 'submit',
616
+ provider: job.provider,
617
+ toJob: () => job,
618
+ },
619
+ {},
620
+ {},
621
+ );
622
+ },
623
+ );
624
+ let body: ToolOutcome & { generation?: GenerationJob; generationWarning?: string } = outcome;
625
+ if (outcome.ok && generation && provenanceInput.success) {
626
+ try {
627
+ const generationJob = await applyGenerationContribution(
628
+ options.projectRoot,
629
+ generation,
630
+ provenanceInput.data,
631
+ outcome.data,
632
+ );
633
+ await reconcileAcceptedGenerationProvenance(options.projectRoot, generationJob);
634
+ body = {
635
+ ...outcome,
636
+ generation: generationJob,
637
+ };
638
+ } catch (error) {
639
+ // Never turn successful paid provider submission into an apparent
640
+ // failure that tempts a retry and duplicate charge. Tracking failure is
641
+ // explicit alongside the successful native result.
642
+ body = {
643
+ ...outcome,
644
+ generationWarning: error instanceof Error ? error.message : String(error),
645
+ };
646
+ }
647
+ }
648
+ return {
649
+ status: 200,
650
+ body,
651
+ changedProject: definition.mutates && outcome.ok,
652
+ };
653
+ }