@vgai/editor 0.2.0 → 0.4.0-canary.20260715.0

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 (430) hide show
  1. package/README.md +24 -0
  2. package/dist/assets/axe-C7YBtOuM.js +30 -0
  3. package/dist/assets/browserAll-DDtGGE48.js +1 -0
  4. package/dist/assets/create-runtime-DbTlBlKG.js +1 -0
  5. package/dist/assets/{game-BI111o5f.js → game-BE0r7DMI.js} +3 -3
  6. package/dist/assets/game-BdTHR2_X.js +1 -0
  7. package/dist/assets/{game-pt_1lQLv.js → game-C3iQGSqo.js} +1 -1
  8. package/dist/assets/game-CcHfYxjP.js +1 -0
  9. package/dist/assets/game-Cqzj_lpD.js +1 -0
  10. package/dist/assets/game-DSZdeCHu.js +1 -0
  11. package/dist/assets/game-Dch9sAPc.js +1 -0
  12. package/dist/assets/{game-xsOho_wg.js → game-SAFn90pA.js} +3 -3
  13. package/dist/assets/game-loop-DMIgSMV-.js +1 -0
  14. package/dist/assets/{game-source-CvidN7AB.js → game-source-Dk83w26t.js} +1 -1
  15. package/dist/assets/{index-Bp5cecD6.js → index-4idIsHHJ.js} +2 -2
  16. package/dist/assets/{index-DL7RcQ0n.js → index-C-LhOTBN.js} +1 -1
  17. package/dist/assets/{index-Cs8xwv3e.js → index-CDkxceqE.js} +1 -1
  18. package/dist/assets/index-CQEfi217.js +15412 -0
  19. package/dist/assets/index-Dvi-V0NE.css +1 -0
  20. package/dist/assets/ingest-siblings-s0P5I1Ub.js +1 -0
  21. package/dist/assets/mount-manifest-DXMOlF79.js +1 -0
  22. package/dist/assets/react-18-C9eHn8x1.js +1 -0
  23. package/dist/assets/webworkerAll-Fn0e-ouF.js +1 -0
  24. package/dist/assets/world-documents-GM0a9Kv7.js +1 -0
  25. package/dist/index.html +15 -13
  26. package/dist/ingest/racing-game/vgai.game.json +5 -4
  27. package/dist/ingest/simcity/vgai.game.json +5 -4
  28. package/dist/ingest/tanks/vgai.game.json +5 -4
  29. package/dist/project-scripts.bundle.js +3917 -0
  30. package/dist/scenes/untitled.vscn.json +2 -0
  31. package/dist-server/packaged.mjs +7697 -3435
  32. package/package.json +31 -4
  33. package/scripts/probe-reporter.ts +349 -0
  34. package/scripts/run-probe.ts +2260 -0
  35. package/server/asset-catalog-audit.ts +268 -0
  36. package/server/asset-catalog-v2.ts +146 -0
  37. package/server/asset-library-routes.ts +276 -58
  38. package/server/canonical-path.ts +1 -1
  39. package/server/dev.ts +148 -44
  40. package/server/editor-server.ts +888 -61
  41. package/server/editor-sse.ts +115 -4
  42. package/server/harness-chat-service.ts +796 -0
  43. package/server/local-asset-catalog.ts +157 -22
  44. package/server/packaged.ts +51 -21
  45. package/server/process-shutdown.ts +136 -0
  46. package/server/prod.ts +9 -6
  47. package/server/project-hmr-files.ts +41 -0
  48. package/server/project-operations.ts +343 -0
  49. package/server/project-optimize-deps-entries.ts +4 -4
  50. package/server/project-output-writer.ts +156 -0
  51. package/server/project-validation.ts +140 -0
  52. package/server/project-view.ts +8 -50
  53. package/server/server-utils.ts +75 -10
  54. package/server/session-registry.ts +12 -0
  55. package/src/EditorContext.tsx +107 -3
  56. package/src/action-registry.ts +115 -17
  57. package/src/adapter-resolver.ts +213 -478
  58. package/src/asset-events.ts +64 -1
  59. package/src/asset-preview.ts +906 -0
  60. package/src/asset-selection.ts +121 -0
  61. package/src/asset-workflow/asset-capabilities.ts +259 -0
  62. package/src/asset-workflow/asset-editor-errors.ts +46 -0
  63. package/src/asset-workflow/asset-import-pipeline.ts +176 -0
  64. package/src/asset-workflow/asset-library-query.ts +107 -0
  65. package/src/asset-workflow/asset-types.ts +192 -0
  66. package/src/asset-workflow/asset-workflow-quality.ts +65 -0
  67. package/src/asset-workflow/import-contract.ts +113 -0
  68. package/src/asset-workflow/model-conversion.ts +126 -0
  69. package/src/asset-workflow/model-inspection.ts +185 -0
  70. package/src/asset-workflow/project-asset-commands.ts +23 -0
  71. package/src/asset-workflow/project-asset-health.ts +153 -0
  72. package/src/asset-workflow/project-asset-operations.ts +119 -0
  73. package/src/asset-workflow/thumbnail-system.ts +172 -0
  74. package/src/authoring/active-systems.ts +15 -0
  75. package/src/authoring/boundary-authoring-adapter.ts +16 -5
  76. package/src/authoring/composite-authoring-adapter.ts +305 -124
  77. package/src/authoring/design-time-layers.ts +300 -117
  78. package/src/authoring/edit-mode-authoring.ts +278 -293
  79. package/src/authoring/embed-only-adapter.ts +4 -2
  80. package/src/authoring/first-party-hierarchy-menu.ts +7 -2
  81. package/src/authoring/first-party-inspector/AddSectionMenu.tsx +5 -12
  82. package/src/authoring/first-party-inspector/EnvironmentSection.tsx +53 -126
  83. package/src/authoring/first-party-inspector/HeaderSection.tsx +54 -65
  84. package/src/authoring/first-party-inspector/is-first-party-selection.ts +30 -11
  85. package/src/authoring/first-party-inspector/register.tsx +13 -2
  86. package/src/authoring/ingest-authoring-adapter.ts +142 -45
  87. package/src/authoring/mount-failure-report.ts +5 -5
  88. package/src/authoring/provenance.ts +41 -0
  89. package/src/authoring/react-dom-authoring-adapter.ts +92 -92
  90. package/src/authoring/react-inspector-section.tsx +489 -51
  91. package/src/authoring/react-world-authoring-adapter.ts +541 -306
  92. package/src/authoring/story-overlay.ts +1 -1
  93. package/src/authoring/story-types.ts +11 -0
  94. package/src/authoring/vgai-scene-authoring-adapter.ts +54 -25
  95. package/src/authoring/viewport-tool-context.ts +78 -0
  96. package/src/authoring/world-canvas-viewport-state.ts +35 -0
  97. package/src/authoring/world-hidden-viewport.ts +186 -0
  98. package/src/authoring/world-pan-state.ts +33 -17
  99. package/src/authoring/world-session-state.ts +1 -1
  100. package/src/authoring/world2d-authoring-adapter.ts +109 -52
  101. package/src/availability-tick.ts +56 -0
  102. package/src/browser-play-entry.ts +5 -5
  103. package/src/browser-project-scripts.ts +1 -0
  104. package/src/build-identity.ts +15 -0
  105. package/src/command-listener.ts +893 -19
  106. package/src/components/AlignToolbar.tsx +74 -63
  107. package/src/components/AppRoot.tsx +193 -26
  108. package/src/components/ApplicationMenus.tsx +272 -0
  109. package/src/components/AssetBrowser.tsx +1450 -293
  110. package/src/components/AssetEditorShell.tsx +141 -0
  111. package/src/components/AssetImportDetails.tsx +218 -0
  112. package/src/components/AssetLibraryPanel.tsx +14 -0
  113. package/src/components/CameraInfo.tsx +11 -20
  114. package/src/components/CenterDocuments.tsx +585 -0
  115. package/src/components/CommandPalette.tsx +75 -30
  116. package/src/components/ConsolePanel.css +55 -0
  117. package/src/components/ConsolePanel.tsx +57 -112
  118. package/src/components/DebugConsolePanel.tsx +461 -0
  119. package/src/components/DebuggerPanel.tsx +165 -0
  120. package/src/components/DefaultEditorLayout.tsx +167 -231
  121. package/src/components/GameHierarchy.tsx +873 -290
  122. package/src/components/GamePerformanceOverlay.tsx +46 -0
  123. package/src/components/HarnessChatPanel.tsx +2352 -0
  124. package/src/components/HistoryPanel.tsx +226 -0
  125. package/src/components/Inspector.tsx +153 -99
  126. package/src/components/InspectorToolSection.tsx +6 -4
  127. package/src/components/MountFailureBanner.tsx +31 -48
  128. package/src/components/NetworkSection.tsx +25 -14
  129. package/src/components/OnlineAssetBrowser.tsx +794 -343
  130. package/src/components/OverlayReportBanner.tsx +38 -64
  131. package/src/components/PerformancePanel.tsx +206 -0
  132. package/src/components/PlayBar.tsx +93 -263
  133. package/src/components/PrefabSaveDialog.tsx +55 -127
  134. package/src/components/ProjectHeader.css +60 -0
  135. package/src/components/ProjectHeader.tsx +170 -105
  136. package/src/components/ProjectScreen.tsx +246 -184
  137. package/src/components/ReactCanvasControls.tsx +185 -0
  138. package/src/components/ResolutionPicker.tsx +85 -0
  139. package/src/components/RootActivateDialog.tsx +39 -68
  140. package/src/components/SaveDialog.tsx +55 -127
  141. package/src/components/SaveStatus.tsx +11 -29
  142. package/src/components/StartupLoadingScreen.tsx +96 -0
  143. package/src/components/StateWatchPanel.tsx +302 -0
  144. package/src/components/StatsOverlay.tsx +12 -5
  145. package/src/components/StatusBar.tsx +64 -0
  146. package/src/components/ThemeManagerDialog.css +89 -0
  147. package/src/components/ThemeManagerDialog.tsx +371 -0
  148. package/src/components/ToolHost.tsx +26 -15
  149. package/src/components/Toolbar.tsx +117 -214
  150. package/src/components/VgaiVoxelLogo.tsx +89 -0
  151. package/src/components/ViewportOverlay.tsx +97 -172
  152. package/src/components/ViewportPanel.tsx +130 -31
  153. package/src/components/WorkspaceDock.tsx +891 -0
  154. package/src/components/WorldSelectionOverlay.tsx +51 -63
  155. package/src/components/WorldTextEditor.tsx +9 -5
  156. package/src/components/asset-documents.tsx +390 -0
  157. package/src/components/asset-editor-persistence.ts +44 -0
  158. package/src/components/asset-selection-section.tsx +338 -0
  159. package/src/components/asset-viewers/AudioViewer.tsx +73 -21
  160. package/src/components/asset-viewers/GenericJsonViewer.tsx +26 -11
  161. package/src/components/asset-viewers/ImageViewer.tsx +43 -11
  162. package/src/components/asset-viewers/InputMapViewer.tsx +512 -134
  163. package/src/components/asset-viewers/MaterialAssetEditor.tsx +540 -0
  164. package/src/components/asset-viewers/ModelViewer.tsx +805 -121
  165. package/src/components/asset-viewers/OnlineAssetDetail.tsx +177 -60
  166. package/src/components/asset-viewers/SourceAssetViewer.tsx +121 -0
  167. package/src/components/asset-workflow.css +506 -0
  168. package/src/components/build-documents.tsx +696 -0
  169. package/src/components/core-utilities.tsx +75 -0
  170. package/src/components/data-documents.tsx +364 -0
  171. package/src/components/{DataPanel.tsx → data-editor.tsx} +138 -288
  172. package/src/components/debugger-panel-state.ts +57 -0
  173. package/src/components/inspector-widgets/AlignmentGrid.tsx +8 -14
  174. package/src/components/inspector-widgets/BorderEditor.tsx +41 -33
  175. package/src/components/inspector-widgets/ColorPicker.tsx +39 -39
  176. package/src/components/inspector-widgets/FontPicker.tsx +13 -21
  177. package/src/components/inspector-widgets/GradientEditor.tsx +11 -19
  178. package/src/components/inspector-widgets/ScrubbableInput.tsx +6 -3
  179. package/src/components/inspector-widgets/ShadowEditor.tsx +20 -33
  180. package/src/components/inspector-widgets/shared.tsx +90 -49
  181. package/src/components/inspectors/AnimationSection.tsx +39 -40
  182. package/src/components/inspectors/AudioSection.tsx +28 -39
  183. package/src/components/inspectors/BoneAttachmentSection.tsx +19 -24
  184. package/src/components/inspectors/CameraSection.tsx +14 -23
  185. package/src/components/inspectors/ComponentsSection.tsx +39 -43
  186. package/src/components/inspectors/JointsSection.tsx +34 -43
  187. package/src/components/inspectors/LightSection.tsx +90 -35
  188. package/src/components/inspectors/MaterialSection.tsx +137 -174
  189. package/src/components/inspectors/MeshSection.tsx +9 -17
  190. package/src/components/inspectors/NavigationSection.tsx +8 -15
  191. package/src/components/inspectors/ParticleSection.tsx +91 -76
  192. package/src/components/inspectors/PhysicsSection.tsx +42 -46
  193. package/src/components/inspectors/PostProcessingSection.tsx +28 -36
  194. package/src/components/inspectors/RenderingSection.tsx +12 -20
  195. package/src/components/inspectors/ShadowSection.tsx +7 -8
  196. package/src/components/inspectors/SplineSection.tsx +31 -42
  197. package/src/components/inspectors/TransformSection.tsx +14 -22
  198. package/src/components/patterns/Dialog.tsx +95 -0
  199. package/src/components/patterns/Fields.tsx +44 -0
  200. package/src/components/patterns/List.tsx +25 -0
  201. package/src/components/patterns/StateSurface.tsx +40 -0
  202. package/src/components/patterns/Surfaces.tsx +115 -0
  203. package/src/components/patterns/Tabs.tsx +80 -0
  204. package/src/components/patterns/Toolbar.tsx +51 -0
  205. package/src/components/patterns/Tree.tsx +72 -0
  206. package/src/components/primitives/Button.tsx +46 -0
  207. package/src/components/primitives/ColorInput.tsx +11 -47
  208. package/src/components/primitives/EditorIcon.tsx +99 -0
  209. package/src/components/primitives/FormControls.tsx +71 -0
  210. package/src/components/primitives/JsonInput.tsx +15 -2
  211. package/src/components/primitives/Layout.tsx +100 -0
  212. package/src/components/primitives/Menu.tsx +105 -0
  213. package/src/components/primitives/NumberInput.tsx +8 -35
  214. package/src/components/primitives/Panel.tsx +49 -44
  215. package/src/components/primitives/SectionHeader.tsx +10 -28
  216. package/src/components/primitives/Text.tsx +46 -0
  217. package/src/components/primitives/Tooltip.tsx +20 -12
  218. package/src/components/primitives/Vec3Input.tsx +3 -0
  219. package/src/components/primitives/banner-tones.ts +33 -0
  220. package/src/components/primitives/editor-icons.ts +102 -0
  221. package/src/components/primitives/panel-header-styles.ts +30 -0
  222. package/src/components/project-operation-documents.tsx +226 -0
  223. package/src/components/status-contributions.tsx +175 -0
  224. package/src/components/story-documents-register.ts +15 -0
  225. package/src/components/story-documents.tsx +1185 -0
  226. package/src/components/tool-documents.tsx +110 -0
  227. package/src/components/workspace-dock.css +293 -0
  228. package/src/components/workspace-history.ts +33 -0
  229. package/src/components/world-documents.tsx +145 -0
  230. package/src/components/xstate-documents.tsx +209 -0
  231. package/src/composite-screenshot.ts +248 -0
  232. package/src/design-system/index.ts +70 -0
  233. package/src/design-system-stories/Foundation.stories.tsx +183 -0
  234. package/src/design-system-stories/Patterns.stories.tsx +251 -0
  235. package/src/design-system-stories/Workspace.stories.tsx +538 -0
  236. package/src/doctor/report.ts +57 -13
  237. package/src/editor-api.ts +295 -31
  238. package/src/editor-compatibility.ts +200 -0
  239. package/src/editor-console.ts +35 -17
  240. package/src/editor-hotkeys.ts +85 -33
  241. package/src/editor-store.ts +538 -233
  242. package/src/editor-viewport.ts +160 -34
  243. package/src/entity-factory.ts +14 -3
  244. package/src/gizmo-registry.ts +21 -5
  245. package/src/harness-chat-editor-context.ts +37 -0
  246. package/src/harness-chat-indicator.ts +68 -0
  247. package/src/harness-chat-layout.ts +53 -0
  248. package/src/harness-chat-lifecycle.ts +170 -0
  249. package/src/harness-chat-reconnect.ts +85 -0
  250. package/src/harness-chat-types.ts +409 -0
  251. package/src/hierarchy-drop.ts +50 -0
  252. package/src/hierarchy-expansion-state.ts +100 -0
  253. package/src/hierarchy-menu-registry.ts +1 -1
  254. package/src/hierarchy-projection.ts +76 -0
  255. package/src/history/editor-session.ts +21 -0
  256. package/src/history/history-commands.ts +147 -0
  257. package/src/history/history-service.ts +904 -0
  258. package/src/history/json-history-resource.ts +165 -0
  259. package/src/history/persistence-coordinator.ts +35 -0
  260. package/src/history/project-file-history.ts +266 -0
  261. package/src/history/project-root-history-backends.ts +53 -0
  262. package/src/history/resource-registry.ts +209 -0
  263. package/src/history/snapshot-store.ts +108 -0
  264. package/src/history/source-history-backend.ts +374 -0
  265. package/src/history/types.ts +100 -0
  266. package/src/hmr-registration-group.ts +67 -0
  267. package/src/hmr-stable-react-context.ts +23 -0
  268. package/src/hosted-example.ts +12 -2
  269. package/src/hotkeys.ts +89 -18
  270. package/src/ingest/discovery-react.ts +9 -10
  271. package/src/ingest/discovery.ts +4 -4
  272. package/src/ingest/discovery2d.ts +5 -5
  273. package/src/ingest/games/bloom-composer/vgai.game.json +3 -3
  274. package/src/ingest/games/embed-bundle/vgai.game.json +3 -3
  275. package/src/ingest/games/games-fps/vgai.game.json +3 -3
  276. package/src/ingest/games/iframe-reachable/vgai.game.json +3 -3
  277. package/src/ingest/games/interactive-cubes/vgai.game.json +3 -3
  278. package/src/ingest/games/mismatched-three/vgai.game.json +3 -3
  279. package/src/ingest/games/own-three-bundled/vgai.game.json +3 -3
  280. package/src/ingest/games/pointerlock-maze/vgai.game.json +7 -4
  281. package/src/ingest/games-2d/bubbo-bubbo/vgai.game.json +3 -3
  282. package/src/ingest/games-2d/bunnymark/vgai.game.json +3 -3
  283. package/src/ingest/games-2d/flappy/vgai.game.json +3 -3
  284. package/src/ingest/games-2d/flappy-pixi/vgai.game.json +3 -3
  285. package/src/ingest/games-2d/puzzling-potions/vgai.game.json +3 -3
  286. package/src/ingest/games-2d/tilemap-camera/vgai.game.json +3 -3
  287. package/src/ingest/games-react/react-rpg/vgai.game.json +3 -3
  288. package/src/ingest/types.ts +1 -1
  289. package/src/ingest-mode.ts +47 -52
  290. package/src/ingest-siblings.ts +23 -33
  291. package/src/initial-scene.ts +1 -2
  292. package/src/main.tsx +16 -8
  293. package/src/manifest-project.ts +10 -12
  294. package/src/model-thumbnail.ts +261 -26
  295. package/src/module-mode.ts +44 -50
  296. package/src/play-log-events.ts +26 -0
  297. package/src/play-mode.ts +495 -401
  298. package/src/play-scene-adoption.ts +23 -0
  299. package/src/playground/main.ts +68 -24
  300. package/src/playwright-shim.ts +473 -0
  301. package/src/project-manager.ts +90 -10
  302. package/src/project-operations.ts +112 -0
  303. package/src/project-story-discovery.ts +25 -0
  304. package/src/project-tool-discovery.ts +43 -0
  305. package/src/scene-serializer.ts +0 -6
  306. package/src/scene-sync.ts +7 -2
  307. package/src/script-loader.ts +3 -3
  308. package/src/skeleton-helper.ts +57 -0
  309. package/src/storage/seed.ts +68 -8
  310. package/src/stories/StoryPreviewMount.tsx +265 -0
  311. package/src/stories/action-stories.fixture.tsx +44 -0
  312. package/src/stories/button-stories.fixture.tsx +50 -0
  313. package/src/stories/compose-project-stories.ts +182 -0
  314. package/src/stories/loader-stories.fixture.tsx +53 -0
  315. package/src/stories/story-discovery.ts +130 -0
  316. package/src/stories/story-registry.ts +146 -0
  317. package/src/theme-css.ts +1049 -0
  318. package/src/theme-library.ts +238 -0
  319. package/src/theme-preference.ts +130 -0
  320. package/src/theme.ts +527 -0
  321. package/src/tool-loader.ts +80 -24
  322. package/src/ui-source/inspect.ts +27 -4
  323. package/src/ui-source/source-write-backend.ts +83 -22
  324. package/src/widgets/index.ts +9 -18
  325. package/src/workspace-aux-commands.ts +11 -0
  326. package/src/workspace-dock-controller.ts +64 -0
  327. package/src/workspace-document-ids.ts +5 -0
  328. package/src/workspace-document-registry.ts +367 -0
  329. package/src/workspace-state-persistence.ts +455 -0
  330. package/src/workspace-status-registry.ts +110 -0
  331. package/src/workspace-utility-commands.ts +49 -0
  332. package/src/workspace-utility-registry.ts +161 -0
  333. package/src/world-document-routing.ts +16 -0
  334. package/src/xstate-inspect/XStateMachineInspector.tsx +544 -0
  335. package/src/xstate-inspect/character-animation-machine.fixture.ts +74 -0
  336. package/src/xstate-inspect/use-live-actor-state.ts +39 -0
  337. package/src/xstate-inspect/xstate-graph.ts +265 -0
  338. package/src/xstate-inspect/xstate-layout.ts +76 -0
  339. package/src/z-index.ts +26 -0
  340. package/template/.claude/skills/editor/SKILL.md +129 -90
  341. package/template/AGENTS.md +1110 -0
  342. package/template/CLAUDE.md +1 -512
  343. package/template/IDIOMS.md +50 -0
  344. package/template/check-idioms.ts +706 -0
  345. package/template/manifest-entry-modules-plugin.ts +53 -0
  346. package/template/package.json +13 -4
  347. package/template/public/scenes/default.scn2d.json +6 -0
  348. package/template/public/scenes/default.vscn.json +7 -1
  349. package/template/public/scenes/untitled.vscn.json +10 -0
  350. package/template/scripts/playtest.ts +40 -0
  351. package/template/server/loopback.ts +75 -0
  352. package/template/server/rooms/arena-room.ts +69 -1
  353. package/template/server/rooms/game-room.ts +68 -1
  354. package/template/src/data/README.md +9 -4
  355. package/template/src/data/data-ref.ts +35 -0
  356. package/template/src/data/tuning.schema.ts +1 -1
  357. package/template/src/main.ts +41 -62
  358. package/template/src/manifest-entry-modules.d.ts +3 -0
  359. package/template/src/operations/README.md +88 -0
  360. package/template/src/runtime/pixi-adapter.ts +24 -0
  361. package/template/src/scripts/components/data-spinner.ts +43 -2
  362. package/template/src/scripts/components/spin-lap-math.ts +27 -0
  363. package/template/src/tools/README.md +5 -3
  364. package/template/src/tools/example.tool.tsx +13 -7
  365. package/template/src/ui/Button.stories.tsx +66 -0
  366. package/template/src/ui/RebindPanel.tsx +2 -6
  367. package/template/src/ui/game.tsx +17 -0
  368. package/template/tests/acceptance/example.spec.ts +64 -0
  369. package/template/tests/logic/example.test.ts +31 -0
  370. package/template/tests/logic/room.test.ts +100 -0
  371. package/template/tests/tsconfig.json +30 -0
  372. package/template/validate-manifest.ts +5 -5
  373. package/template/validate-scenes.ts +50 -18
  374. package/template/vgai.game.json +20 -13
  375. package/template/vite.config.ts +77 -16
  376. package/vite-plugin-ui-oid.ts +261 -17
  377. package/dist/assets/CCDIKSolver-Dz-ysxZF.js +0 -1
  378. package/dist/assets/SelectionBox-BXsv_6aH.js +0 -1
  379. package/dist/assets/browser-project-scripts-DOru4L1x.js +0 -2
  380. package/dist/assets/browserAll-CEkWYlFk.js +0 -1
  381. package/dist/assets/create-runtime-DYIWr3va.js +0 -1
  382. package/dist/assets/data-asset-Bb9sIM7i.js +0 -5
  383. package/dist/assets/game-8SDZPPgH.js +0 -1
  384. package/dist/assets/game-CevorxyV.js +0 -1
  385. package/dist/assets/game-Di7XlywD.js +0 -1
  386. package/dist/assets/game-DjnCaw8R.js +0 -1
  387. package/dist/assets/game-Q9A0aXSV.js +0 -1
  388. package/dist/assets/index-CPVV6pjw.js +0 -1
  389. package/dist/assets/index-CpOnYyeD.js +0 -213
  390. package/dist/assets/index-Dr8H_6Rl.js +0 -1
  391. package/dist/assets/index-_bCaipUk.js +0 -13650
  392. package/dist/assets/ingest-siblings-Dz8eEqrV.js +0 -1
  393. package/dist/assets/mount-manifest-Bhk0ohsl.js +0 -1
  394. package/dist/assets/scene-query-BivAHhJu.js +0 -1
  395. package/dist/assets/webworkerAll-BLrH0F6F.js +0 -1
  396. package/dist/assets/xstate-animation-binding-1NGLmw6y.js +0 -1
  397. package/dist/assets/xstate.esm-BgUD33nl.js +0 -3
  398. package/src/authoring/scene-ui-layer.ts +0 -485
  399. package/src/authoring/ui-authoring-adapter.ts +0 -325
  400. package/src/authoring/ui-hierarchy-menu.ts +0 -40
  401. package/src/authoring/ui-inspector-sections.tsx +0 -156
  402. package/src/authoring/undo-timeline.ts +0 -145
  403. package/src/components/BottomPanel.tsx +0 -326
  404. package/src/components/BuildPanel.tsx +0 -455
  405. package/src/components/FolderTree.tsx +0 -179
  406. package/src/components/RightPanel.tsx +0 -166
  407. package/src/components/WorldContextMenu.tsx +0 -257
  408. package/src/components/asset-viewers/AssetViewer.tsx +0 -38
  409. package/src/ingest/games-react/react-rpg/src/ui/game-state.tsx +0 -129
  410. package/src/scene-ui-mode/active-scene-ui.ts +0 -58
  411. package/src/scene-ui-mode/scene-ui-palette-panel.tsx +0 -152
  412. package/src/scene-ui-mode/scene-ui-timeline-tab.tsx +0 -29
  413. package/src/scene-ui-mode/ui-prefab-dialog-host.tsx +0 -74
  414. package/src/scene-ui-mode/ui-prefab-hierarchy-menu.ts +0 -49
  415. package/src/scene-ui-mode/ui-prefab-io.ts +0 -76
  416. package/src/ui-editor/inspector.tsx +0 -563
  417. package/src/ui-editor/node-ops.ts +0 -266
  418. package/src/ui-editor/overlay.tsx +0 -380
  419. package/src/ui-editor/palette.tsx +0 -114
  420. package/src/ui-editor/react-store.ts +0 -78
  421. package/src/ui-editor/timeline-panel.tsx +0 -443
  422. package/src/ui-editor/ui-edit-store.ts +0 -552
  423. package/src/ui-editor/ui-prefab.ts +0 -95
  424. package/template/project.json +0 -9
  425. package/template/src/scripts/main.ts +0 -94
  426. package/template/src/ui/DefaultHud.tsx +0 -40
  427. package/template/src/ui/game-state.tsx +0 -37
  428. package/template/src/ui/mount-default-hud.tsx +0 -19
  429. package/template/src/ui/mount-ui.ts +0 -15
  430. package/vite-plugin-react-world-provider.ts +0 -81
