@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,119 @@
1
+ /** Node filesystem binding for the shared, read-only project inspector. */
2
+
3
+ import { readdir, readFile, stat, writeFile } from 'node:fs/promises';
4
+ import { basename, resolve } from 'node:path';
5
+ import { resolveManifestPath } from '@volter/editor-project/manifest/locate';
6
+ import {
7
+ createIngestManifest,
8
+ inspectProject,
9
+ type ProjectInspection,
10
+ type ProjectInspectionReader,
11
+ type SuggestedAdapterSurface,
12
+ } from '@volter/editor-project/inspection';
13
+ import { resolveProjectPath } from './shared.js';
14
+
15
+ export type { SuggestedAdapterSurface } from '@volter/editor-project/inspection';
16
+
17
+ export function nodeProjectInspectionReader(root: string): ProjectInspectionReader {
18
+ return {
19
+ async exists(path) {
20
+ try {
21
+ await stat(resolveProjectPath(root, path));
22
+ return true;
23
+ } catch {
24
+ return false;
25
+ }
26
+ },
27
+ read(path) {
28
+ return readFile(resolveProjectPath(root, path), 'utf-8');
29
+ },
30
+ async list(path) {
31
+ const entries = await readdir(resolveProjectPath(root, path), { withFileTypes: true });
32
+ return entries
33
+ .filter((entry) => !entry.isSymbolicLink())
34
+ .map((entry) => ({
35
+ name: entry.name,
36
+ path: path ? `${path.replace(/\\/g, '/')}/${entry.name}` : entry.name,
37
+ type: entry.isDirectory() ? ('dir' as const) : ('file' as const),
38
+ }));
39
+ },
40
+ };
41
+ }
42
+
43
+ export async function inspectProjectFolderPath(path: string): Promise<{
44
+ path: string;
45
+ report: ProjectInspection;
46
+ }> {
47
+ const root = resolve(path);
48
+ const rootStat = await stat(root);
49
+ if (!rootStat.isDirectory()) throw new Error(`Project path is not a directory: ${root}`);
50
+ return { path: root, report: await inspectProject(nodeProjectInspectionReader(root)) };
51
+ }
52
+
53
+ export async function adaptProjectFolderPath(
54
+ path: string,
55
+ options: {
56
+ engineVersion: string;
57
+ surface?: SuggestedAdapterSurface | undefined;
58
+ entry?: string | undefined;
59
+ },
60
+ ): Promise<{ path: string; writes: ['vgai.project.json']; manifest: Record<string, unknown> }> {
61
+ const preview = await previewAdaptProjectFolderPath(path, options);
62
+ await writeFile(
63
+ resolveManifestPath(preview.path),
64
+ `${JSON.stringify(preview.manifest, null, 2)}\n`,
65
+ {
66
+ encoding: 'utf-8',
67
+ flag: 'wx',
68
+ },
69
+ );
70
+ return { path: preview.path, writes: ['vgai.project.json'], manifest: preview.manifest };
71
+ }
72
+
73
+ /** Build the exact proposed sidecar without writing it. */
74
+ export async function previewAdaptProjectFolderPath(
75
+ path: string,
76
+ options: {
77
+ engineVersion: string;
78
+ surface?: SuggestedAdapterSurface | undefined;
79
+ entry?: string | undefined;
80
+ },
81
+ ): Promise<{
82
+ path: string;
83
+ report: ProjectInspection;
84
+ writes: [];
85
+ manifest: Record<string, unknown>;
86
+ }> {
87
+ const root = resolve(path);
88
+ const rootStat = await stat(root);
89
+ if (!rootStat.isDirectory()) throw new Error(`Project path is not a directory: ${root}`);
90
+ const report = await inspectProject(nodeProjectInspectionReader(root));
91
+ if (report.hasManifest) throw new Error('This folder already has a vgai.project.json manifest.');
92
+ let name = basename(root);
93
+ try {
94
+ const packageJson = JSON.parse(
95
+ await readFile(resolveProjectPath(root, 'package.json'), 'utf-8'),
96
+ ) as {
97
+ name?: unknown;
98
+ };
99
+ if (typeof packageJson.name === 'string' && packageJson.name.length > 0)
100
+ name = packageJson.name;
101
+ } catch {}
102
+ const selectedEntry = options.entry ?? report.entryCandidates[0];
103
+ if (selectedEntry !== undefined) {
104
+ const entryPath = resolveProjectPath(root, selectedEntry);
105
+ let entryStat: Awaited<ReturnType<typeof stat>>;
106
+ try {
107
+ entryStat = await stat(entryPath);
108
+ } catch {
109
+ throw new Error(`Adapter entry does not exist: ${selectedEntry}`);
110
+ }
111
+ if (!entryStat.isFile()) throw new Error(`Adapter entry is not a file: ${selectedEntry}`);
112
+ }
113
+ const manifest = createIngestManifest(report, {
114
+ name,
115
+ ...options,
116
+ ...(selectedEntry !== undefined ? { entry: selectedEntry } : {}),
117
+ });
118
+ return { path: root, report, writes: [], manifest };
119
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * The play log's NAMING scheme, defined once. The dev server mints the files
3
+ * in `routes/logs.ts`, and every downstream reader (`vgai status`'s
4
+ * play-error banner, `@vgai/sdk/build-discipline`'s evidence walk, the
5
+ * pruner, the session catalog) sorts them lexicographically and expects
6
+ * chronological order. Moved here from `server/recent-projects-store.ts`
7
+ * (which re-exports for its existing importers) so the browser build can
8
+ * import the functions without that module's `node:os` scope.
9
+ */
10
+
11
+ import { MAX_RUN_NAME } from './run-name';
12
+
13
+ export function slugify(name: string): string {
14
+ return name
15
+ .toLowerCase()
16
+ .replace(/[^a-z0-9]+/g, '-')
17
+ .replace(/^-|-$/g, '');
18
+ }
19
+
20
+ /** `slugify` under a length bound, or `null` when nothing survives (blank
21
+ * name, punctuation only) — an unnamed run and an unnameable one are the
22
+ * same case, and both must fall back to the unnamed filename exactly.
23
+ *
24
+ * The bound comes from `@vgai/sdk`'s run-name module rather than a literal
25
+ * here: a playtest run derives its own name against the same ceiling, and two
26
+ * copies of "40" is how the derived name and the filename it lands in start
27
+ * disagreeing. */
28
+ export function playRunSlug(name: string | null | undefined): string | null {
29
+ if (typeof name !== 'string') return null;
30
+ const slug = slugify(name).slice(0, MAX_RUN_NAME).replace(/-$/, '');
31
+ return slug === '' ? null : slug;
32
+ }
33
+
34
+ /**
35
+ * A play session's JSONL filename.
36
+ *
37
+ * `play-<stamp>-<sequence>.jsonl` unchanged when the run is unnamed — that
38
+ * shape is depended on by the newest-log readers (`vgai status`'s play-error
39
+ * banner, `@vgai/sdk/build-discipline`'s evidence walk) and by the pruner, all
40
+ * of which sort lexicographically and expect chronological order.
41
+ *
42
+ * An OPTIONAL name is appended AFTER the sequence for exactly that reason: the
43
+ * ordering prefix is untouched, so naming a run changes only what a human
44
+ * greps for. There is deliberately no registry and no uniqueness check —
45
+ * two runs with the same name are two files with different stamps, and the
46
+ * filesystem is the query engine.
47
+ */
48
+ export function playLogFilename(startedAt: Date, sequence: number, name?: string | null): string {
49
+ // Milliseconds plus a process-local sequence make restart artifacts
50
+ // distinct even when two sessions begin inside the same millisecond.
51
+ const ts = startedAt.toISOString().replace(/[:.]/g, '-');
52
+ const slug = playRunSlug(name);
53
+ return `play-${ts}-${String(sequence).padStart(4, '0')}${slug ? `-${slug}` : ''}.jsonl`;
54
+ }
@@ -0,0 +1,290 @@
1
+ import { z } from 'zod';
2
+ import { GenerationBillingSchema } from '@volter/editor-sdk/generations';
3
+
4
+ export const PROJECT_PROVENANCE_PATH = '.vgai/provenance.json';
5
+
6
+ export const ProjectProvenanceOutputSchema = z
7
+ .object({
8
+ path: z.string(),
9
+ bytes: z.number().int().nonnegative(),
10
+ sha256: z.string().regex(/^[a-f0-9]{64}$/),
11
+ mediaType: z.string().optional(),
12
+ role: z.enum(['asset', 'prefab', 'provenance', 'other']).optional(),
13
+ })
14
+ .strict();
15
+
16
+ export const ProjectProvenanceExecutionSchema = z
17
+ .object({
18
+ mode: z.enum(['mock', 'direct', 'managed']),
19
+ provider: z.string(),
20
+ operation: z.string().optional(),
21
+ model: z.string().optional(),
22
+ requestId: z.string().optional(),
23
+ taskId: z.string().optional(),
24
+ managedJobId: z.string().optional(),
25
+ billing: GenerationBillingSchema.optional(),
26
+ })
27
+ .strict();
28
+
29
+ /**
30
+ * THE KIND FOR A FILE AN EDITOR SESSION WROTE INTO THE PROJECT.
31
+ *
32
+ * A generated binary under `public/` normally arrives from an operation that
33
+ * ran here: a bake, a provider acceptance, a library acquisition. A file a
34
+ * SESSION produced has no such operation — the bytes were made by a script an
35
+ * agent ran inside the tab (`export_scene.gltf` in the Blender session's own
36
+ * worker filesystem) and reached disk through the write-back door that mirrors
37
+ * the session's files out. Measured 2026-09-18: those landed with no record at
38
+ * all, which is the one state `scripts/validate-project-provenance.mjs` calls
39
+ * fatal.
40
+ *
41
+ * The producing PROGRAM is the session, so what the record can honestly name is
42
+ * the session — see {@link ProjectProvenanceSessionSchema}. That block is
43
+ * REQUIRED on a record of this kind, and the validator enforces it, for the
44
+ * same reason `project.provenance.unknown` must carry a written reason: a kind
45
+ * that can be claimed without evidence becomes the cheapest way past the gate.
46
+ *
47
+ * `scripts/validate-project-provenance.mjs` spells this literal itself (it is a
48
+ * plain `.mjs` gate and imports no TypeScript); changing it here means changing
49
+ * it there.
50
+ */
51
+ export const PROJECT_SESSION_WRITE_OPERATION = 'project.session.write';
52
+
53
+ /**
54
+ * WHICH SESSION wrote the bytes, and what it had modelled at the time.
55
+ *
56
+ * Not a provider execution: no vendor ran, nothing was billed, and there is no
57
+ * request to re-issue. What re-derives the file is the session's own state, so
58
+ * the identity (which session, reached on which port) and the `revision` that
59
+ * state was at are the facts worth keeping.
60
+ */
61
+ export const ProjectProvenanceSessionSchema = z
62
+ .object({
63
+ id: z
64
+ .string()
65
+ .min(1)
66
+ .describe(
67
+ "The session's own id, as the session names itself to the tab in every " +
68
+ 'frame it presents. Distinguishes two sessions of the same project, ' +
69
+ 'including one restarted between two writes to the same path.',
70
+ ),
71
+ port: z
72
+ .number()
73
+ .int()
74
+ .positive()
75
+ .describe(
76
+ 'The machine-local editor port the writer reached that session on — the ' +
77
+ "project's own reserved port, which is how a person or an agent gets " +
78
+ 'back to the tab this file came out of.',
79
+ ),
80
+ revision: z
81
+ .number()
82
+ .int()
83
+ .nonnegative()
84
+ .describe(
85
+ "The session's frame revision at the moment the file was listed for " +
86
+ 'write-back: the model state that produced these bytes. It advances ' +
87
+ 'once per present, and a script presents when it finishes, so this is ' +
88
+ 'the revision the writing script left behind.',
89
+ ),
90
+ callId: z
91
+ .string()
92
+ .min(1)
93
+ .optional()
94
+ .describe(
95
+ "The transport's own id for the call that ran the script, when the " +
96
+ 'transport has one (the MCP request id). Absent when the write did not ' +
97
+ 'arrive through a call the transport numbered.',
98
+ ),
99
+ })
100
+ .strict();
101
+
102
+ /**
103
+ * THE KIND FOR BYTES ALREADY ON DISK, RE-RECORDED AGAINST A LIVE DOOR.
104
+ *
105
+ * The ledger is an append-only log of operations that really happened, so a
106
+ * record whose `operation.source` names a tool that has since been deleted or
107
+ * renamed cannot be rewritten — it is what happened. What it can no longer do
108
+ * is tell a reader which door rebuilds the file. An ATTEST record is the
109
+ * append that answers that: nothing ran, nothing was re-baked, the bytes were
110
+ * hashed where they lie, and `input.attests` names the operation that would
111
+ * produce them today.
112
+ *
113
+ * It is the weakest claim in the vocabulary, so it pays the same price as
114
+ * `project.provenance.unknown`: `input.reason` is REQUIRED and
115
+ * `scripts/validate-project-provenance.mjs` enforces it, because a kind that
116
+ * can be claimed with no evidence is the cheapest way past a gate. An attest
117
+ * is never a substitute for running the door when the door CAN be run — it
118
+ * exists for the case where re-running would change the bytes a project
119
+ * already ships.
120
+ *
121
+ * Written by `attestExistingProjectOutputs`
122
+ * (`packages/editor/server/project-output-writer.ts`), driven by
123
+ * `scripts/attest-project-output.ts`. The validator spells this literal
124
+ * itself (it is a plain `.mjs` gate and imports no TypeScript); changing it
125
+ * here means changing it there.
126
+ */
127
+ export const PROJECT_ATTEST_OPERATION = 'project.provenance.attest';
128
+
129
+ export const ProjectProvenanceOperationSchema = z
130
+ .object({
131
+ createdAt: z.string().datetime(),
132
+ operation: z
133
+ .object({
134
+ name: z.string(),
135
+ source: z.string().optional(),
136
+ })
137
+ .strict(),
138
+ execution: ProjectProvenanceExecutionSchema.optional(),
139
+ executions: z.array(ProjectProvenanceExecutionSchema).min(2).optional(),
140
+ session: ProjectProvenanceSessionSchema.optional().describe(
141
+ 'The editor session that wrote these bytes. Required on a ' +
142
+ '`project.session.write` record, and meaningless on any other kind.',
143
+ ),
144
+ input: z.json().optional(),
145
+ inputs: z
146
+ .array(z.string().min(1))
147
+ .min(1)
148
+ .optional()
149
+ .describe(
150
+ 'Project-relative paths of the project FILES these bytes were produced ' +
151
+ 'from — a session-written GLB names the `src/models/<name>.blend` it ' +
152
+ 'was exported from. This is what lets a reader go DOWN by kind: a ' +
153
+ 'prefab uses a glTF, and opening that glTF\'s model needs the export ' +
154
+ 'to name its input (ARCHITECTURE-CORE §Roots, "Drilling goes DOWN by ' +
155
+ 'kind"). Distinct from `input`, which is the operation\'s ARGUMENTS; ' +
156
+ 'these are files on disk, and `scripts/validate-project-provenance.mjs` ' +
157
+ 'reports one that no longer exists as DANGLING rather than fatal — a ' +
158
+ 'renamed source is history, not a broken ledger.',
159
+ ),
160
+ outputs: z.array(ProjectProvenanceOutputSchema).min(1),
161
+ })
162
+ .strict();
163
+
164
+ export const ProjectProvenanceDocumentSchema = z
165
+ .object({
166
+ version: z.literal(1),
167
+ operations: z.record(z.string(), ProjectProvenanceOperationSchema),
168
+ })
169
+ .strict();
170
+
171
+ export type ProjectProvenanceDocument = z.infer<typeof ProjectProvenanceDocumentSchema>;
172
+ export type ProjectProvenanceOperation = z.infer<typeof ProjectProvenanceOperationSchema>;
173
+ export type ProjectProvenanceExecution = z.infer<typeof ProjectProvenanceExecutionSchema>;
174
+ export type ProjectProvenanceSession = z.infer<typeof ProjectProvenanceSessionSchema>;
175
+
176
+ export const ProjectAttributionEntrySchema = z
177
+ .object({
178
+ key: z.string(),
179
+ name: z.string().optional(),
180
+ source: z.string().optional(),
181
+ sourceUrl: z.string().url().optional(),
182
+ author: z.string(),
183
+ license: z.string(),
184
+ text: z.string(),
185
+ operationIds: z.array(z.string()),
186
+ outputPaths: z.array(z.string()),
187
+ })
188
+ .strict();
189
+
190
+ export const ProjectAttributionReportSchema = z
191
+ .object({
192
+ version: z.literal(1),
193
+ entries: z.array(ProjectAttributionEntrySchema),
194
+ })
195
+ .strict();
196
+
197
+ export type ProjectAttributionEntry = z.infer<typeof ProjectAttributionEntrySchema>;
198
+ export type ProjectAttributionReport = z.infer<typeof ProjectAttributionReportSchema>;
199
+
200
+ export function emptyProjectProvenanceDocument(): ProjectProvenanceDocument {
201
+ return { version: 1, operations: {} };
202
+ }
203
+
204
+ function objectRecord(value: unknown): Record<string, unknown> | null {
205
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
206
+ ? (value as Record<string, unknown>)
207
+ : null;
208
+ }
209
+
210
+ function stringField(record: Record<string, unknown>, key: string): string | undefined {
211
+ const value = record[key];
212
+ return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
213
+ }
214
+
215
+ function attributionEntry(
216
+ operationId: string,
217
+ operation: ProjectProvenanceOperation,
218
+ ): ProjectAttributionEntry | null {
219
+ const input = objectRecord(operation.input);
220
+ if (!input) return null;
221
+ const nested = objectRecord(input['attribution']) ?? {};
222
+ const author = stringField(nested, 'author') ?? stringField(input, 'author');
223
+ const license = stringField(nested, 'license') ?? stringField(input, 'license');
224
+ if (!author || !license) return null;
225
+ const name = stringField(nested, 'name') ?? stringField(input, 'name');
226
+ const source = stringField(nested, 'source') ?? stringField(input, 'source');
227
+ const sourceUrl = stringField(nested, 'sourceUrl') ?? stringField(input, 'sourceUrl');
228
+ const text = stringField(nested, 'text') ?? `${name ? `${name} by ` : ''}${author} (${license})`;
229
+ const key = JSON.stringify([sourceUrl ?? '', author, license, text]);
230
+ return ProjectAttributionEntrySchema.parse({
231
+ key,
232
+ ...(name ? { name } : {}),
233
+ ...(source ? { source } : {}),
234
+ ...(sourceUrl ? { sourceUrl } : {}),
235
+ author,
236
+ license,
237
+ text,
238
+ operationIds: [operationId],
239
+ outputPaths: operation.outputs
240
+ .filter((output) => output.role !== 'provenance')
241
+ .map((output) => output.path),
242
+ });
243
+ }
244
+
245
+ /**
246
+ * Project credits are a projection of central provenance, never another
247
+ * persisted ledger or a set of per-asset files.
248
+ */
249
+ export function deriveProjectAttributionReport(
250
+ document: ProjectProvenanceDocument,
251
+ ): ProjectAttributionReport {
252
+ const grouped = new Map<string, ProjectAttributionEntry>();
253
+ for (const [operationId, operation] of Object.entries(document.operations)) {
254
+ const entry = attributionEntry(operationId, operation);
255
+ if (!entry) continue;
256
+ const prior = grouped.get(entry.key);
257
+ if (!prior) {
258
+ grouped.set(entry.key, entry);
259
+ continue;
260
+ }
261
+ prior.operationIds.push(...entry.operationIds);
262
+ prior.outputPaths.push(...entry.outputPaths);
263
+ }
264
+ const entries = [...grouped.values()]
265
+ .map((entry) => ({
266
+ ...entry,
267
+ operationIds: [...new Set(entry.operationIds)].sort(),
268
+ outputPaths: [...new Set(entry.outputPaths)].sort(),
269
+ }))
270
+ .sort(
271
+ (left, right) => left.text.localeCompare(right.text) || left.key.localeCompare(right.key),
272
+ );
273
+ return ProjectAttributionReportSchema.parse({ version: 1, entries });
274
+ }
275
+
276
+ /** Deterministic human-readable projection of the machine report. */
277
+ export function formatProjectAttributionMarkdown(report: ProjectAttributionReport): string {
278
+ const sections = report.entries.map((entry) => {
279
+ const heading = entry.name ?? entry.text;
280
+ return [
281
+ `## ${heading}`,
282
+ '',
283
+ entry.text,
284
+ '',
285
+ `Author: ${entry.author} `,
286
+ `License: ${entry.license}${entry.sourceUrl ? ` \nSource: ${entry.sourceUrl}` : ''}`,
287
+ ].join('\n');
288
+ });
289
+ return `# Asset attribution\n${sections.length > 0 ? `\n${sections.join('\n\n')}` : '\nNo attributed project assets are currently present.'}\n`;
290
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * What a run is CALLED — one owner of the bound.
3
+ *
4
+ * WHY THIS EXISTS. `vgai play --name <text>` exists so a run is findable by
5
+ * what it was testing.
6
+ *
7
+ * WHAT STAYS UNNAMED, deliberately: interactive `vgai play` with no `--name`.
8
+ * A person pressing play is not testing a named thing, and inventing a label
9
+ * for it would put noise in exactly the directory this makes greppable.
10
+ *
11
+ * Pure — no filesystem, no clock. `editor-server.ts`'s `playRunSlug` is the
12
+ * OTHER half (slugging a name into a filename segment) and reads the bound
13
+ * from here, so the two can never disagree about how long a run name may be.
14
+ */
15
+
16
+ /** Bound on a run's name — long enough to stay recognisable in a directory
17
+ * listing, short enough that the timestamp beside it is still readable. */
18
+ export const MAX_RUN_NAME = 40;