@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,320 @@
1
+ /**
2
+ * Asset packs — `asset-manifest.json` (D-AP1) and the pure sync/check planner
3
+ * behind `npm run asset-packs:sync` (D-AP2)..
4
+ *
5
+ * A PACK is a named list of `{ key, dest }`: library asset keys and the
6
+ * project-relative paths their bytes are copied to. It is an INPUT TO
7
+ * MATERIALIZATION, never a runtime concept — nothing in a running game or a
8
+ * scaffolded project resolves a pack. It is deliberately NOT a `vgai.project.json`
9
+ * field: the manifest says what a project IS, a pack says how its reference
10
+ * material was PRODUCED.
11
+ *
12
+ * The file lives beside `vgai.project.json` in `packages/editor/template/` and each
13
+ * `examples/<id>/`. A scaffolded user project does not carry it; its record is
14
+ * the ledger (`asset-ledger.ts`, D-AP3).
15
+ *
16
+ * The binaries stay COMMITTED — creating a project must work offline and CI must stay
17
+ * hermetic (D-AP2/D-AP6). What the pack adds is that they are now GENERATED: the
18
+ * library is the origin, and `--check` re-verifies the committed bytes against
19
+ * the library's own `sourceHash` without touching the network.
20
+ *
21
+ * On KEYS: a key is `source:id`, the same identity as `onlineAssetKey`. For the
22
+ * SSD/cloud catalog the source name is `local`, and the id is a VARIANT id
23
+ * (`local:a7c5288306d9e98cb7dbdbd2`), not a family id — a family has several
24
+ * format variants, so only the variant pins bytes. `findLocalAsset` /
25
+ * `findCloudAsset` both resolve variant ids, so this is an ordinary library key.
26
+ */
27
+
28
+ import { z } from 'zod';
29
+
30
+ export const AssetPackEntrySchema = z
31
+ .object({
32
+ /** `source:id` — the library's identity for the asset (variant-precise). */
33
+ key: z.string().regex(/^[^:]+:.+$/, 'An asset key must be "source:id"'),
34
+ /** Project-relative destination for the asset's main file. */
35
+ dest: z.string().min(1),
36
+ /**
37
+ * The PIN: sha256 of the bytes this entry declares, bare lowercase hex.
38
+ *
39
+ * Required, and the reason is trust-on-first-use. A materializer that
40
+ * learns the expected digest from the same response that delivers the
41
+ * bytes has authenticated nothing on the first fetch — a bad or moved
42
+ * answer is self-consistent, gets written, and its digest becomes the
43
+ * project's permanent `sourceHash` in the ledger. A pin is a CHECKED-IN
44
+ * fact reviewed in a diff, so the first fetch is verified like every
45
+ * later one. `asset-packs:sync --check` cross-checks it against
46
+ * `catalog/cloud/manifest.json` (hermetic — both sides are repo files),
47
+ * and `asset-pack-manifest.test.ts` asserts no in-repo pin was invented.
48
+ */
49
+ sha256: z
50
+ .string()
51
+ .regex(
52
+ /^[a-f0-9]{64}$/,
53
+ 'A pack entry must pin the sha256 of its bytes as 64 lowercase hex digits',
54
+ ),
55
+ })
56
+ .strict();
57
+
58
+ export const AssetPackManifestSchema = z
59
+ .object({
60
+ packs: z.record(z.string().min(1), z.array(AssetPackEntrySchema)),
61
+ })
62
+ .strict();
63
+
64
+ export type AssetPackEntry = z.infer<typeof AssetPackEntrySchema>;
65
+ export type AssetPackManifest = z.infer<typeof AssetPackManifestSchema>;
66
+
67
+ /** Parse an `asset-manifest.json`. Throws loudly — a half-read pack
68
+ * declaration would silently stop guarding the files it dropped. */
69
+ export function parseAssetPackManifest(input: unknown): AssetPackManifest {
70
+ return AssetPackManifestSchema.parse(input);
71
+ }
72
+
73
+ export interface FlattenedPackEntry extends AssetPackEntry {
74
+ readonly pack: string;
75
+ }
76
+
77
+ /** Flatten every pack to a single entry list, rejecting two packs that claim
78
+ * the same destination (whichever ran last would silently win). */
79
+ export function flattenAssetPacks(manifest: AssetPackManifest): FlattenedPackEntry[] {
80
+ const flattened: FlattenedPackEntry[] = [];
81
+ const byDest = new Map<string, string>();
82
+ for (const [pack, entries] of Object.entries(manifest.packs)) {
83
+ for (const entry of entries) {
84
+ const owner = byDest.get(entry.dest);
85
+ if (owner !== undefined) {
86
+ throw new Error(
87
+ `Two packs declare the same destination "${entry.dest}": "${owner}" and "${pack}".`,
88
+ );
89
+ }
90
+ byDest.set(entry.dest, pack);
91
+ flattened.push({ ...entry, pack });
92
+ }
93
+ }
94
+ return flattened;
95
+ }
96
+
97
+ /**
98
+ * Build the library index `planAssetPackSync` needs from a parsed
99
+ * `catalog/cloud/manifest.json`.
100
+ *
101
+ * That file has TWO shapes on disk and both are live. v1 is a flat `assets`
102
+ * array; v2 is the canonical `families` graph whose `variants` are the assets
103
+ * (a family holds several format variants, and only a variant pins bytes).
104
+ * The checked-in snapshot is still v1 while `scripts/cloud-asset-library.ts`
105
+ * already emits v2, so the FIRST regeneration of that file — which ingesting
106
+ * anything into the library requires — flips the shape under this reader.
107
+ * `packages/cloud-asset-library/src/worker.ts` accepts both for exactly this
108
+ * reason; so does this. A reader that understood only the shape it happened to
109
+ * be born with would turn `asset-packs:sync --check` red on a correct tree.
110
+ *
111
+ * Throws on anything else rather than returning an empty index: an index that
112
+ * silently came back empty would report every declared asset as an unknown key.
113
+ */
114
+ export function libraryIndexFromCloudManifest(
115
+ manifest: unknown,
116
+ source: string,
117
+ ): Map<string, LibraryAsset> {
118
+ const root = manifest as {
119
+ version?: unknown;
120
+ assets?: unknown;
121
+ families?: unknown;
122
+ } | null;
123
+ const flat = Array.isArray(root?.families)
124
+ ? (root.families as ManifestFamily[]).flatMap((family) =>
125
+ (family.variants ?? []).map((variant) => ({ ...family, ...variant })),
126
+ )
127
+ : Array.isArray(root?.assets)
128
+ ? (root.assets as ManifestAsset[])
129
+ : null;
130
+ if (!flat) {
131
+ throw new Error(
132
+ 'A cloud asset manifest must have a v1 "assets" array or a v2 "families" array; ' +
133
+ `this one has neither (version ${JSON.stringify(root?.version)}).`,
134
+ );
135
+ }
136
+
137
+ const index = new Map<string, LibraryAsset>();
138
+ for (const asset of flat) {
139
+ const file = asset.files?.[0];
140
+ if (!file) continue;
141
+ const key = `${source}:${asset.id}`;
142
+ index.set(key, {
143
+ key,
144
+ name: asset.name,
145
+ license: asset.license,
146
+ sourceSha256: file.main.sha256,
147
+ sizeBytes: file.main.sizeBytes,
148
+ relativePath: file.main.relativePath,
149
+ dependencyCount: file.dependencies.length,
150
+ });
151
+ }
152
+ return index;
153
+ }
154
+
155
+ interface ManifestObject {
156
+ sha256: string;
157
+ sizeBytes: number;
158
+ relativePath: string;
159
+ }
160
+ interface ManifestAsset {
161
+ id: string;
162
+ name: string;
163
+ license: string;
164
+ files?: { main: ManifestObject; dependencies: ManifestObject[] }[];
165
+ }
166
+ interface ManifestFamily extends Omit<ManifestAsset, 'id' | 'files'> {
167
+ variants?: Omit<ManifestAsset, 'name' | 'license'>[];
168
+ }
169
+
170
+ /** One asset as the LIBRARY describes it — the only source of `sourceSha256`. */
171
+ export interface LibraryAsset {
172
+ readonly key: string;
173
+ readonly name: string;
174
+ readonly license: string;
175
+ readonly sourceSha256: string;
176
+ readonly sizeBytes: number;
177
+ /** The library's own filename for the main file. */
178
+ readonly relativePath: string;
179
+ /** Sibling files the main file needs. See `unsupported-dependencies` below. */
180
+ readonly dependencyCount: number;
181
+ }
182
+
183
+ export type AssetPackDecision =
184
+ /** Committed bytes are the library's bytes. Nothing to do. */
185
+ | { readonly status: 'match'; readonly entry: FlattenedPackEntry }
186
+ /** Declared but not committed — materialize it. */
187
+ | { readonly status: 'missing'; readonly entry: FlattenedPackEntry; readonly asset: LibraryAsset }
188
+ /** Committed but not the library's bytes — hand-edited, or the library moved. */
189
+ | {
190
+ readonly status: 'stale';
191
+ readonly entry: FlattenedPackEntry;
192
+ readonly asset: LibraryAsset;
193
+ readonly committedSha256: string;
194
+ }
195
+ /** The key names nothing in the library. Never guessed around. */
196
+ | { readonly status: 'unresolved-key'; readonly entry: FlattenedPackEntry }
197
+ /**
198
+ * The declaration's pin and the library index disagree about the asset's
199
+ * bytes. Two independent CHECKED-IN facts contradict each other, so neither
200
+ * can be assumed: copying library bytes would silently overrule a reviewed
201
+ * pin, and trusting the pin would hide a library that moved. A human
202
+ * resolves it; sync never does.
203
+ */
204
+ | {
205
+ readonly status: 'pin-mismatch';
206
+ readonly entry: FlattenedPackEntry;
207
+ readonly asset: LibraryAsset;
208
+ }
209
+ /** Multi-file assets are not expressible as one `dest`; refuse rather than
210
+ * silently drop the siblings the main file needs. */
211
+ | {
212
+ readonly status: 'unsupported-dependencies';
213
+ readonly entry: FlattenedPackEntry;
214
+ readonly asset: LibraryAsset;
215
+ };
216
+
217
+ export interface AssetPackSyncInputs {
218
+ /** Library index by `source:id`. */
219
+ readonly library: ReadonlyMap<string, LibraryAsset>;
220
+ /** sha256 of each declared dest as committed, or null when absent. */
221
+ readonly committed: ReadonlyMap<string, string | null>;
222
+ }
223
+
224
+ /**
225
+ * Decide what each declared entry needs. Pure: the caller supplies the library
226
+ * index and the committed hashes, so this is testable without fs or network.
227
+ */
228
+ export function planAssetPackSync(
229
+ entries: readonly FlattenedPackEntry[],
230
+ inputs: AssetPackSyncInputs,
231
+ ): AssetPackDecision[] {
232
+ return entries.map((entry) => {
233
+ const asset = inputs.library.get(entry.key);
234
+ if (!asset) return { status: 'unresolved-key', entry } as const;
235
+ if (asset.dependencyCount > 0) {
236
+ return { status: 'unsupported-dependencies', entry, asset } as const;
237
+ }
238
+ // The pin is checked BEFORE anything about the committed copy: while the
239
+ // two checked-in facts disagree there is no defensible expected digest to
240
+ // judge the copy against.
241
+ if (entry.sha256 !== asset.sourceSha256) {
242
+ return { status: 'pin-mismatch', entry, asset } as const;
243
+ }
244
+ const committedSha256 = inputs.committed.get(entry.dest) ?? null;
245
+ if (committedSha256 === null) return { status: 'missing', entry, asset } as const;
246
+ return committedSha256 === entry.sha256
247
+ ? ({ status: 'match', entry } as const)
248
+ : ({ status: 'stale', entry, asset, committedSha256 } as const);
249
+ });
250
+ }
251
+
252
+ /** Decisions `--check` must fail on. A `missing`/`stale` copy means the
253
+ * committed tree no longer matches what the library says it is. */
254
+ export function assetPackCheckFailures(
255
+ decisions: readonly AssetPackDecision[],
256
+ ): AssetPackDecision[] {
257
+ return decisions.filter((decision) => decision.status !== 'match');
258
+ }
259
+
260
+ /**
261
+ * Decisions sync can NEITHER accept nor repair — it must stop on them.
262
+ *
263
+ * Derived, not hand-listed: anything that is not already correct (`match`) and
264
+ * is not a work item is by definition a refusal. The hand-written version of
265
+ * this list silently omitted `pin-mismatch` the day that status was added, and
266
+ * the consequence was not a missed error but a FABRICATED one — sync would
267
+ * have gone on to record a `sourceHash` for bytes it never fetched or
268
+ * verified, which is exactly what the anti-shim rule forbids.
269
+ */
270
+ export function assetPackBlockingDecisions(
271
+ decisions: readonly AssetPackDecision[],
272
+ ): AssetPackDecision[] {
273
+ const repairable = new Set<AssetPackDecision>(assetPackWorkItems(decisions));
274
+ return decisions.filter((decision) => decision.status !== 'match' && !repairable.has(decision));
275
+ }
276
+
277
+ /** Decisions `assets:sync` can fix by copying library bytes in. */
278
+ export function assetPackWorkItems(
279
+ decisions: readonly AssetPackDecision[],
280
+ ): Extract<AssetPackDecision, { status: 'missing' | 'stale' }>[] {
281
+ return decisions.flatMap((decision) =>
282
+ decision.status === 'missing' || decision.status === 'stale' ? [decision] : [],
283
+ );
284
+ }
285
+
286
+ /** One line explaining a decision, for both `--check` failures and sync logs. */
287
+ export function describeAssetPackDecision(decision: AssetPackDecision): string {
288
+ const where = `${decision.entry.dest} (pack "${decision.entry.pack}", key ${decision.entry.key})`;
289
+ switch (decision.status) {
290
+ case 'match':
291
+ return `ok ${where}`;
292
+ case 'missing':
293
+ return `MISSING ${where} — declared but not committed`;
294
+ case 'stale':
295
+ return (
296
+ `STALE ${where} — committed bytes are sha256:${decision.committedSha256.slice(0, 12)}…, ` +
297
+ `the library has sha256:${decision.asset.sourceSha256.slice(0, 12)}… ` +
298
+ '(either the copy was hand-edited or the library moved)'
299
+ );
300
+ case 'unresolved-key':
301
+ return `UNKNOWN ${where} — no such asset in the library index`;
302
+ case 'pin-mismatch':
303
+ return (
304
+ `PIN ${where} — the declaration pins sha256:${decision.entry.sha256.slice(0, 12)}… ` +
305
+ `but the library index says sha256:${decision.asset.sourceSha256.slice(0, 12)}… ` +
306
+ '(re-pin the declaration only after confirming the library moved deliberately; ' +
307
+ 'nothing is fetched or copied while these disagree)'
308
+ );
309
+ case 'unsupported-dependencies':
310
+ return (
311
+ `MULTIFILE ${where} — the library asset has ${decision.asset.dependencyCount} ` +
312
+ 'dependency file(s); a pack entry declares exactly one destination file'
313
+ );
314
+ }
315
+ }
316
+
317
+ /** Where a project declares its library asset packs. Lives here, beside the
318
+ * manifest's shape, so a reader of the PATH (the seed) does not carry the
319
+ * materializer (the cloud client, the ledger, its locks). */
320
+ export const ASSET_MANIFEST_PATH = 'asset-manifest.json';
@@ -0,0 +1,142 @@
1
+ import { z } from 'zod';
2
+
3
+ export type AssetHealthCode =
4
+ | 'healthy'
5
+ | 'source-only'
6
+ | 'missing-file'
7
+ | 'missing-dependency'
8
+ | 'missing-thumbnail'
9
+ | 'unsupported-format'
10
+ | 'invalid-metadata'
11
+ | 'conversion-failed'
12
+ | 'missing-attribution'
13
+ | 'broken-asset-reference';
14
+
15
+ export interface AssetHealth {
16
+ readonly status: 'healthy' | 'warning' | 'error';
17
+ readonly codes: readonly AssetHealthCode[];
18
+ }
19
+
20
+ export const AssetFileSchema = z
21
+ .object({
22
+ label: z.string().min(1),
23
+ path: z.string().min(1),
24
+ format: z.string().min(1),
25
+ sizeBytes: z.number().int().nonnegative(),
26
+ dependencies: z.array(z.string().min(1)).optional(),
27
+ sha256: z
28
+ .string()
29
+ .regex(/^[a-f0-9]{64}$/)
30
+ .optional(),
31
+ })
32
+ .strict();
33
+
34
+ export const AssetDeliverySchema = z
35
+ .object({
36
+ id: z.string().min(1),
37
+ kind: z.enum(['local-ssd', 'cloud', 'remote']),
38
+ available: z.boolean(),
39
+ fileIndexes: z.array(z.number().int().nonnegative()).min(1),
40
+ })
41
+ .strict();
42
+
43
+ export const AssetThumbnailSchema = z
44
+ .object({
45
+ path: z.string().min(1),
46
+ state: z.enum(['generated', 'upstream', 'fallback', 'unsupported', 'failed']),
47
+ profileVersion: z.string().min(1),
48
+ sourceHash: z
49
+ .string()
50
+ .regex(/^[a-f0-9]{64}$/)
51
+ .optional(),
52
+ resultHash: z
53
+ .string()
54
+ .regex(/^[a-f0-9]{64}$/)
55
+ .optional(),
56
+ issueCode: z.string().min(1).optional(),
57
+ })
58
+ .strict();
59
+
60
+ export const AssetVariantSchema = z
61
+ .object({
62
+ id: z.string().regex(/^[a-f0-9]{24}$/),
63
+ label: z.string().min(1),
64
+ type: z.enum(['model', 'animation', 'source']),
65
+ files: z.array(AssetFileSchema).min(1),
66
+ deliveries: z.array(AssetDeliverySchema).min(1),
67
+ thumbnail: AssetThumbnailSchema,
68
+ animationCount: z.number().int().nonnegative().optional(),
69
+ clipNames: z.array(z.string()).optional(),
70
+ })
71
+ .strict();
72
+
73
+ export const AssetFamilySchema = z
74
+ .object({
75
+ id: z.string().regex(/^[a-f0-9]{24}$/),
76
+ source: z.string().min(1),
77
+ name: z.string().min(1),
78
+ type: z.enum(['model', 'animation', 'source']),
79
+ categories: z.array(z.string()),
80
+ tags: z.array(z.string()),
81
+ license: z.string().min(1),
82
+ author: z.string().min(1),
83
+ sourceUrl: z.string().url(),
84
+ variants: z.array(AssetVariantSchema).min(1),
85
+ })
86
+ .strict();
87
+
88
+ export const AssetCatalogEnvelopeSchema = z
89
+ .object({
90
+ version: z.literal(2),
91
+ generatedAt: z.string().datetime(),
92
+ families: z.array(z.unknown()),
93
+ })
94
+ .strict();
95
+
96
+ export type AssetFile = z.infer<typeof AssetFileSchema>;
97
+ export type AssetDelivery = z.infer<typeof AssetDeliverySchema>;
98
+ export type AssetVariant = z.infer<typeof AssetVariantSchema>;
99
+ export type AssetFamily = z.infer<typeof AssetFamilySchema>;
100
+
101
+ export interface AssetCatalogIssue {
102
+ readonly familyIndex: number | null;
103
+ readonly familyId?: string;
104
+ readonly path: readonly (string | number)[];
105
+ readonly message: string;
106
+ }
107
+
108
+ export interface AssetCatalog {
109
+ readonly version: 2;
110
+ readonly generatedAt: string;
111
+ readonly families: readonly AssetFamily[];
112
+ readonly issues: readonly AssetCatalogIssue[];
113
+ }
114
+
115
+ export function parseAssetCatalog(input: unknown): AssetCatalog {
116
+ const envelope = AssetCatalogEnvelopeSchema.parse(input);
117
+ const families: AssetFamily[] = [];
118
+ const issues: AssetCatalogIssue[] = [];
119
+ for (const [familyIndex, candidate] of envelope.families.entries()) {
120
+ const result = AssetFamilySchema.safeParse(candidate);
121
+ if (result.success) {
122
+ families.push(result.data);
123
+ continue;
124
+ }
125
+ const familyId =
126
+ candidate &&
127
+ typeof candidate === 'object' &&
128
+ 'id' in candidate &&
129
+ typeof candidate.id === 'string'
130
+ ? candidate.id
131
+ : undefined;
132
+ for (const issue of result.error.issues) {
133
+ issues.push({
134
+ familyIndex,
135
+ ...(familyId ? { familyId } : {}),
136
+ path: issue.path.map((part) => (typeof part === 'symbol' ? String(part) : part)),
137
+ message: issue.message,
138
+ });
139
+ }
140
+ }
141
+ return { version: 2, generatedAt: envelope.generatedAt, families, issues };
142
+ }
@@ -0,0 +1,61 @@
1
+ export const ASSET_WORKFLOW_BUDGETS = {
2
+ firstResultsMs: 500,
3
+ filterResponseMs: 50,
4
+ scrollFrameMs: 16.7,
5
+ importProgressLatencyMs: 100,
6
+ maxMountedLibraryCards: 120,
7
+ maxPreviewConcurrency: 2,
8
+ maxActiveAssetEditorWebGlContexts: 1,
9
+ maxRetainedAssetEditorResources: 0,
10
+ maxTelemetryEntries: 200,
11
+ } as const;
12
+
13
+ export type AssetMetricStage =
14
+ | 'query'
15
+ | 'thumbnail'
16
+ | 'preview'
17
+ | 'delivery'
18
+ | 'conversion'
19
+ | 'validation'
20
+ | 'commit';
21
+ export interface AssetWorkflowMetric {
22
+ stage: AssetMetricStage;
23
+ durationMs: number;
24
+ outcome: 'ok' | 'failed' | 'cancelled';
25
+ issueCode?: string;
26
+ at: number;
27
+ }
28
+
29
+ const metrics: AssetWorkflowMetric[] = [];
30
+ const listeners = new Set<() => void>();
31
+
32
+ /** Local-only, path-free asset telemetry for the Debugger/Console. */
33
+ export function recordAssetWorkflowMetric(metric: Omit<AssetWorkflowMetric, 'at'>): void {
34
+ metrics.push({ ...metric, durationMs: Math.max(0, metric.durationMs), at: Date.now() });
35
+ if (metrics.length > ASSET_WORKFLOW_BUDGETS.maxTelemetryEntries)
36
+ metrics.splice(0, metrics.length - ASSET_WORKFLOW_BUDGETS.maxTelemetryEntries);
37
+ for (const listener of listeners) listener();
38
+ }
39
+ export function assetWorkflowMetrics(): readonly AssetWorkflowMetric[] {
40
+ return metrics;
41
+ }
42
+ export function resetAssetWorkflowMetrics(): void {
43
+ metrics.length = 0;
44
+ }
45
+
46
+ export const ASSET_ACTION_RISKS = {
47
+ delete: { destructive: true, confirmation: 'required' },
48
+ overwrite: { destructive: true, confirmation: 'required' },
49
+ 'batch-import': { destructive: false, confirmation: 'summary' },
50
+ 'external-source': { destructive: false, confirmation: 'external-origin' },
51
+ reveal: { destructive: false, confirmation: 'none' },
52
+ 'license-blocked-delivery': { destructive: false, confirmation: 'refuse' },
53
+ } as const;
54
+ export type AssetRiskAction = keyof typeof ASSET_ACTION_RISKS;
55
+
56
+ export function confirmAssetAction(action: AssetRiskAction, message: string): boolean {
57
+ const confirmation = ASSET_ACTION_RISKS[action].confirmation;
58
+ if (confirmation === 'refuse') return false;
59
+ if (confirmation === 'none') return true;
60
+ return window.confirm(message);
61
+ }