@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,265 @@
1
+ /**
2
+ * E3 (spec §11 E3, docs/AI-NATIVE-AUTHORING-IMPLEMENTATION-SPEC.md) — pure,
3
+ * UI-free extraction of a renderable node/edge graph from a real XState v5
4
+ * machine. No separate graph format is persisted anywhere (E3's own AC): this
5
+ * module reads `machine.root` (a `StateNode`) and its `.states`/`.on`/
6
+ * `.always`/`.meta` directly, every time it's called — the "graph" is just a
7
+ * derived view, recomputed from the live machine configuration.
8
+ *
9
+ * ## Which xstate v5 accessors this uses, and why
10
+ *
11
+ * Confirmed against the installed `xstate@5.32.4` (`node_modules/xstate/dist/
12
+ * declarations/src/StateNode.d.ts`) and by instrumenting the real
13
+ * `characterAnimationMachine` (examples/third-person/src/components.ts) at
14
+ * runtime:
15
+ *
16
+ * - `StateNode.states: Record<string, StateNode>` — child state nodes,
17
+ * walked recursively for nested/compound machines. Absent (`{}`) on atomic
18
+ * leaves.
19
+ * - `StateNode.id` — the full dotted id (e.g. `"character-animation.idle"`),
20
+ * used as this module's node id throughout (stable, globally unique within
21
+ * one machine).
22
+ * - `StateNode.on: TransitionDefinitionMap` — a `Record<eventType,
23
+ * TransitionDefinition[]>` of this state's OWN event-triggered transitions
24
+ * (does NOT include ancestor/root `on` handlers with no target on this
25
+ * node, and does NOT include `always` — confirmed by probing the real
26
+ * machine: `idle.on` has only `JUMP`, not the root-level `UPDATE`).
27
+ * - `StateNode.always: TransitionDefinition[] | undefined` — eventless
28
+ * ("always"/guarded-every-microstep) transitions, kept SEPARATE from `.on`
29
+ * by xstate itself; each has `eventType: ''`. Rendered as edges labeled
30
+ * "always" rather than an event name.
31
+ * - `TransitionDefinition.target: readonly StateNode[] | undefined` —
32
+ * resolved target state node(s) (already-resolved, not a string to
33
+ * re-parse); `undefined` for an internal/actionless transition (no target
34
+ * state change) — those are skipped as edges (nothing to point an arrow at).
35
+ * - `TransitionDefinition.guard` — a string (named guard), a `{type, params}`
36
+ * object (parameterized named guard), or a plain predicate function
37
+ * (`(args, params) => boolean`, the common case for hand-authored
38
+ * machines like `characterAnimationMachine`, which uses inline
39
+ * `({ context }) => context.speed > 0.1` arrows). `guardLabel` below
40
+ * normalizes all three to a short display string.
41
+ * - `StateNode.meta?: any` — read here only to detect `meta.animation`
42
+ * presence; actual parsing/validation is delegated to
43
+ * `collectMachineAnimationMeta`/`clipNamesOf` (E1,
44
+ * `@engine/animation/xstate-animation-meta`) — this module does not
45
+ * duplicate that validation.
46
+ * - `StateNode.type: 'atomic' | 'compound' | 'parallel' | 'final' |
47
+ * 'history'` — surfaced per node so the panel can show it (a compound/
48
+ * parallel state has children; the graph still renders it as its own node
49
+ * PLUS its children as separate nodes with a parent edge implied by
50
+ * nesting depth, not a literal drawn edge).
51
+ *
52
+ * No `getStateNodes()` call is needed here: that xstate helper resolves the
53
+ * set of state nodes ACTIVE for one `StateValue` (a snapshot-shaped query).
54
+ * This module wants the machine's full STATIC configuration (every declared
55
+ * state, reachable or not, active or not) — a plain recursive walk of
56
+ * `.states` from `machine.root` is the correct and sufficient tool for that.
57
+ */
58
+
59
+ import type {
60
+ clipNamesOf as ClipNamesOfFn,
61
+ collectMachineAnimationMeta as CollectMachineAnimationMetaFn,
62
+ MachineAnimationMetaEntry,
63
+ } from '@engine/animation/xstate-animation-meta';
64
+ import type { AnyStateMachine, AnyStateNode, StateValue } from 'xstate';
65
+ import { getStateNodes } from 'xstate';
66
+
67
+ export interface XStateGraphNode {
68
+ /** Full dotted state id, e.g. `"character-animation.locomotion"`. */
69
+ id: string;
70
+ /** The relative key, e.g. `"locomotion"`. */
71
+ key: string;
72
+ /** Dotted id of the immediate parent state node, or `null` for the root. */
73
+ parentId: string | null;
74
+ /** Depth from the root (root = 0), used by the layered layout. */
75
+ depth: number;
76
+ type: 'atomic' | 'compound' | 'parallel' | 'final' | 'history';
77
+ /** True for the machine's single configured initial leaf-path state at each level. */
78
+ isInitial: boolean;
79
+ /** Raw `meta` object as authored (e.g. `{ animation: {...} }`), if any. */
80
+ meta: Record<string, unknown> | undefined;
81
+ /** Parsed animation meta for this state, if `meta.animation` validated successfully. */
82
+ animation: MachineAnimationMetaEntry | undefined;
83
+ /** `clipNamesOf(animation.meta)` when `animation` is present. */
84
+ clipNames: string[];
85
+ }
86
+
87
+ export interface XStateGraphEdge {
88
+ /** Stable synthetic id for React `key` props: `${source}--${eventLabel}--${target}--${index}`. */
89
+ id: string;
90
+ source: string;
91
+ target: string;
92
+ /** The triggering event name, or `'always'` for eventless transitions. */
93
+ eventLabel: string;
94
+ /** `true` for an `always` (eventless) transition. */
95
+ isEventless: boolean;
96
+ /** Normalized guard display label, or `undefined` when the transition is unguarded. */
97
+ guardLabel: string | undefined;
98
+ }
99
+
100
+ export interface XStateGraph {
101
+ machineId: string;
102
+ nodes: XStateGraphNode[];
103
+ edges: XStateGraphEdge[];
104
+ }
105
+
106
+ /** True for a plain, non-empty object (guards against `null`/arrays passing `typeof === 'object'`). */
107
+ function isPlainObject(v: unknown): v is Record<string, unknown> {
108
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
109
+ }
110
+
111
+ /**
112
+ * Normalize an xstate v5 `TransitionDefinition['guard']` to a short display
113
+ * label. Handles the three shapes xstate allows (confirmed above):
114
+ * - a string → the guard name verbatim (`"someNamedGuard"`).
115
+ * - a `{ type, params? }` object → `.type` (a parameterized named guard).
116
+ * - a function → its `.name` when xstate/JS gave it a real one (property-
117
+ * shorthand functions like `guard: someNamedFn` keep their declared name),
118
+ * otherwise (the common inline-arrow case, e.g.
119
+ * `({ context }) => context.speed > 0.1`) fall back to a truncated
120
+ * `.toString()` of the function body so the condition is still legible
121
+ * rather than showing a useless generic "guard" (xstate's own destructured-
122
+ * param naming quirk: an arrow assigned to an object property named
123
+ * `guard` is named `"guard"` by the JS engine itself, which conveys
124
+ * nothing — confirmed by probing the real `characterAnimationMachine`).
125
+ */
126
+ export function guardLabel(guard: unknown): string | undefined {
127
+ if (guard == null) return undefined;
128
+ if (typeof guard === 'string') return guard;
129
+ if (typeof guard === 'function') {
130
+ const name = guard.name;
131
+ if (name && name !== 'guard' && name !== 'anonymous') return name;
132
+ const src = guard.toString().replace(/\s+/g, ' ').trim();
133
+ return src.length > 60 ? `${src.slice(0, 57)}...` : src;
134
+ }
135
+ if (isPlainObject(guard) && typeof guard['type'] === 'string') {
136
+ return guard['type'];
137
+ }
138
+ return '(guard)';
139
+ }
140
+
141
+ /** Every dotted-id descendant state node of `node`, depth-first, including `node` itself. */
142
+ function* walkStateNodes(
143
+ node: AnyStateNode,
144
+ parentId: string | null,
145
+ depth: number,
146
+ ): Generator<{
147
+ node: AnyStateNode;
148
+ parentId: string | null;
149
+ depth: number;
150
+ }> {
151
+ yield { node, parentId, depth };
152
+ for (const child of Object.values(node.states)) {
153
+ yield* walkStateNodes(child, node.id, depth + 1);
154
+ }
155
+ }
156
+
157
+ /** True iff `node` is the configured initial child of its parent (root-relative; always true for the root itself). */
158
+ function isInitialChild(node: AnyStateNode): boolean {
159
+ const parent = node.parent;
160
+ if (!parent) return true;
161
+ if (parent.type !== 'compound') return false; // parallel/atomic parents have no single "initial" child
162
+ return parent.initial?.target?.some((t) => t.id === node.id) ?? false;
163
+ }
164
+
165
+ /**
166
+ * One state node's outgoing edges: its own event-triggered (`on`) transitions
167
+ * plus its eventless (`always`) transitions — kept as a separate helper from
168
+ * {@link buildXStateGraph} purely to keep that function's cognitive
169
+ * complexity low; the logic is unchanged from a single inline loop.
170
+ */
171
+ function edgesFromNode(node: AnyStateNode, nextEdgeId: () => number): XStateGraphEdge[] {
172
+ const edges: XStateGraphEdge[] = [];
173
+ for (const [eventType, defs] of Object.entries(node.on)) {
174
+ for (const def of defs) {
175
+ for (const target of def.target ?? []) {
176
+ edges.push({
177
+ id: `${node.id}--${eventType}--${target.id}--${nextEdgeId()}`,
178
+ source: node.id,
179
+ target: target.id,
180
+ eventLabel: eventType,
181
+ isEventless: false,
182
+ guardLabel: guardLabel(def.guard),
183
+ });
184
+ }
185
+ }
186
+ }
187
+ for (const def of node.always ?? []) {
188
+ for (const target of def.target ?? []) {
189
+ edges.push({
190
+ id: `${node.id}--always--${target.id}--${nextEdgeId()}`,
191
+ source: node.id,
192
+ target: target.id,
193
+ eventLabel: 'always',
194
+ isEventless: true,
195
+ guardLabel: guardLabel(def.guard),
196
+ });
197
+ }
198
+ }
199
+ return edges;
200
+ }
201
+
202
+ /**
203
+ * Extract a renderable {@link XStateGraph} from a real XState machine.
204
+ * Accepts `AnyStateMachine` (what `setup(...).createMachine(...)` and
205
+ * `createMachine(...)` both return) — works for the shipped
206
+ * `characterAnimationMachine` and any other hand-authored machine.
207
+ *
208
+ * `collectMachineAnimationMeta`/`clipNamesOf` are passed in rather than
209
+ * imported directly so this module (and its tests) never need
210
+ * `@vgai/engine`'s Zod validation to be duplicated or re-mocked — see the
211
+ * call sites in `components/xstate-documents.tsx`, which pass the real
212
+ * functions.
213
+ */
214
+ export function buildXStateGraph(
215
+ machine: AnyStateMachine,
216
+ collectMachineAnimationMeta: typeof CollectMachineAnimationMetaFn,
217
+ clipNamesOf: typeof ClipNamesOfFn,
218
+ ): XStateGraph {
219
+ const root = machine.root;
220
+ const animationByStateId = new Map(
221
+ collectMachineAnimationMeta(root).map((entry) => [entry.stateId, entry]),
222
+ );
223
+
224
+ const nodes: XStateGraphNode[] = [];
225
+ const edges: XStateGraphEdge[] = [];
226
+ let edgeSeq = 0;
227
+ const nextEdgeId = () => edgeSeq++;
228
+
229
+ for (const { node, parentId, depth } of walkStateNodes(root, null, 0)) {
230
+ const animation = animationByStateId.get(node.id);
231
+ nodes.push({
232
+ id: node.id,
233
+ key: node.key,
234
+ parentId,
235
+ depth,
236
+ type: node.type,
237
+ isInitial: isInitialChild(node),
238
+ meta: isPlainObject(node.meta) ? node.meta : undefined,
239
+ animation,
240
+ clipNames: animation ? clipNamesOf(animation.meta) : [],
241
+ });
242
+ edges.push(...edgesFromNode(node, nextEdgeId));
243
+ }
244
+
245
+ return { machineId: root.id, nodes, edges };
246
+ }
247
+
248
+ /**
249
+ * The full state ids XState reports as ACTIVE for a given snapshot value —
250
+ * every ancestor plus the leaf (e.g. a snapshot in `"locomotion"` reports
251
+ * both `"character-animation"` and `"character-animation.locomotion"`).
252
+ *
253
+ * Uses xstate's own `getStateNodes(rootNode, stateValue)` (`xstate` package
254
+ * root export, confirmed present in the installed v5.32.4 and exercised
255
+ * directly against a real machine) rather than `snapshot.getMeta()` —
256
+ * `getMeta()` only returns states that declare a `meta` object at all
257
+ * (confirmed by probing a real machine: a meta-less compound ancestor is
258
+ * silently absent from `getMeta()`'s keys even while active), which would
259
+ * under-highlight the graph for any machine with meta-less parent/compound
260
+ * states. `getStateNodes` returns the complete active set regardless of
261
+ * whether a node has `meta`.
262
+ */
263
+ export function activeStateIdsOf(machine: AnyStateMachine, stateValue: StateValue): string[] {
264
+ return getStateNodes(machine.root, stateValue).map((n) => n.id);
265
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * E3 — a deterministic, dependency-free layered layout for an
3
+ * {@link XStateGraph}. No graph-layout library exists in this repo (checked:
4
+ * no reactflow/dagre/elkjs/d3 in `packages/editor/package.json` or the root
5
+ * manifest) and the spec explicitly says a fancy graph engine is not
6
+ * required ("a simple deterministic layout is fine — grid/columns by depth").
7
+ *
8
+ * Layout rule: one COLUMN per state-tree depth (root=0, its children=1,
9
+ * grandchildren=2, …) — this both (a) reads naturally for the shallow
10
+ * machines XState animation binding targets (§5.6's examples are 1-2 levels
11
+ * deep) and (b) guarantees a parent is always positioned before/left-of its
12
+ * children, which keeps nesting legible even before any edges are drawn.
13
+ * Within a column, nodes are stacked top-to-bottom in the machine's own
14
+ * declaration order (`StateNode.order` is xstate's own deterministic
15
+ * document-order counter) — so the layout is 100% a pure function of the
16
+ * machine, not randomized/force-simulated, and is stable across renders
17
+ * (required for a sane React key/position diff and for tests to assert
18
+ * exact pixel positions).
19
+ */
20
+
21
+ import type { XStateGraph, XStateGraphNode } from './xstate-graph';
22
+
23
+ export interface LayoutNode {
24
+ node: XStateGraphNode;
25
+ x: number;
26
+ y: number;
27
+ width: number;
28
+ height: number;
29
+ }
30
+
31
+ export interface XStateLayout {
32
+ nodes: LayoutNode[];
33
+ positionById: Map<string, LayoutNode>;
34
+ width: number;
35
+ height: number;
36
+ }
37
+
38
+ const COLUMN_WIDTH = 220;
39
+ const COLUMN_GAP = 100;
40
+ const ROW_HEIGHT = 64;
41
+ const ROW_GAP = 24;
42
+ const NODE_WIDTH = 180;
43
+ const MARGIN = 24;
44
+
45
+ /** Lay out a graph's nodes into depth-based columns, declaration order within each column. */
46
+ export function layoutXStateGraph(graph: XStateGraph): XStateLayout {
47
+ const byDepth = new Map<number, XStateGraphNode[]>();
48
+ for (const node of graph.nodes) {
49
+ const bucket = byDepth.get(node.depth);
50
+ if (bucket) bucket.push(node);
51
+ else byDepth.set(node.depth, [node]);
52
+ }
53
+
54
+ const nodes: LayoutNode[] = [];
55
+ const positionById = new Map<string, LayoutNode>();
56
+ let maxDepth = 0;
57
+ let maxRows = 0;
58
+
59
+ for (const [depth, column] of byDepth) {
60
+ maxDepth = Math.max(maxDepth, depth);
61
+ maxRows = Math.max(maxRows, column.length);
62
+ const x = MARGIN + depth * (COLUMN_WIDTH + COLUMN_GAP);
63
+ column.forEach((node, row) => {
64
+ const y = MARGIN + row * (ROW_HEIGHT + ROW_GAP);
65
+ const laidOut: LayoutNode = { node, x, y, width: NODE_WIDTH, height: ROW_HEIGHT };
66
+ nodes.push(laidOut);
67
+ positionById.set(node.id, laidOut);
68
+ });
69
+ }
70
+
71
+ const width = MARGIN * 2 + (maxDepth + 1) * COLUMN_WIDTH + maxDepth * COLUMN_GAP;
72
+ const height =
73
+ MARGIN * 2 + Math.max(1, maxRows) * ROW_HEIGHT + Math.max(0, maxRows - 1) * ROW_GAP;
74
+
75
+ return { nodes, positionById, width, height };
76
+ }
package/src/z-index.ts ADDED
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Canonical z-index scale (editor-style-polish U0,
3
+ * `roadmaps/editor-style-polish/EDITOR-STYLE-AUDIT.md` §3 "Z-index scale").
4
+ * Replaces the ungoverned 1..10000 range (4 orders of magnitude, 2 sites
5
+ * typed as strings) with named tiers. Re-exported from `theme.ts`; kept as
6
+ * its own module too so a call site that only needs stacking order doesn't
7
+ * have to import the whole token set.
8
+ *
9
+ * `designTimeLayers` is deliberately NOT given a single number here —
10
+ * `authoring/design-time-layers.ts`'s `BASE_Z_INDEX` is already a real,
11
+ * scoped constant for that tier and is left as-is per the audit.
12
+ */
13
+ export const zIndex = {
14
+ /** Default stacking (no explicit z-index needed). */
15
+ base: 0,
16
+ /** World-selection / text-edit / align-toolbar tier (absorbs 20/50/60/70). */
17
+ overlayLow: 50,
18
+ /** Dropdown / popover tier (absorbs the flat `100` used almost everywhere). */
19
+ dropdown: 100,
20
+ /** Sticky chrome tier (absorbs 200/999/1000, and the stray string `'999'`). */
21
+ sticky: 1000,
22
+ /** Toast tier. */
23
+ toast: 9999,
24
+ /** Modal tier — already consistent across all dialog components. */
25
+ modal: 10000,
26
+ } as const;