@@ -0,0 +1,390 @@
1
+ /**
2
+ * Asset DOCUMENTS (W2, docs/EDITOR-WORKSPACE-SHELL-TODO.md §5.1 / §9 W2 —
3
+ * inventory rows R2–R7): model/image/audio/input-map/JSON viewers open as
4
+ * CENTER workspace documents through `workspace-document-registry.ts`,
5
+ * replacing the former `RightPanel` asset-tab mechanism (`editor-store.ts`'s
6
+ * `AssetTab` list, deleted in this wave). The Inspector is never displaced by
7
+ * a viewer again (§10 acceptance #3).
8
+ *
9
+ * Identity (§7.1 stable ids): document ids keep the exact key vocabulary the
10
+ * old store tabs used, so the control-API surface (`open-asset-tab` /
11
+ * `close-asset-tab` / `active-tab` in `command-listener.ts`, `vgai
12
+ * open-asset`) keeps its meaning unchanged:
13
+ *
14
+ * - project asset → the serving path itself (`/textures/crate.png`)
15
+ * - Asset Lab → `asset-lab:entity:<entityId>`
16
+ * - online asset → `online:<source>:<id>`
17
+ *
18
+ * Titles are source-owned file names as authored (§8 — `crate.png`, never a
19
+ * technology bucket); the online document keeps the catalog's own asset name.
20
+ *
21
+ * Per-document RUNTIME state (an online asset resolving to a local path after
22
+ * download) lives in a module-scope spec map in the house
23
+ * `useSyncExternalStore` shape — the registry's descriptors stay immutable,
24
+ * and `AssetDocumentContent` re-renders from the spec map. Specs are dropped
25
+ * on document dispose (close / project teardown via
26
+ * `closeAllWorkspaceDocuments`), so nothing leaks across sessions.
27
+ *
28
+ * T6.3 interplay: activating an asset document means neither the scene
29
+ * viewport nor the Game preview is the active center surface, so the
30
+ * descriptor's `onActivate` writes the store's `'scene'` tab — the play input
31
+ * gate (`playState === 'playing' && activeViewportTab === 'game'`) drops
32
+ * without stopping play, exactly like clicking the scene tab.
33
+ */
34
+
35
+ import { getUserData } from '@engine/scene/user-data';
36
+ import { type ReactNode, useEffect, useSyncExternalStore } from 'react';
37
+ import type * as THREE from 'three';
38
+ import { bg, danger, text } from '../design-system';
39
+ import type { AssetKind, OnlineAssetInfo } from '../editor-store';
40
+ import {
41
+ openWorkspaceDocument,
42
+ setWorkspaceDocumentTitle,
43
+ type WorkspaceDocumentContentProps,
44
+ type WorkspaceDocumentDescriptor,
45
+ } from '../workspace-document-registry';
46
+ import { AssetEditorShell } from './AssetEditorShell';
47
+ import { AssetImportDetails } from './AssetImportDetails';
48
+ import { AudioViewer } from './asset-viewers/AudioViewer';
49
+ import { GenericJsonViewer } from './asset-viewers/GenericJsonViewer';
50
+ import { ImageViewer } from './asset-viewers/ImageViewer';
51
+ import { InputMapViewer } from './asset-viewers/InputMapViewer';
52
+ import { MaterialAssetEditor } from './asset-viewers/MaterialAssetEditor';
53
+ import { ModelViewer } from './asset-viewers/ModelViewer';
54
+ import { OnlineAssetDetail } from './asset-viewers/OnlineAssetDetail';
55
+ import { SourceAssetViewer } from './asset-viewers/SourceAssetViewer';
56
+ import './asset-workflow.css';
57
+
58
+ /** What one open asset document is showing — the former `AssetTab` shape,
59
+ * now keyed by workspace-document id. */
60
+ export interface AssetDocumentSpec {
61
+ readonly assetPath: string;
62
+ readonly kind: AssetKind;
63
+ /** Entity source for a session-only Asset Lab document. Never serialized. */
64
+ readonly entityId?: string;
65
+ /** Present while this document shows an online (not-yet-downloaded) asset. */
66
+ readonly online?: OnlineAssetInfo;
67
+ readonly unavailableReason?: string;
68
+ }
69
+
70
+ export interface AssetDocumentMutation {
71
+ type: 'move' | 'delete' | 'change';
72
+ oldPath?: string;
73
+ newPath?: string;
74
+ paths?: readonly string[];
75
+ }
76
+
77
+ const _specs = new Map<string, AssetDocumentSpec>();
78
+ const _pathAliases = new Map<string, string>();
79
+ let _version = 0;
80
+ const _listeners = new Set<() => void>();
81
+
82
+ function notifyChanged(): void {
83
+ _version++;
84
+ for (const fn of _listeners) fn();
85
+ }
86
+
87
+ /** Subscribe to spec changes (online-asset resolution). Returns unsubscribe. */
88
+ export function subscribeAssetDocuments(fn: () => void): () => void {
89
+ _listeners.add(fn);
90
+ return () => {
91
+ _listeners.delete(fn);
92
+ };
93
+ }
94
+
95
+ /** Monotonic change counter — the `getSnapshot` for `useSyncExternalStore`. */
96
+ export function assetDocumentsVersion(): number {
97
+ return _version;
98
+ }
99
+
100
+ /** The spec behind an open asset document id, or `undefined`. */
101
+ export function assetDocumentSpec(id: string): AssetDocumentSpec | undefined {
102
+ return _specs.get(id);
103
+ }
104
+
105
+ /** Whether `id` is one of this module's asset documents (used by
106
+ * `command-listener.ts` to report the legacy `activeTabKey` facet). */
107
+ export function isAssetDocumentId(id: string): boolean {
108
+ return _specs.has(id);
109
+ }
110
+
111
+ /** The narrow store surface asset documents need (T6.3 gate hand-off). */
112
+ export interface AssetDocumentStore {
113
+ setActiveViewportTab(tab: 'scene' | 'game'): void;
114
+ }
115
+
116
+ /** The Asset Lab additionally needs the live object map for its §8 title. */
117
+ export interface EntityAssetDocumentStore extends AssetDocumentStore {
118
+ readonly objectMap: Map<string, THREE.Object3D>;
119
+ }
120
+
121
+ function openSpecDocument(
122
+ store: AssetDocumentStore,
123
+ id: string,
124
+ title: string,
125
+ spec: AssetDocumentSpec,
126
+ provenance?: WorkspaceDocumentDescriptor['provenance'],
127
+ ): string {
128
+ if (!_specs.has(id)) {
129
+ _specs.set(id, spec);
130
+ notifyChanged();
131
+ }
132
+ const descriptor: WorkspaceDocumentDescriptor = {
133
+ id,
134
+ title,
135
+ kind: 'asset',
136
+ ...(provenance ? { provenance } : {}),
137
+ Content: AssetDocumentContent,
138
+ closeable: true,
139
+ onActivate: () => store.setActiveViewportTab('scene'),
140
+ onDispose: (documentId) => {
141
+ if (_specs.delete(documentId)) notifyChanged();
142
+ },
143
+ };
144
+ return openWorkspaceDocument(descriptor);
145
+ }
146
+
147
+ /**
148
+ * Open a project asset as a center document (double-click/Enter in the asset
149
+ * browser, `open-asset-tab` control command). Re-opening an already-open
150
+ * path activates the existing document (registry dedupe).
151
+ */
152
+ export function openAssetDocument(
153
+ store: AssetDocumentStore,
154
+ assetPath: string,
155
+ kind: AssetKind,
156
+ ): string {
157
+ const title = assetPath.split('/').pop() ?? assetPath;
158
+ const id = _pathAliases.get(normalizeAssetPath(assetPath)) ?? assetPath;
159
+ return openSpecDocument(store, id, title, { assetPath, kind }, { sourcePath: assetPath });
160
+ }
161
+
162
+ /** Open the Asset Lab document for a live entity (`Open in Asset Lab`). */
163
+ export function openEntityAssetDocument(store: EntityAssetDocumentStore, entityId: string): void {
164
+ const object = store.objectMap.get(entityId);
165
+ if (!object) return;
166
+ // NOTE: no `SceneEntity` import here (authoring-inversion ratchet —
167
+ // `authoring-inversion-guard.test.ts`): only the descriptor's `name` is
168
+ // read, structurally.
169
+ const entity = getUserData(object, 'entity') as { name?: string } | undefined;
170
+ const title = entity?.name ?? object.name ?? entityId;
171
+ openSpecDocument(
172
+ store,
173
+ `asset-lab:entity:${entityId}`,
174
+ title,
175
+ { assetPath: '', kind: 'model', entityId },
176
+ { origin: `entity:${entityId}` },
177
+ );
178
+ }
179
+
180
+ /** Open an online-library asset's detail/download document. */
181
+ export function openOnlineAssetDocument(store: AssetDocumentStore, online: OnlineAssetInfo): void {
182
+ const kind: AssetKind =
183
+ online.type === 'model'
184
+ ? 'model'
185
+ : online.type === 'animation' || online.type === 'source'
186
+ ? 'source'
187
+ : 'image';
188
+ openSpecDocument(
189
+ store,
190
+ `online:${online.source}:${online.id}`,
191
+ online.name,
192
+ { assetPath: '', kind, online },
193
+ { origin: `online:${online.source}:${online.id}` },
194
+ );
195
+ }
196
+
197
+ /** Point an online asset document at its downloaded local file — the local
198
+ * viewer takes over in place (same document id/title). */
199
+ export function resolveOnlineAssetDocument(id: string, localPath: string): void {
200
+ const spec = _specs.get(id);
201
+ if (!spec) return;
202
+ const { online: _dropped, ...rest } = spec;
203
+ _specs.set(id, { ...rest, assetPath: localPath });
204
+ notifyChanged();
205
+ }
206
+
207
+ /** Test-only reset — drops all specs without touching the document registry
208
+ * (pair it with `__resetWorkspaceDocumentRegistryForTest`). */
209
+ export function __resetAssetDocumentsForTest(): void {
210
+ _specs.clear();
211
+ _pathAliases.clear();
212
+ notifyChanged();
213
+ }
214
+
215
+ /** Keep a live editor bound to asset identity while its source path changes. */
216
+ export function applyAssetDocumentMutation(
217
+ documentId: string,
218
+ detail: AssetDocumentMutation,
219
+ ): void {
220
+ const spec = _specs.get(documentId);
221
+ if (!spec?.assetPath) return;
222
+ const current = normalizeAssetPath(spec.assetPath);
223
+ if (
224
+ detail.type === 'move' &&
225
+ detail.oldPath &&
226
+ detail.newPath &&
227
+ current === normalizeAssetPath(detail.oldPath)
228
+ ) {
229
+ const newPath = `/${normalizeAssetPath(detail.newPath)}`;
230
+ _specs.set(documentId, { ...spec, assetPath: newPath });
231
+ _pathAliases.set(normalizeAssetPath(newPath), documentId);
232
+ setWorkspaceDocumentTitle(documentId, newPath.split('/').pop() ?? newPath);
233
+ notifyChanged();
234
+ } else if (
235
+ detail.type === 'delete' &&
236
+ detail.paths?.some((path) => normalizeAssetPath(path) === current)
237
+ ) {
238
+ _specs.set(documentId, {
239
+ ...spec,
240
+ unavailableReason: `The source ${spec.assetPath} was deleted. Undo the deletion or close this editor.`,
241
+ });
242
+ notifyChanged();
243
+ }
244
+ }
245
+
246
+ export type AssetDocumentViewerRoute =
247
+ | 'online'
248
+ | 'model'
249
+ | 'image'
250
+ | 'audio'
251
+ | 'material'
252
+ | 'source'
253
+ | 'input-map'
254
+ | 'json'
255
+ | 'unsupported';
256
+
257
+ /** Pure routing decision, exported so every recognized asset kind is test-pinned. */
258
+ export function assetDocumentViewerRoute(spec: AssetDocumentSpec): AssetDocumentViewerRoute {
259
+ if (spec.online) return 'online';
260
+ if (spec.kind === 'json')
261
+ return spec.assetPath.split(/[?#]/, 1)[0]!.endsWith('.inputmap.json') ? 'input-map' : 'json';
262
+ if (['model', 'image', 'audio', 'material', 'source'].includes(spec.kind))
263
+ return spec.kind as AssetDocumentViewerRoute;
264
+ return 'unsupported';
265
+ }
266
+
267
+ /** Routes a spec to its center viewer/editor. */
268
+ function AssetViewerBody({
269
+ id,
270
+ spec,
271
+ active,
272
+ }: {
273
+ id: string;
274
+ spec: AssetDocumentSpec;
275
+ active: boolean;
276
+ }) {
277
+ if (spec.unavailableReason) {
278
+ return (
279
+ <AssetEditorShell
280
+ type={spec.kind}
281
+ title={spec.assetPath.split('/').pop() || 'Deleted asset'}
282
+ status="Source unavailable"
283
+ >
284
+ <div style={{ padding: 20, color: danger }}>{spec.unavailableReason}</div>
285
+ </AssetEditorShell>
286
+ );
287
+ }
288
+ const route = assetDocumentViewerRoute(spec);
289
+ if (route === 'online' && spec.online) {
290
+ return (
291
+ <OnlineAssetDetail
292
+ online={spec.online}
293
+ onResolved={(localPath) => resolveOnlineAssetDocument(id, localPath)}
294
+ />
295
+ );
296
+ }
297
+ const title = spec.assetPath.split('/').pop() || spec.entityId || 'Asset';
298
+ if (route === 'model')
299
+ return (
300
+ <ModelViewer
301
+ assetPath={spec.assetPath || undefined}
302
+ entityId={spec.entityId}
303
+ active={active}
304
+ />
305
+ );
306
+ if (route === 'source') return <SourceAssetViewer assetPath={spec.assetPath} active={active} />;
307
+ let viewer: ReactNode;
308
+ switch (route) {
309
+ case 'image':
310
+ viewer = <ImageViewer assetPath={spec.assetPath} />;
311
+ break;
312
+ case 'audio':
313
+ viewer = <AudioViewer assetPath={spec.assetPath} />;
314
+ break;
315
+ case 'material':
316
+ viewer = <MaterialAssetEditor assetPath={spec.assetPath} documentId={id} />;
317
+ break;
318
+ case 'input-map':
319
+ viewer = <InputMapViewer assetPath={spec.assetPath} documentId={id} />;
320
+ break;
321
+ case 'json':
322
+ viewer = <GenericJsonViewer assetPath={spec.assetPath} />;
323
+ break;
324
+ default:
325
+ viewer = (
326
+ <div style={{ padding: 16, color: text[2], fontSize: 12 }}>
327
+ No viewer available for this asset type.
328
+ </div>
329
+ );
330
+ }
331
+ return (
332
+ <AssetEditorShell
333
+ type={route}
334
+ title={title}
335
+ details={
336
+ <div style={{ padding: 4 }}>
337
+ Source
338
+ <br />
339
+ {spec.assetPath}
340
+ <AssetImportDetails assetPath={spec.assetPath} />
341
+ </div>
342
+ }
343
+ status={`${route} · ${spec.assetPath}`}
344
+ >
345
+ {viewer}
346
+ </AssetEditorShell>
347
+ );
348
+ }
349
+
350
+ /**
351
+ * Full-size type-specific Asset Editor document host.
352
+ */
353
+ export function AssetDocumentContent({ documentId, active }: WorkspaceDocumentContentProps) {
354
+ useSyncExternalStore(subscribeAssetDocuments, assetDocumentsVersion);
355
+ useEffect(() => {
356
+ const handleMutation = (rawEvent: Event) => {
357
+ applyAssetDocumentMutation(
358
+ documentId,
359
+ (rawEvent as CustomEvent<AssetDocumentMutation>).detail,
360
+ );
361
+ };
362
+ window.addEventListener('editor:asset-mutation', handleMutation);
363
+ return () => window.removeEventListener('editor:asset-mutation', handleMutation);
364
+ }, [documentId]);
365
+ const spec = _specs.get(documentId);
366
+ return (
367
+ <div
368
+ data-testid={`asset-document:${documentId}`}
369
+ style={{
370
+ flex: 1,
371
+ minHeight: 0,
372
+ overflowY: 'auto',
373
+ pointerEvents: 'auto',
374
+ background: bg[1],
375
+ }}
376
+ >
377
+ {spec ? (
378
+ <AssetViewerBody id={documentId} spec={spec} active={active} />
379
+ ) : (
380
+ <div style={{ padding: 16, color: text[2], fontSize: 12 }}>
381
+ This asset document is no longer available.
382
+ </div>
383
+ )}
384
+ </div>
385
+ );
386
+ }
387
+
388
+ function normalizeAssetPath(path: string): string {
389
+ return path.split(/[?#]/, 1)[0]!.replace(/^\/+/, '');
390
+ }
@@ -0,0 +1,44 @@
1
+ import { getProjectFileHistory } from '../history/project-file-history';
2
+ import type { ResourceKind } from '../history/types';
3
+ import { getStorageBackend } from '../storage';
4
+ import { workspaceHistoryService } from './workspace-history';
5
+
6
+ /** Convert an asset's public serving URL into the StorageBackend path. */
7
+ export function projectAssetPath(assetPath: string): string {
8
+ const path = assetPath.split(/[?#]/, 1)[0]!.replace(/^\/+/, '');
9
+ if (!path) throw new Error('Project asset path cannot be empty.');
10
+ return path;
11
+ }
12
+
13
+ /** Persist one authored asset through the project-wide undo history. */
14
+ export async function writeProjectAsset(
15
+ assetPath: string,
16
+ content: string,
17
+ options: { label: string; kind: ResourceKind },
18
+ ): Promise<boolean> {
19
+ const path = projectAssetPath(assetPath);
20
+ const history = workspaceHistoryService();
21
+ const ok = history
22
+ ? await getProjectFileHistory(history).write(path, content, {
23
+ label: options.label,
24
+ kind: options.kind,
25
+ contentType: 'application/json',
26
+ })
27
+ : await getStorageBackend()
28
+ .write(path, content)
29
+ .then(() => true);
30
+ if (ok && typeof window !== 'undefined') {
31
+ window.dispatchEvent(new CustomEvent('editor:assets-changed'));
32
+ }
33
+ return ok;
34
+ }
35
+
36
+ /** Refresh an open editor after undo/redo or another surface writes its file. */
37
+ export function subscribeProjectAsset(assetPath: string, listener: () => void): () => void {
38
+ const history = workspaceHistoryService();
39
+ if (!history) return () => {};
40
+ const path = projectAssetPath(assetPath);
41
+ return getProjectFileHistory(history).subscribeAll((changedPath) => {
42
+ if (changedPath === path) listener();
43
+ });
44
+ }