@downdraft/engine 0.1.0 → 0.1.2-alpha.5

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 (1022) hide show
  1. package/README.md +33 -0
  2. package/app/README.md +11 -0
  3. package/app/src/renderer/bootstrap.ts +295 -19
  4. package/app/src/renderer/game-module.ts +60 -12
  5. package/app/src/renderer/hooks.ts +9 -1
  6. package/app/src/renderer/hot-reload.ts +9 -9
  7. package/app/src/renderer/mcp-harness.ts +2 -2
  8. package/app/src/renderer/standard-automation-tools.ts +104 -3
  9. package/app/src/shared/feature-log.ts +2 -1
  10. package/app/src/shared/mcp-discovery.ts +8 -3
  11. package/app/src/shared/mcp-proxy.ts +2 -2
  12. package/asset-bake/README.md +22 -0
  13. package/core/README.md +25 -0
  14. package/core/src/animation/skeleton-animator.ts +23 -5
  15. package/core/src/assets/manager.ts +4 -4
  16. package/core/src/ecs/events.ts +1 -1
  17. package/core/src/ecs/schedule.ts +1 -1
  18. package/core/src/ecs/world.ts +1 -1
  19. package/core/src/index.ts +3 -4
  20. package/core/src/library/host.ts +27 -13
  21. package/core/src/library/library.ts +13 -5
  22. package/core/src/module/cross-thread.ts +6 -0
  23. package/core/src/module/diagnostics.ts +10 -6
  24. package/core/src/module/host.ts +65 -18
  25. package/core/src/module/index.ts +1 -0
  26. package/core/src/module/module.ts +11 -5
  27. package/core/src/module/renderer-module.ts +15 -0
  28. package/core/src/physics/safety.ts +1 -1
  29. package/core/src/platform/bun-preload.ts +7 -2
  30. package/core/src/platform/glob-polyfill.ts +17 -8
  31. package/core/src/platform/pkg-root.ts +27 -0
  32. package/core/src/platform/runtime.ts +38 -0
  33. package/core/src/plugin/discovery.ts +1 -1
  34. package/core/src/plugin/extension-loaders.ts +6 -4
  35. package/core/src/plugin/host.ts +13 -13
  36. package/core/src/plugin/loader-asset.ts +5 -5
  37. package/core/src/plugin/loader-quickjs.ts +1 -1
  38. package/core/src/plugin/loader-wasm.ts +3 -3
  39. package/core/src/plugin/loader-worker.ts +1 -1
  40. package/core/src/plugin/manifest.ts +8 -3
  41. package/core/src/plugin/workshop.ts +3 -3
  42. package/core/src/profiling/index.ts +1 -1
  43. package/core/src/profiling/profiling-sab.ts +19 -0
  44. package/core/src/profiling/warnings.ts +1 -1
  45. package/core/src/profiling/worker-prelude.ts +1 -1
  46. package/core/src/render/bindless/frame-bindings.ts +1 -1
  47. package/core/src/render/bindless/material-manager.ts +2 -2
  48. package/core/src/render/bindless/texture-registry.ts +2 -2
  49. package/core/src/render/device.ts +5 -5
  50. package/core/src/render/frame-graph.ts +2 -2
  51. package/core/src/render/game-renderer.ts +42 -18
  52. package/core/src/render/hot-reload.ts +3 -3
  53. package/core/src/render/renderer-module-host.ts +32 -12
  54. package/core/src/render/shader-validator.ts +7 -7
  55. package/core/src/render/surface.ts +1 -1
  56. package/core/src/sab/errors.ts +1 -1
  57. package/core/src/sab/sab-polyfill.ts +1 -1
  58. package/core/src/save/migration-registry.ts +4 -4
  59. package/core/src/save/schema.ts +1 -1
  60. package/core/src/scene/prefab.ts +1 -1
  61. package/core/src/scene/scene-manager.ts +2 -2
  62. package/core/src/scene/scene.ts +4 -4
  63. package/core/src/scene/streaming.ts +2 -2
  64. package/core/src/scripting/hot-reload.ts +2 -2
  65. package/core/src/sim/hot-reload-pipeline.ts +30 -6
  66. package/core/src/sim/sim-state-helper.ts +1 -1
  67. package/core/src/sim/transient-state-registry.ts +1 -1
  68. package/core/src/sim/worker-loop.ts +2 -2
  69. package/core/src/telemetry/gpu-profiler.ts +3 -3
  70. package/core/src/util/index.ts +1 -1
  71. package/core/src/util/logger.ts +36 -5
  72. package/core/src/version.ts +13 -0
  73. package/core/src/worker/base-worker-host.ts +87 -25
  74. package/core/src/worker/buffer-sync.ts +1 -1
  75. package/core/src/worker/crash-recovery.ts +2 -2
  76. package/core/src/worker/instrumented-worker-host.ts +3 -3
  77. package/core/src/worker/rpc.ts +62 -11
  78. package/core/src/worker/sim-worker-base.ts +3 -8
  79. package/core/src/worker/task-pool.ts +2 -2
  80. package/dist/.dd-manifest.json +4119 -0
  81. package/dist/app/src/index.js +9 -0
  82. package/dist/app/src/renderer/bootstrap.js +446 -0
  83. package/dist/app/src/renderer/downdraft-base.css +93 -0
  84. package/dist/app/src/renderer/feature-log.js +180 -0
  85. package/dist/app/src/renderer/game-module.js +562 -0
  86. package/dist/app/src/renderer/hooks.js +82 -0
  87. package/dist/app/src/renderer/hot-reload.js +158 -0
  88. package/dist/app/src/renderer/import-cache.js +77 -0
  89. package/dist/app/src/renderer/index.js +149 -0
  90. package/dist/app/src/renderer/mcp-harness.js +112 -0
  91. package/dist/app/src/renderer/save-store-factory.js +180 -0
  92. package/dist/app/src/renderer/sim-bridge.js +138 -0
  93. package/dist/app/src/renderer/standard-automation-tools.js +720 -0
  94. package/dist/app/src/shared/feature-log.js +54 -0
  95. package/dist/app/src/shared/gpu-info.js +74 -0
  96. package/dist/app/src/shared/import-cache-store.js +123 -0
  97. package/dist/app/src/shared/index.js +4 -0
  98. package/dist/app/src/shared/mcp-discovery.js +55 -0
  99. package/dist/app/src/shared/mcp-proxy.js +71 -0
  100. package/dist/app/src/shared/types.js +13 -0
  101. package/dist/asset-bake/src/bake-audio.js +103 -0
  102. package/dist/asset-bake/src/bake-gltf.js +141 -0
  103. package/dist/asset-bake/src/bake.js +63 -0
  104. package/dist/asset-bake/src/cache.js +147 -0
  105. package/dist/asset-bake/src/config.js +93 -0
  106. package/dist/asset-bake/src/index.js +25 -0
  107. package/dist/core/src/animation/animation-event.js +24 -0
  108. package/dist/core/src/animation/bone-mask.js +103 -0
  109. package/dist/core/src/animation/clip.js +210 -0
  110. package/dist/core/src/animation/index.js +13 -0
  111. package/dist/core/src/animation/mixamo.js +78 -0
  112. package/dist/core/src/animation/morph-target.js +37 -0
  113. package/dist/core/src/animation/player.js +621 -0
  114. package/dist/core/src/animation/retarget.js +101 -0
  115. package/dist/core/src/animation/skeleton-animator.js +1361 -0
  116. package/dist/core/src/animation/skeleton.js +166 -0
  117. package/dist/core/src/animation/state-machine.js +252 -0
  118. package/dist/core/src/assets/blob-store.js +14 -0
  119. package/dist/core/src/assets/cache.js +168 -0
  120. package/dist/core/src/assets/cubemap-converter.js +129 -0
  121. package/dist/core/src/assets/environment-manager.js +84 -0
  122. package/dist/core/src/assets/import-cache.js +36 -0
  123. package/dist/core/src/assets/import-settings.js +34 -0
  124. package/dist/core/src/assets/importer.js +78 -0
  125. package/dist/core/src/assets/index.js +29 -0
  126. package/dist/core/src/assets/irradiance-generator.js +179 -0
  127. package/dist/core/src/assets/loader-audio.js +70 -0
  128. package/dist/core/src/assets/loader-cubemap.js +141 -0
  129. package/dist/core/src/assets/loader-dds.js +185 -0
  130. package/dist/core/src/assets/loader-hdr.js +430 -0
  131. package/dist/core/src/assets/loader-mesh.js +47 -0
  132. package/dist/core/src/assets/loader-shader.js +61 -0
  133. package/dist/core/src/assets/loader-texture.js +264 -0
  134. package/dist/core/src/assets/lod.js +150 -0
  135. package/dist/core/src/assets/manager.js +401 -0
  136. package/dist/core/src/assets/manifest.js +57 -0
  137. package/dist/core/src/assets/material-bridge.js +160 -0
  138. package/dist/core/src/assets/model-importer.js +32 -0
  139. package/dist/core/src/assets/model-normalizer.js +213 -0
  140. package/dist/core/src/assets/model-to-gpu.js +44 -0
  141. package/dist/core/src/assets/model-to-mesh.js +171 -0
  142. package/dist/core/src/assets/prefilter-generator.js +220 -0
  143. package/dist/core/src/audio/engine.js +153 -0
  144. package/dist/core/src/audio/interface.js +8 -0
  145. package/dist/core/src/audio/listener.js +19 -0
  146. package/dist/core/src/audio/mixer.js +124 -0
  147. package/dist/core/src/audio/registry.js +43 -0
  148. package/dist/core/src/audio/sab.js +74 -0
  149. package/dist/core/src/audio/source.js +60 -0
  150. package/dist/core/src/change-detection/atomics.js +1 -0
  151. package/dist/core/src/change-detection/tracker.js +26 -0
  152. package/dist/core/src/debug-draw/lines.js +27 -0
  153. package/dist/core/src/debug-draw/points.js +9 -0
  154. package/dist/core/src/debug-draw/queue.js +77 -0
  155. package/dist/core/src/debug-draw/text.js +12 -0
  156. package/dist/core/src/ecs/archetype.js +271 -0
  157. package/dist/core/src/ecs/component.js +109 -0
  158. package/dist/core/src/ecs/entity.js +11 -0
  159. package/dist/core/src/ecs/events.js +73 -0
  160. package/dist/core/src/ecs/hierarchy.js +104 -0
  161. package/dist/core/src/ecs/hmr-swap-registry.js +15 -0
  162. package/dist/core/src/ecs/index.js +14 -0
  163. package/dist/core/src/ecs/query.js +110 -0
  164. package/dist/core/src/ecs/resource.js +3 -0
  165. package/dist/core/src/ecs/schedule.js +157 -0
  166. package/dist/core/src/ecs/system-params.js +45 -0
  167. package/dist/core/src/ecs/system.js +18 -0
  168. package/dist/core/src/ecs/world.js +292 -0
  169. package/dist/core/src/index.js +191 -0
  170. package/dist/core/src/input/context.js +69 -0
  171. package/dist/core/src/input/dom-handler.js +288 -0
  172. package/dist/core/src/input/local-player-manager.js +145 -0
  173. package/dist/core/src/input/mapping.js +36 -0
  174. package/dist/core/src/input/multi-sab-bridge.js +224 -0
  175. package/dist/core/src/input/multi-state.js +48 -0
  176. package/dist/core/src/input/sab-bridge.js +66 -0
  177. package/dist/core/src/input/state.js +108 -0
  178. package/dist/core/src/input/ui-router.js +76 -0
  179. package/dist/core/src/library/host.js +291 -0
  180. package/dist/core/src/library/index.js +1 -0
  181. package/dist/core/src/library/library.js +20 -0
  182. package/dist/core/src/material/compiler.js +73 -0
  183. package/dist/core/src/material/graph-bridge.js +119 -0
  184. package/dist/core/src/material/index.js +6 -0
  185. package/dist/core/src/material/library.js +414 -0
  186. package/dist/core/src/material/material.js +120 -0
  187. package/dist/core/src/material/variants.js +37 -0
  188. package/dist/core/src/math/mat4.js +198 -0
  189. package/dist/core/src/math/perlin-noise-2d.js +66 -0
  190. package/dist/core/src/math/perlin-noise-3d.js +76 -0
  191. package/dist/core/src/math/quat.js +29 -0
  192. package/dist/core/src/math/rng.js +25 -0
  193. package/dist/core/src/math/trig.js +42 -0
  194. package/dist/core/src/math/value-noise.js +49 -0
  195. package/dist/core/src/mesh/builder.js +137 -0
  196. package/dist/core/src/mesh/csg.js +250 -0
  197. package/dist/core/src/mesh/greased-line.js +102 -0
  198. package/dist/core/src/mesh/mesh.js +6 -0
  199. package/dist/core/src/mesh/parametric.js +392 -0
  200. package/dist/core/src/mesh/skinning.js +30 -0
  201. package/dist/core/src/mesh/vertex-layout.js +65 -0
  202. package/dist/core/src/module/cross-thread.js +126 -0
  203. package/dist/core/src/module/diagnostics.js +99 -0
  204. package/dist/core/src/module/host.js +449 -0
  205. package/dist/core/src/module/index.js +6 -0
  206. package/dist/core/src/module/module.js +1 -0
  207. package/dist/core/src/module/registry.js +83 -0
  208. package/dist/core/src/module/renderer-module.js +13 -0
  209. package/dist/core/src/module/ts-loader.js +20 -0
  210. package/dist/core/src/particles/compute-pass.js +329 -0
  211. package/dist/core/src/particles/emitter.js +113 -0
  212. package/dist/core/src/particles/index.js +7 -0
  213. package/dist/core/src/particles/particle-data.js +33 -0
  214. package/dist/core/src/particles/render-pass.js +338 -0
  215. package/dist/core/src/particles/simulator.js +224 -0
  216. package/dist/core/src/particles/system.js +157 -0
  217. package/dist/core/src/physics/body.js +25 -0
  218. package/dist/core/src/physics/ccd-heuristic.js +46 -0
  219. package/dist/core/src/physics/character.js +184 -0
  220. package/dist/core/src/physics/collider.js +36 -0
  221. package/dist/core/src/physics/collision-system.js +62 -0
  222. package/dist/core/src/physics/events.js +74 -0
  223. package/dist/core/src/physics/index.js +24 -0
  224. package/dist/core/src/physics/interface.js +14 -0
  225. package/dist/core/src/physics/interpolation-buffer.js +182 -0
  226. package/dist/core/src/physics/lifecycle.js +66 -0
  227. package/dist/core/src/physics/load-shedder.js +155 -0
  228. package/dist/core/src/physics/physics-accumulator.js +94 -0
  229. package/dist/core/src/physics/physics-system.js +142 -0
  230. package/dist/core/src/physics/ragdoll-presets.js +248 -0
  231. package/dist/core/src/physics/ragdoll-system.js +193 -0
  232. package/dist/core/src/physics/ragdoll.js +117 -0
  233. package/dist/core/src/physics/raycast.js +97 -0
  234. package/dist/core/src/physics/realm-manager.js +431 -0
  235. package/dist/core/src/physics/realm-worker-pool.js +181 -0
  236. package/dist/core/src/physics/realm-worker.js +91 -0
  237. package/dist/core/src/physics/realm.js +137 -0
  238. package/dist/core/src/physics/registry.js +43 -0
  239. package/dist/core/src/physics/safety.js +211 -0
  240. package/dist/core/src/physics/snapshot-manager.js +118 -0
  241. package/dist/core/src/physics/worker-protocol.js +1 -0
  242. package/dist/core/src/platform/bun-preload.js +175 -0
  243. package/dist/core/src/platform/css-stub.js +4 -0
  244. package/dist/core/src/platform/glob-polyfill.js +137 -0
  245. package/dist/core/src/platform/hidpi.js +52 -0
  246. package/dist/core/src/platform/pkg-root.js +27 -0
  247. package/dist/core/src/platform/render-surface.js +15 -0
  248. package/dist/core/src/platform/rpc.js +82 -0
  249. package/dist/core/src/platform/runtime.js +93 -0
  250. package/dist/core/src/plugin/context.js +144 -0
  251. package/dist/core/src/plugin/diagnostics.js +20 -0
  252. package/dist/core/src/plugin/discovery.js +124 -0
  253. package/dist/core/src/plugin/extension-loaders.js +111 -0
  254. package/dist/core/src/plugin/host.js +542 -0
  255. package/dist/core/src/plugin/index.js +19 -0
  256. package/dist/core/src/plugin/loader-asset.js +105 -0
  257. package/dist/core/src/plugin/loader-quickjs.js +67 -0
  258. package/dist/core/src/plugin/loader-wasm.js +385 -0
  259. package/dist/core/src/plugin/loader-worker.js +228 -0
  260. package/dist/core/src/plugin/manifest.js +424 -0
  261. package/dist/core/src/plugin/material-registry.js +44 -0
  262. package/dist/core/src/plugin/mcp-tools.js +147 -0
  263. package/dist/core/src/plugin/permissions.js +152 -0
  264. package/dist/core/src/plugin/quickjs-bridge.js +219 -0
  265. package/dist/core/src/plugin/registry.js +92 -0
  266. package/dist/core/src/plugin/sandbox-shim.js +79 -0
  267. package/dist/core/src/plugin/sandbox-worker.js +194 -0
  268. package/dist/core/src/plugin/wasm-abi.js +62 -0
  269. package/dist/core/src/plugin/wasm-worker.js +234 -0
  270. package/dist/core/src/plugin/workshop.js +131 -0
  271. package/dist/core/src/profiling/event-loop.js +164 -0
  272. package/dist/core/src/profiling/index.js +23 -0
  273. package/dist/core/src/profiling/iops/idb-patch.js +211 -0
  274. package/dist/core/src/profiling/iops/opfs-patch.js +206 -0
  275. package/dist/core/src/profiling/profiling-sab.js +632 -0
  276. package/dist/core/src/profiling/task-latency.js +118 -0
  277. package/dist/core/src/profiling/thread-metrics.js +103 -0
  278. package/dist/core/src/profiling/trace-event-writer.js +165 -0
  279. package/dist/core/src/profiling/warnings.js +304 -0
  280. package/dist/core/src/profiling/worker-prelude.js +281 -0
  281. package/dist/core/src/render/bind-group.js +33 -0
  282. package/dist/core/src/render/bindless/bindless-struct.js +39 -0
  283. package/dist/core/src/render/bindless/bindless.wgsl.js +163 -0
  284. package/dist/core/src/render/bindless/frame-bindings.js +142 -0
  285. package/dist/core/src/render/bindless/index.js +6 -0
  286. package/dist/core/src/render/bindless/material-manager.js +182 -0
  287. package/dist/core/src/render/bindless/texture-registry.js +498 -0
  288. package/dist/core/src/render/buffer.js +74 -0
  289. package/dist/core/src/render/camera-2d.js +151 -0
  290. package/dist/core/src/render/camera-controller.js +370 -0
  291. package/dist/core/src/render/camera.js +332 -0
  292. package/dist/core/src/render/canvas-resize-watcher.js +36 -0
  293. package/dist/core/src/render/compute-kernel.js +130 -0
  294. package/dist/core/src/render/constants.js +2 -0
  295. package/dist/core/src/render/device.js +91 -0
  296. package/dist/core/src/render/frame-graph.js +594 -0
  297. package/dist/core/src/render/frustum.js +152 -0
  298. package/dist/core/src/render/fullscreen-vs.js +24 -0
  299. package/dist/core/src/render/g-buffer.js +156 -0
  300. package/dist/core/src/render/game-renderer.js +1165 -0
  301. package/dist/core/src/render/gpu-driven/cull-pass.js +352 -0
  302. package/dist/core/src/render/gpu-driven/hzb.js +183 -0
  303. package/dist/core/src/render/gpu-driven/index.js +6 -0
  304. package/dist/core/src/render/gpu-driven/indirect-draw-pass.js +300 -0
  305. package/dist/core/src/render/gpu-driven/instance-buffer.js +150 -0
  306. package/dist/core/src/render/gpu-driven/mesh-table.js +130 -0
  307. package/dist/core/src/render/gpu-driven/passes/hzb-build-pass.js +39 -0
  308. package/dist/core/src/render/gpu-utils.js +72 -0
  309. package/dist/core/src/render/hdr.js +69 -0
  310. package/dist/core/src/render/hot-reload.js +236 -0
  311. package/dist/core/src/render/ibl-bind-group.js +232 -0
  312. package/dist/core/src/render/ibl.js +148 -0
  313. package/dist/core/src/render/index.js +86 -0
  314. package/dist/core/src/render/input-manager.js +224 -0
  315. package/dist/core/src/render/lighting/area-light.js +142 -0
  316. package/dist/core/src/render/lighting/cluster-grid.js +255 -0
  317. package/dist/core/src/render/lighting/cluster-types.js +87 -0
  318. package/dist/core/src/render/lighting/ies-parser.js +111 -0
  319. package/dist/core/src/render/lighting.js +300 -0
  320. package/dist/core/src/render/material-types/depth.wgsl +44 -0
  321. package/dist/core/src/render/material-types/line.wgsl +50 -0
  322. package/dist/core/src/render/material-types/matcap.wgsl +51 -0
  323. package/dist/core/src/render/material-types/normal.wgsl +41 -0
  324. package/dist/core/src/render/material-types/physical.wgsl +152 -0
  325. package/dist/core/src/render/material-types/sprite.wgsl +46 -0
  326. package/dist/core/src/render/material-types/sss.wgsl +79 -0
  327. package/dist/core/src/render/material-types/toon.wgsl +79 -0
  328. package/dist/core/src/render/passes/README.md +121 -0
  329. package/dist/core/src/render/passes/atmosphere.js +107 -0
  330. package/dist/core/src/render/passes/cluster-lighting-pass.js +441 -0
  331. package/dist/core/src/render/passes/csm.js +338 -0
  332. package/dist/core/src/render/passes/cubemap-capture.js +93 -0
  333. package/dist/core/src/render/passes/debug-viz.js +248 -0
  334. package/dist/core/src/render/passes/debug.js +500 -0
  335. package/dist/core/src/render/passes/decal-mesh.js +86 -0
  336. package/dist/core/src/render/passes/decal-pass.js +344 -0
  337. package/dist/core/src/render/passes/deferred-lighting.js +406 -0
  338. package/dist/core/src/render/passes/depth-prepass.js +148 -0
  339. package/dist/core/src/render/passes/dome-360.js +68 -0
  340. package/dist/core/src/render/passes/fluid-render.js +116 -0
  341. package/dist/core/src/render/passes/gi-types.js +78 -0
  342. package/dist/core/src/render/passes/graph-compute.js +251 -0
  343. package/dist/core/src/render/passes/greased-line-pass.js +218 -0
  344. package/dist/core/src/render/passes/morph-target.js +35 -0
  345. package/dist/core/src/render/passes/opaque.js +966 -0
  346. package/dist/core/src/render/passes/point-light-shadow.js +221 -0
  347. package/dist/core/src/render/passes/procedural-texture.js +142 -0
  348. package/dist/core/src/render/passes/reflection-probe.js +100 -0
  349. package/dist/core/src/render/passes/rsm-pass.js +228 -0
  350. package/dist/core/src/render/passes/sdf-text.js +114 -0
  351. package/dist/core/src/render/passes/shadow-map.js +121 -0
  352. package/dist/core/src/render/passes/shadow.js +191 -0
  353. package/dist/core/src/render/passes/skinning-vs.js +102 -0
  354. package/dist/core/src/render/passes/skinning.js +282 -0
  355. package/dist/core/src/render/passes/sky-dome.js +380 -0
  356. package/dist/core/src/render/passes/skybox.js +146 -0
  357. package/dist/core/src/render/passes/spot-light-shadow.js +223 -0
  358. package/dist/core/src/render/passes/terrain.js +303 -0
  359. package/dist/core/src/render/passes/transparent.js +323 -0
  360. package/dist/core/src/render/passes/underwater-fog.js +173 -0
  361. package/dist/core/src/render/passes/video-texture.js +58 -0
  362. package/dist/core/src/render/passes/volumetric-pass.js +278 -0
  363. package/dist/core/src/render/passes/volumetric-types.js +96 -0
  364. package/dist/core/src/render/passes/water.js +697 -0
  365. package/dist/core/src/render/pbr.js +257 -0
  366. package/dist/core/src/render/pipeline.js +49 -0
  367. package/dist/core/src/render/render-pass.js +13 -0
  368. package/dist/core/src/render/renderer-input-bus.js +176 -0
  369. package/dist/core/src/render/renderer-module-host.js +539 -0
  370. package/dist/core/src/render/resource-tracker.js +59 -0
  371. package/dist/core/src/render/sab-canvas-overlay.js +83 -0
  372. package/dist/core/src/render/shader-validator.js +172 -0
  373. package/dist/core/src/render/shaders/debug/debug-line.wgsl +27 -0
  374. package/dist/core/src/render/shaders/debug/debug-point.wgsl +30 -0
  375. package/dist/core/src/render/shaders/debug/debug-text.wgsl +42 -0
  376. package/dist/core/src/render/shaders/debug-viz/aabb.wgsl +20 -0
  377. package/dist/core/src/render/shaders/debug-viz/depth.wgsl +29 -0
  378. package/dist/core/src/render/shaders/debug-viz/lod.wgsl +38 -0
  379. package/dist/core/src/render/shaders/debug-viz/normals.wgsl +30 -0
  380. package/dist/core/src/render/shaders/debug-viz/overdraw.wgsl +21 -0
  381. package/dist/core/src/render/shaders/debug-viz/tangents.wgsl +29 -0
  382. package/dist/core/src/render/shaders/debug-viz/wireframe.wgsl +33 -0
  383. package/dist/core/src/render/shaders/shadow-chunks.js +133 -0
  384. package/dist/core/src/render/skybox.js +123 -0
  385. package/dist/core/src/render/splitscreen.js +60 -0
  386. package/dist/core/src/render/surface.js +63 -0
  387. package/dist/core/src/render/tonemap.js +171 -0
  388. package/dist/core/src/render/tracked-render-pass.js +115 -0
  389. package/dist/core/src/render/viewport.js +81 -0
  390. package/dist/core/src/render/wgsl-hmr.js +66 -0
  391. package/dist/core/src/sab/core-input-channel.js +22 -0
  392. package/dist/core/src/sab/define.js +127 -0
  393. package/dist/core/src/sab/errors.js +60 -0
  394. package/dist/core/src/sab/game-input.js +299 -0
  395. package/dist/core/src/sab/gamepad-devices.js +205 -0
  396. package/dist/core/src/sab/grid-buffer.js +91 -0
  397. package/dist/core/src/sab/input.js +38 -0
  398. package/dist/core/src/sab/layout.js +160 -0
  399. package/dist/core/src/sab/multi-input-channel.js +39 -0
  400. package/dist/core/src/sab/record-buffer.js +130 -0
  401. package/dist/core/src/sab/sab-polyfill.js +47 -0
  402. package/dist/core/src/sab/sim-channel.js +397 -0
  403. package/dist/core/src/sab/slot-buffer.js +140 -0
  404. package/dist/core/src/sab/types.js +1 -0
  405. package/dist/core/src/safety/bounds.js +71 -0
  406. package/dist/core/src/safety/json.js +70 -0
  407. package/dist/core/src/safety/path.js +151 -0
  408. package/dist/core/src/save/binary-format.js +95 -0
  409. package/dist/core/src/save/game-save-system.js +101 -0
  410. package/dist/core/src/save/grid-save-system.js +102 -0
  411. package/dist/core/src/save/migrate.js +35 -0
  412. package/dist/core/src/save/migration-registry.js +66 -0
  413. package/dist/core/src/save/persist-types.js +4 -0
  414. package/dist/core/src/save/schema.js +36 -0
  415. package/dist/core/src/save/serializer.js +139 -0
  416. package/dist/core/src/scene/builder.js +31 -0
  417. package/dist/core/src/scene/camera.js +118 -0
  418. package/dist/core/src/scene/checkpoint.js +84 -0
  419. package/dist/core/src/scene/game-loop.js +155 -0
  420. package/dist/core/src/scene/index.js +14 -0
  421. package/dist/core/src/scene/layer.js +7 -0
  422. package/dist/core/src/scene/prefab.js +97 -0
  423. package/dist/core/src/scene/scene-manager.js +141 -0
  424. package/dist/core/src/scene/scene.js +147 -0
  425. package/dist/core/src/scene/sky.js +179 -0
  426. package/dist/core/src/scene/spatial-grid.js +140 -0
  427. package/dist/core/src/scene/streaming.js +247 -0
  428. package/dist/core/src/scene/vegetation.js +107 -0
  429. package/dist/core/src/scene/world.js +66 -0
  430. package/dist/core/src/scripting/binding.js +85 -0
  431. package/dist/core/src/scripting/hot-reload.js +123 -0
  432. package/dist/core/src/scripting/script.js +68 -0
  433. package/dist/core/src/sim/hot-reload-pipeline.js +65 -0
  434. package/dist/core/src/sim/sim-state-helper.js +40 -0
  435. package/dist/core/src/sim/transient-state-registry.js +63 -0
  436. package/dist/core/src/sim/types.js +4 -0
  437. package/dist/core/src/sim/worker-loop.js +168 -0
  438. package/dist/core/src/stores/game-store.js +81 -0
  439. package/dist/core/src/stores/hot-reload-store.js +19 -0
  440. package/dist/core/src/telemetry/collector.js +303 -0
  441. package/dist/core/src/telemetry/gc-controller.js +365 -0
  442. package/dist/core/src/telemetry/gc-profiler.js +82 -0
  443. package/dist/core/src/telemetry/gc-tracker.js +63 -0
  444. package/dist/core/src/telemetry/gpu-profiler.js +554 -0
  445. package/dist/core/src/telemetry/gpu-resource-tracker.js +234 -0
  446. package/dist/core/src/telemetry/gpu-timer-pool.js +223 -0
  447. package/dist/core/src/telemetry/gpu-timer.js +117 -0
  448. package/dist/core/src/telemetry/gpu-timestamp-gate.js +22 -0
  449. package/dist/core/src/telemetry/reporter.js +56 -0
  450. package/dist/core/src/types/engine-types.js +21 -0
  451. package/dist/core/src/ui-font-scale.js +111 -0
  452. package/dist/core/src/util/broad-phase-grid.js +77 -0
  453. package/dist/core/src/util/feature-log.js +176 -0
  454. package/dist/core/src/util/index.js +4 -0
  455. package/dist/core/src/util/logger.js +596 -0
  456. package/dist/core/src/version.js +11 -0
  457. package/dist/core/src/webgpu-destroy-augmentation.d.ts +25 -0
  458. package/dist/core/src/worker/base-worker-host.js +212 -0
  459. package/dist/core/src/worker/buffer-sync.js +454 -0
  460. package/dist/core/src/worker/crash-recovery.js +153 -0
  461. package/dist/core/src/worker/entity-sim-worker-host.js +128 -0
  462. package/dist/core/src/worker/instrumented-worker-host.js +139 -0
  463. package/dist/core/src/worker/rpc.js +244 -0
  464. package/dist/core/src/worker/sim-worker-base.js +558 -0
  465. package/dist/core/src/worker/sim-worker-host.js +271 -0
  466. package/dist/core/src/worker/task-pool.js +205 -0
  467. package/dist/core/src/worker/task-worker.js +77 -0
  468. package/dist/libraries/asset-browser/src/index.js +10 -0
  469. package/dist/libraries/asset-browser/src/software-thumbnails.js +940 -0
  470. package/dist/libraries/audio-kira/src/backend.js +405 -0
  471. package/dist/libraries/audio-kira/src/index.js +4 -0
  472. package/dist/libraries/audio-kira/src/library.js +54 -0
  473. package/dist/libraries/blitz-ui/src/index.js +13 -0
  474. package/dist/libraries/blitz-ui/src/native-module.js +162 -0
  475. package/dist/libraries/blitz-ui/src/native-osr-ffi.js +409 -0
  476. package/dist/libraries/blitz-ui/src/router.js +82 -0
  477. package/dist/libraries/blitz-ui/src/shaders/ui-blit.wgsl.js +32 -0
  478. package/dist/libraries/blitz-ui/src/ui-blit-pass.js +108 -0
  479. package/dist/libraries/character/src/character-animator.js +323 -0
  480. package/dist/libraries/character/src/customization.js +464 -0
  481. package/dist/libraries/character/src/index.js +19 -0
  482. package/dist/libraries/character/src/inspectable.js +77 -0
  483. package/dist/libraries/character/src/loader.js +336 -0
  484. package/dist/libraries/character/src/locomotion.js +84 -0
  485. package/dist/libraries/character/src/preview.js +280 -0
  486. package/dist/libraries/devtools/src/backend.js +449 -0
  487. package/dist/libraries/devtools/src/cdp-bridge.js +293 -0
  488. package/dist/libraries/devtools/src/collectors.js +318 -0
  489. package/dist/libraries/devtools/src/index.js +31 -0
  490. package/dist/libraries/devtools/src/native-providers.js +749 -0
  491. package/dist/libraries/devtools/src/snapshot.js +35 -0
  492. package/dist/libraries/devtools/src/verify.js +139 -0
  493. package/dist/libraries/devtools/src/web/browser.js +94 -0
  494. package/dist/libraries/devtools/src/web/host.js +183 -0
  495. package/dist/libraries/devtools/src/web/mirror.js +26 -0
  496. package/dist/libraries/devtools/src/web/server.js +187 -0
  497. package/dist/libraries/entities/src/index.js +3 -0
  498. package/dist/libraries/entities/src/library.js +46 -0
  499. package/dist/libraries/entities/src/model-renderer.js +1307 -0
  500. package/dist/libraries/entities/src/shaders/model.wgsl +375 -0
  501. package/dist/libraries/gamepad/src/feed-input.js +54 -0
  502. package/dist/libraries/gamepad/src/filters.js +44 -0
  503. package/dist/libraries/gamepad/src/glyphs.js +83 -0
  504. package/dist/libraries/gamepad/src/hub.js +164 -0
  505. package/dist/libraries/gamepad/src/index.js +10 -0
  506. package/dist/libraries/gamepad/src/library.js +56 -0
  507. package/dist/libraries/gamepad/src/source-sab.js +62 -0
  508. package/dist/libraries/gamepad/src/sysfs-enrich.js +125 -0
  509. package/dist/libraries/gaussian-splats/src/gpu-sort.js +506 -0
  510. package/dist/libraries/gaussian-splats/src/index.js +8 -0
  511. package/dist/libraries/gaussian-splats/src/library.js +44 -0
  512. package/dist/libraries/gaussian-splats/src/parser.js +297 -0
  513. package/dist/libraries/gaussian-splats/src/renderer.js +368 -0
  514. package/dist/libraries/gaussian-splats/src/sh-eval.js +196 -0
  515. package/dist/libraries/gaussian-splats/src/sorter.js +76 -0
  516. package/dist/libraries/gaussian-splats/src/tile-raster.js +424 -0
  517. package/dist/libraries/gpu-kernels/src/index.js +8 -0
  518. package/dist/libraries/gpu-kernels/src/kernel.js +591 -0
  519. package/dist/libraries/gpu-kernels/src/transpile.js +896 -0
  520. package/dist/libraries/html-ui-kit/src/behaviors.js +231 -0
  521. package/dist/libraries/html-ui-kit/src/components.js +219 -0
  522. package/dist/libraries/html-ui-kit/src/index.js +17 -0
  523. package/dist/libraries/html-ui-kit/src/nav/nav-controller.js +215 -0
  524. package/dist/libraries/html-ui-kit/src/nav/nav-input.js +138 -0
  525. package/dist/libraries/html-ui-kit/src/nav/osk.js +135 -0
  526. package/dist/libraries/html-ui-kit/src/nav/router.js +152 -0
  527. package/dist/libraries/html-ui-kit/src/nav/vcursor.js +177 -0
  528. package/dist/libraries/html-ui-kit/src/ten-foot.js +138 -0
  529. package/dist/libraries/html-ui-kit/src/theme.js +235 -0
  530. package/dist/libraries/inspectable/src/index.js +6 -0
  531. package/dist/libraries/inspectable/src/inspectable.js +205 -0
  532. package/dist/libraries/lighting/src/index.js +4 -0
  533. package/dist/libraries/lighting/src/library.js +48 -0
  534. package/dist/libraries/lighting/src/light-system.js +395 -0
  535. package/dist/libraries/lighting/src/lighting-system.js +57 -0
  536. package/dist/libraries/lighting/src/shaders/light-debug.wgsl +30 -0
  537. package/dist/libraries/marching-cubes/src/chunked-field.js +130 -0
  538. package/dist/libraries/marching-cubes/src/deformation.js +41 -0
  539. package/dist/libraries/marching-cubes/src/generator.js +356 -0
  540. package/dist/libraries/marching-cubes/src/index.js +13 -0
  541. package/dist/libraries/marching-cubes/src/library.js +54 -0
  542. package/dist/libraries/marching-cubes/src/lod.js +95 -0
  543. package/dist/libraries/marching-cubes/src/marching-tetrahedra.js +261 -0
  544. package/dist/libraries/marching-cubes/src/sab.js +40 -0
  545. package/dist/libraries/marching-cubes/src/streaming-config.js +28 -0
  546. package/dist/libraries/marching-cubes/src/streaming-manager.js +490 -0
  547. package/dist/libraries/marching-cubes/src/tables.js +314 -0
  548. package/dist/libraries/marching-cubes/src/types.js +1 -0
  549. package/dist/libraries/models/src/bake-node-transforms.js +146 -0
  550. package/dist/libraries/models/src/bind-unskinned-meshes.js +145 -0
  551. package/dist/libraries/models/src/codecs/basisu-codec.js +134 -0
  552. package/dist/libraries/models/src/codecs/draco-codec.js +236 -0
  553. package/dist/libraries/models/src/codecs/draco3dgltf.d.ts +40 -0
  554. package/dist/libraries/models/src/codecs/index.js +5 -0
  555. package/dist/libraries/models/src/codecs/meshopt-codec.js +59 -0
  556. package/dist/libraries/models/src/codecs/registry.js +111 -0
  557. package/dist/libraries/models/src/dae.js +665 -0
  558. package/dist/libraries/models/src/default-part-selection.js +58 -0
  559. package/dist/libraries/models/src/dxf.js +235 -0
  560. package/dist/libraries/models/src/fbx/index.js +438 -0
  561. package/dist/libraries/models/src/fbx/interpreter/animation.js +369 -0
  562. package/dist/libraries/models/src/fbx/interpreter/blend-shapes.js +283 -0
  563. package/dist/libraries/models/src/fbx/interpreter/connections.js +158 -0
  564. package/dist/libraries/models/src/fbx/interpreter/diagnostics.js +48 -0
  565. package/dist/libraries/models/src/fbx/interpreter/geometry.js +430 -0
  566. package/dist/libraries/models/src/fbx/interpreter/global-settings.js +77 -0
  567. package/dist/libraries/models/src/fbx/interpreter/materials.js +231 -0
  568. package/dist/libraries/models/src/fbx/interpreter/nodes.js +168 -0
  569. package/dist/libraries/models/src/fbx/interpreter/skeleton.js +454 -0
  570. package/dist/libraries/models/src/fbx/parsers/binary-parser.js +217 -0
  571. package/dist/libraries/models/src/fbx/types.js +88 -0
  572. package/dist/libraries/models/src/gltf-extensions.js +121 -0
  573. package/dist/libraries/models/src/gltf.js +724 -0
  574. package/dist/libraries/models/src/index.js +46 -0
  575. package/dist/libraries/models/src/library.js +44 -0
  576. package/dist/libraries/models/src/loader.js +218 -0
  577. package/dist/libraries/models/src/material-adapter.js +82 -0
  578. package/dist/libraries/models/src/mini-xml.js +145 -0
  579. package/dist/libraries/models/src/normalize.js +168 -0
  580. package/dist/libraries/models/src/obj.js +247 -0
  581. package/dist/libraries/models/src/off.js +94 -0
  582. package/dist/libraries/models/src/ply.js +329 -0
  583. package/dist/libraries/models/src/pose-sampler.js +183 -0
  584. package/dist/libraries/models/src/sidecar/blender-extras.js +32 -0
  585. package/dist/libraries/models/src/sidecar/ddmeta.js +98 -0
  586. package/dist/libraries/models/src/sidecar/godot-import.js +76 -0
  587. package/dist/libraries/models/src/sidecar/resolver.js +112 -0
  588. package/dist/libraries/models/src/sidecar/types.js +8 -0
  589. package/dist/libraries/models/src/sidecar/unity-meta.js +46 -0
  590. package/dist/libraries/models/src/skeleton-synthesis.js +122 -0
  591. package/dist/libraries/models/src/stl.js +129 -0
  592. package/dist/libraries/models/src/threeds.js +312 -0
  593. package/dist/libraries/models/src/threemf.js +203 -0
  594. package/dist/libraries/models/src/types.js +33 -0
  595. package/dist/libraries/models/src/vtk.js +242 -0
  596. package/dist/libraries/navmesh/src/crowd-system.js +207 -0
  597. package/dist/libraries/navmesh/src/debug-viz.js +52 -0
  598. package/dist/libraries/navmesh/src/index.js +7 -0
  599. package/dist/libraries/navmesh/src/library.js +47 -0
  600. package/dist/libraries/navmesh/src/navmesh-generator.js +364 -0
  601. package/dist/libraries/navmesh/src/navmesh.js +141 -0
  602. package/dist/libraries/navmesh/src/pathfinder.js +221 -0
  603. package/dist/libraries/navmesh/src/types.js +1 -0
  604. package/dist/libraries/networking/src/authority.js +107 -0
  605. package/dist/libraries/networking/src/connection.js +107 -0
  606. package/dist/libraries/networking/src/discovery.js +314 -0
  607. package/dist/libraries/networking/src/enhanced-replication.js +282 -0
  608. package/dist/libraries/networking/src/epic-adapter.js +101 -0
  609. package/dist/libraries/networking/src/index.js +16 -0
  610. package/dist/libraries/networking/src/library.js +45 -0
  611. package/dist/libraries/networking/src/lobby.js +84 -0
  612. package/dist/libraries/networking/src/platform-adapter.js +92 -0
  613. package/dist/libraries/networking/src/rcs-adapter.js +100 -0
  614. package/dist/libraries/networking/src/remote-input.js +162 -0
  615. package/dist/libraries/networking/src/replication.js +273 -0
  616. package/dist/libraries/networking/src/rpc.js +172 -0
  617. package/dist/libraries/networking/src/session.js +129 -0
  618. package/dist/libraries/networking/src/transport.js +156 -0
  619. package/dist/libraries/networking/src/webrtc.js +266 -0
  620. package/dist/libraries/pathfinding-2d/src/astar-grid.js +255 -0
  621. package/dist/libraries/pathfinding-2d/src/index.js +9 -0
  622. package/dist/libraries/persistence/src/autosave-manager.js +94 -0
  623. package/dist/libraries/persistence/src/binary-record-store.js +205 -0
  624. package/dist/libraries/persistence/src/browser.js +16 -0
  625. package/dist/libraries/persistence/src/file-save-store.js +507 -0
  626. package/dist/libraries/persistence/src/hash-utils.js +54 -0
  627. package/dist/libraries/persistence/src/index.js +17 -0
  628. package/dist/libraries/persistence/src/library.js +51 -0
  629. package/dist/libraries/persistence/src/mock-opfs.js +114 -0
  630. package/dist/libraries/persistence/src/node-fs-directory-handle.js +168 -0
  631. package/dist/libraries/persistence/src/opfs-save-store.js +584 -0
  632. package/dist/libraries/persistence/src/save-worker-proxy.js +96 -0
  633. package/dist/libraries/persistence/src/save-worker.js +76 -0
  634. package/dist/libraries/persistence/src/xxh3-ts.d.ts +10 -0
  635. package/dist/libraries/physics-native/src/backend.js +960 -0
  636. package/dist/libraries/physics-native/src/broadphase.js +79 -0
  637. package/dist/libraries/physics-native/src/index.js +6 -0
  638. package/dist/libraries/physics-native/src/library.js +57 -0
  639. package/dist/libraries/physics-native/src/narrowphase-shapes.js +348 -0
  640. package/dist/libraries/physics-native/src/narrowphase.js +60 -0
  641. package/dist/libraries/physics-native/src/solver.js +105 -0
  642. package/dist/libraries/physics-native/src/types.js +4 -0
  643. package/dist/libraries/physics-rapier/src/api.js +352 -0
  644. package/dist/libraries/physics-rapier/src/auto-backend.js +54 -0
  645. package/dist/libraries/physics-rapier/src/backend.js +1066 -0
  646. package/dist/libraries/physics-rapier/src/bulk-ops.js +46 -0
  647. package/dist/libraries/physics-rapier/src/ffi-backend.js +17 -0
  648. package/dist/libraries/physics-rapier/src/ffi-lib.js +605 -0
  649. package/dist/libraries/physics-rapier/src/index.js +9 -0
  650. package/dist/libraries/physics-rapier/src/library.js +71 -0
  651. package/dist/libraries/physics-rapier/src/rapier-backend.js +1102 -0
  652. package/dist/libraries/physics-rapier/src/realm-worker-script.js +233 -0
  653. package/dist/libraries/postfx/src/index.js +14 -0
  654. package/dist/libraries/postfx/src/library.js +207 -0
  655. package/dist/libraries/postfx/src/post-process-stack.js +1641 -0
  656. package/dist/libraries/postfx/src/shaders/post-process/afterimage.wgsl +14 -0
  657. package/dist/libraries/postfx/src/shaders/post-process/ascii.wgsl +24 -0
  658. package/dist/libraries/postfx/src/shaders/post-process/blit.wgsl +12 -0
  659. package/dist/libraries/postfx/src/shaders/post-process/bloom-blur.wgsl +21 -0
  660. package/dist/libraries/postfx/src/shaders/post-process/bloom-bright.wgsl +15 -0
  661. package/dist/libraries/postfx/src/shaders/post-process/bloom-composite.wgsl +14 -0
  662. package/dist/libraries/postfx/src/shaders/post-process/bloom-downsample.wgsl +60 -0
  663. package/dist/libraries/postfx/src/shaders/post-process/bloom-soft.wgsl +46 -0
  664. package/dist/libraries/postfx/src/shaders/post-process/bloom-upsample.wgsl +51 -0
  665. package/dist/libraries/postfx/src/shaders/post-process/channel-mixer.wgsl +36 -0
  666. package/dist/libraries/postfx/src/shaders/post-process/chromatic-aberration.wgsl +37 -0
  667. package/dist/libraries/postfx/src/shaders/post-process/dithering.wgsl +64 -0
  668. package/dist/libraries/postfx/src/shaders/post-process/dof.wgsl +131 -0
  669. package/dist/libraries/postfx/src/shaders/post-process/edges.wgsl +45 -0
  670. package/dist/libraries/postfx/src/shaders/post-process/fullscreen-vs.wgsl +15 -0
  671. package/dist/libraries/postfx/src/shaders/post-process/fxaa.wgsl +102 -0
  672. package/dist/libraries/postfx/src/shaders/post-process/gaussian-blur.wgsl +37 -0
  673. package/dist/libraries/postfx/src/shaders/post-process/glow-blur.wgsl +33 -0
  674. package/dist/libraries/postfx/src/shaders/post-process/glow-composite.wgsl +25 -0
  675. package/dist/libraries/postfx/src/shaders/post-process/grain.wgsl +37 -0
  676. package/dist/libraries/postfx/src/shaders/post-process/halftone.wgsl +80 -0
  677. package/dist/libraries/postfx/src/shaders/post-process/highlight-blur.wgsl +33 -0
  678. package/dist/libraries/postfx/src/shaders/post-process/highlight-composite.wgsl +32 -0
  679. package/dist/libraries/postfx/src/shaders/post-process/lens-distortion.wgsl +43 -0
  680. package/dist/libraries/postfx/src/shaders/post-process/lens-flare.wgsl +68 -0
  681. package/dist/libraries/postfx/src/shaders/post-process/lut.wgsl +30 -0
  682. package/dist/libraries/postfx/src/shaders/post-process/motion-blur.wgsl +55 -0
  683. package/dist/libraries/postfx/src/shaders/post-process/occluder-chunk.wgsl +28 -0
  684. package/dist/libraries/postfx/src/shaders/post-process/outline.wgsl +51 -0
  685. package/dist/libraries/postfx/src/shaders/post-process/pixelation.wgsl +47 -0
  686. package/dist/libraries/postfx/src/shaders/post-process/sharpen.wgsl +32 -0
  687. package/dist/libraries/postfx/src/shaders/post-process/sobel.wgsl +26 -0
  688. package/dist/libraries/postfx/src/shaders/post-process/split-tone.wgsl +36 -0
  689. package/dist/libraries/postfx/src/shaders/post-process/ssao-blur.wgsl +38 -0
  690. package/dist/libraries/postfx/src/shaders/post-process/ssao-composite.wgsl +25 -0
  691. package/dist/libraries/postfx/src/shaders/post-process/ssao.wgsl +147 -0
  692. package/dist/libraries/postfx/src/shaders/post-process/ssr.wgsl +155 -0
  693. package/dist/libraries/postfx/src/shaders/post-process/taa.wgsl +98 -0
  694. package/dist/libraries/postfx/src/shaders/post-process/tonemap.wgsl +40 -0
  695. package/dist/libraries/postfx/src/shaders/post-process/watercolor.wgsl +82 -0
  696. package/dist/libraries/postfx/src/shaders/post-process/white-balance.wgsl +41 -0
  697. package/dist/libraries/recast/src/backend.js +124 -0
  698. package/dist/libraries/recast/src/crowd-system.js +310 -0
  699. package/dist/libraries/recast/src/index.js +4 -0
  700. package/dist/libraries/recast/src/library.js +59 -0
  701. package/dist/libraries/recast/src/types.js +4 -0
  702. package/dist/libraries/sand/src/cell.js +32 -0
  703. package/dist/libraries/sand/src/fields.js +27 -0
  704. package/dist/libraries/sand/src/fluid-grid.js +267 -0
  705. package/dist/libraries/sand/src/grid-dims.js +47 -0
  706. package/dist/libraries/sand/src/grid-sim-buffer.js +184 -0
  707. package/dist/libraries/sand/src/index.js +20 -0
  708. package/dist/libraries/sand/src/library.js +67 -0
  709. package/dist/libraries/sand/src/materials.js +437 -0
  710. package/dist/libraries/sand/src/palette.js +87 -0
  711. package/dist/libraries/sand/src/particles.js +163 -0
  712. package/dist/libraries/sand/src/render/sand-grid-pass.js +377 -0
  713. package/dist/libraries/sand/src/rng.js +44 -0
  714. package/dist/libraries/sand/src/rules/builtin-rules.js +125 -0
  715. package/dist/libraries/sand/src/rules/rule-compiler.js +164 -0
  716. package/dist/libraries/sand/src/rules/rule-engine.js +210 -0
  717. package/dist/libraries/sand/src/rules/rule-types.js +27 -0
  718. package/dist/libraries/sand/src/sand-step-pool.js +458 -0
  719. package/dist/libraries/sand/src/sand-step-worker.js +101 -0
  720. package/dist/libraries/sand/src/sand-world.js +3382 -0
  721. package/dist/libraries/stickman/src/index.js +7 -0
  722. package/dist/libraries/stickman/src/library.js +44 -0
  723. package/dist/libraries/stickman/src/proportions.js +40 -0
  724. package/dist/libraries/stickman/src/shader.js +113 -0
  725. package/dist/libraries/stickman/src/skeleton.js +163 -0
  726. package/dist/libraries/stickman/src/stickman-pass.js +210 -0
  727. package/dist/libraries/stickman/src/thick-line.js +120 -0
  728. package/dist/libraries/surface-nets/src/chunked-field.js +5 -0
  729. package/dist/libraries/surface-nets/src/deformation.js +29 -0
  730. package/dist/libraries/surface-nets/src/index.js +15 -0
  731. package/dist/libraries/surface-nets/src/library.js +41 -0
  732. package/dist/libraries/surface-nets/src/lod.js +6 -0
  733. package/dist/libraries/surface-nets/src/sab.js +4 -0
  734. package/dist/libraries/surface-nets/src/streaming-config.js +4 -0
  735. package/dist/libraries/surface-nets/src/streaming-manager.js +9 -0
  736. package/dist/libraries/surface-nets/src/surface-nets.js +361 -0
  737. package/dist/libraries/surface-nets/src/types.js +1 -0
  738. package/dist/libraries/water/src/buoyancy.js +80 -0
  739. package/dist/libraries/water/src/index.js +12 -0
  740. package/dist/libraries/water/src/library.js +65 -0
  741. package/dist/libraries/water/src/shore-damping.js +70 -0
  742. package/dist/libraries/water/src/water-buffer.js +78 -0
  743. package/dist/libraries/water/src/water-chunks.js +5 -0
  744. package/dist/libraries/water/src/water-physics.js +315 -0
  745. package/dist/libraries/water/src/water-renderer.js +736 -0
  746. package/dist/libraries/water/src/water-sab.js +138 -0
  747. package/dist/libraries/water/src/wave-sources.js +45 -0
  748. package/dist/libraries/weather/src/index.js +5 -0
  749. package/dist/libraries/weather/src/library.js +48 -0
  750. package/dist/libraries/weather/src/types.js +29 -0
  751. package/dist/libraries/weather/src/weather-blend.js +108 -0
  752. package/dist/libraries/weather/src/weather-system.js +275 -0
  753. package/dist/libraries/weatherfx/src/cloud-provider.js +5 -0
  754. package/dist/libraries/weatherfx/src/cloud-system.js +294 -0
  755. package/dist/libraries/weatherfx/src/index.js +4 -0
  756. package/dist/libraries/weatherfx/src/library.js +41 -0
  757. package/dist/libraries/weatherfx/src/particle-system.js +350 -0
  758. package/dist/libraries/weatherfx/src/shaders/cloud.wgsl +111 -0
  759. package/dist/libraries/weatherfx/src/shaders/particle-compute.wgsl +187 -0
  760. package/dist/libraries/weatherfx/src/shaders/particle-render.wgsl +95 -0
  761. package/dist/mcp/src/client.js +669 -0
  762. package/dist/mcp/src/engine-context.js +99 -0
  763. package/dist/mcp/src/http-transport.js +423 -0
  764. package/dist/mcp/src/index.js +5 -0
  765. package/dist/mcp/src/prompts/add-entity.js +39 -0
  766. package/dist/mcp/src/prompts/create-scene.js +41 -0
  767. package/dist/mcp/src/prompts/debug-frame.js +36 -0
  768. package/dist/mcp/src/prompts/index.js +10 -0
  769. package/dist/mcp/src/resources/asset-list.js +28 -0
  770. package/dist/mcp/src/resources/checkpoint-list.js +29 -0
  771. package/dist/mcp/src/resources/entity-state.js +45 -0
  772. package/dist/mcp/src/resources/gpu-info.js +90 -0
  773. package/dist/mcp/src/resources/index.js +51 -0
  774. package/dist/mcp/src/resources/performance.js +33 -0
  775. package/dist/mcp/src/resources/scene-tree.js +37 -0
  776. package/dist/mcp/src/server.js +307 -0
  777. package/dist/mcp/src/tools/animation.js +102 -0
  778. package/dist/mcp/src/tools/asset.js +146 -0
  779. package/dist/mcp/src/tools/audio.js +80 -0
  780. package/dist/mcp/src/tools/build.js +128 -0
  781. package/dist/mcp/src/tools/camera.js +157 -0
  782. package/dist/mcp/src/tools/checkpoint.js +90 -0
  783. package/dist/mcp/src/tools/component.js +176 -0
  784. package/dist/mcp/src/tools/debug.js +273 -0
  785. package/dist/mcp/src/tools/entity.js +309 -0
  786. package/dist/mcp/src/tools/inspect.js +192 -0
  787. package/dist/mcp/src/tools/lighting.js +239 -0
  788. package/dist/mcp/src/tools/material.js +225 -0
  789. package/dist/mcp/src/tools/mesh.js +210 -0
  790. package/dist/mcp/src/tools/physics.js +251 -0
  791. package/dist/mcp/src/tools/scene.js +139 -0
  792. package/dist/mcp/src/tools/script.js +114 -0
  793. package/dist/mcp/src/types.js +9 -0
  794. package/dist/mcp/src/undo-redo.js +64 -0
  795. package/dist/modules/camera-controls/src/index.js +116 -0
  796. package/dist/modules/controller-ui/src/index.js +149 -0
  797. package/dist/modules/devtools/src/api.js +317 -0
  798. package/dist/modules/devtools/src/asset-utils.js +102 -0
  799. package/dist/modules/devtools/src/bind-debug-store.js +34 -0
  800. package/dist/modules/devtools/src/blitz/host.js +391 -0
  801. package/dist/modules/devtools/src/blitz/module.js +65 -0
  802. package/dist/modules/devtools/src/blitz/panels/console.js +217 -0
  803. package/dist/modules/devtools/src/blitz/panels/elements.js +79 -0
  804. package/dist/modules/devtools/src/blitz/panels/gpu.js +61 -0
  805. package/dist/modules/devtools/src/blitz/panels/performance.js +113 -0
  806. package/dist/modules/devtools/src/blitz/panels/snapshot.js +141 -0
  807. package/dist/modules/devtools/src/blitz/panels/types.js +55 -0
  808. package/dist/modules/devtools/src/blitz/theme.js +167 -0
  809. package/dist/modules/devtools/src/data-bridge.js +247 -0
  810. package/dist/modules/devtools/src/debug-overlay.js +181 -0
  811. package/dist/modules/devtools/src/debug-raycast.js +296 -0
  812. package/dist/modules/devtools/src/debug-store.js +28 -0
  813. package/dist/modules/devtools/src/debug-view-descriptors.js +24 -0
  814. package/dist/modules/devtools/src/doctor-panel.js +163 -0
  815. package/dist/modules/devtools/src/gizmo-module.js +95 -0
  816. package/dist/modules/devtools/src/graph-model.js +387 -0
  817. package/dist/modules/devtools/src/grid-renderer.js +145 -0
  818. package/dist/modules/devtools/src/height-ruler-renderer.js +189 -0
  819. package/dist/modules/devtools/src/index.js +46 -0
  820. package/dist/modules/devtools/src/init.js +204 -0
  821. package/dist/modules/devtools/src/label-overlay.js +129 -0
  822. package/dist/modules/devtools/src/material-stats-panel.js +171 -0
  823. package/dist/modules/devtools/src/profiling-bridge.js +288 -0
  824. package/dist/modules/devtools/src/profiling-hooks.js +63 -0
  825. package/dist/modules/devtools/src/renderer-adapter.js +61 -0
  826. package/dist/modules/devtools/src/scene-inspector.js +571 -0
  827. package/dist/modules/devtools/src/scene-store.js +212 -0
  828. package/dist/modules/devtools/src/scene-sync.js +92 -0
  829. package/dist/modules/devtools/src/shaders/transform-gizmo.wgsl +38 -0
  830. package/dist/modules/devtools/src/sim-stats-panel.js +250 -0
  831. package/dist/modules/devtools/src/sim-stats-provider.js +73 -0
  832. package/dist/modules/devtools/src/skeleton-renderer.js +326 -0
  833. package/dist/modules/devtools/src/transform-gizmo.js +677 -0
  834. package/dist/modules/devtools/src/types.js +5 -0
  835. package/dist/modules/devtools/src/worker-expose.js +59 -0
  836. package/dist/modules/devtools/src/worker-sync.js +115 -0
  837. package/dist/modules/editor/src/commands/component.js +151 -0
  838. package/dist/modules/editor/src/commands/entity.js +253 -0
  839. package/dist/modules/editor/src/commands/hierarchy.js +79 -0
  840. package/dist/modules/editor/src/commands/index.js +57 -0
  841. package/dist/modules/editor/src/commands/prefab.js +149 -0
  842. package/dist/modules/editor/src/commands/registry.js +246 -0
  843. package/dist/modules/editor/src/commands/scene-io.js +206 -0
  844. package/dist/modules/editor/src/commands/selection.js +71 -0
  845. package/dist/modules/editor/src/commands/transform.js +88 -0
  846. package/dist/modules/editor/src/ddscene.js +189 -0
  847. package/dist/modules/editor/src/document.js +96 -0
  848. package/dist/modules/editor/src/editor-context.js +115 -0
  849. package/dist/modules/editor/src/index.js +11 -0
  850. package/dist/modules/editor/src/mcp.js +91 -0
  851. package/dist/modules/editor/src/module.js +115 -0
  852. package/dist/modules/editor/src/selection.js +60 -0
  853. package/dist/modules/editor/src/shell.js +397 -0
  854. package/dist/modules/editor/src/viewport.js +186 -0
  855. package/dist/modules/html-ui/src/composite.js +116 -0
  856. package/dist/modules/html-ui/src/create-html-ui.js +137 -0
  857. package/dist/modules/html-ui/src/doc-backend.js +518 -0
  858. package/dist/modules/html-ui/src/host.js +819 -0
  859. package/dist/modules/html-ui/src/index.js +5 -0
  860. package/dist/modules/html-ui/src/jsx-dev-runtime.js +9 -0
  861. package/dist/modules/html-ui/src/jsx-runtime.js +121 -0
  862. package/dist/modules/html-ui/src/protocol.js +6 -0
  863. package/dist/modules/html-ui/src/ui-worker.js +10 -0
  864. package/dist/modules/mcp/src/index.js +62 -0
  865. package/dist/modules/movement-2d/src/grid-character.js +345 -0
  866. package/dist/modules/movement-2d/src/index.js +27 -0
  867. package/dist/modules/movement-3d/src/character-motor.js +166 -0
  868. package/dist/modules/movement-3d/src/index.js +27 -0
  869. package/dist/modules/native-osr/src/index.js +12 -0
  870. package/dist/modules/native-osr/src/input-router.js +335 -0
  871. package/dist/modules/native-osr/src/native-osr-manager.js +210 -0
  872. package/dist/modules/native-osr/src/native-texture-source.js +66 -0
  873. package/dist/modules/native-osr/src/types.js +8 -0
  874. package/dist/modules/native-osr/src/world-space-ui-pass.js +313 -0
  875. package/dist/modules/sailing/src/index.js +39 -0
  876. package/dist/modules/terrain/src/index.js +44 -0
  877. package/dist/modules/vitals/src/index.js +25 -0
  878. package/dist/modules/vitals/src/vitals.js +195 -0
  879. package/dist/modules/xr/src/camera-rig.js +119 -0
  880. package/dist/modules/xr/src/debug.js +45 -0
  881. package/dist/modules/xr/src/frame-loop.js +139 -0
  882. package/dist/modules/xr/src/index.js +10 -0
  883. package/dist/modules/xr/src/input.js +164 -0
  884. package/dist/modules/xr/src/layer.js +100 -0
  885. package/dist/modules/xr/src/session.js +133 -0
  886. package/dist/modules/xr/src/sim-module.js +21 -0
  887. package/dist/modules/xr/src/types.js +4 -0
  888. package/dist/modules/xr/src/webxr.d.ts +182 -0
  889. package/dist/modules/xr/src/xr-module.js +134 -0
  890. package/dist/shader-graph/src/chunks.js +340 -0
  891. package/dist/shader-graph/src/compiler.js +639 -0
  892. package/dist/shader-graph/src/compute-compiler.js +384 -0
  893. package/dist/shader-graph/src/compute-graph.js +55 -0
  894. package/dist/shader-graph/src/compute-profiles.js +39 -0
  895. package/dist/shader-graph/src/graph.js +38 -0
  896. package/dist/shader-graph/src/index.js +15 -0
  897. package/dist/shader-graph/src/profiles.js +305 -0
  898. package/dist/shader-graph/src/validator.js +42 -0
  899. package/dist/shader-graph/src/wgsl-binding-validator.js +110 -0
  900. package/dist/shader-graph/src/wgsl-struct-validator.js +222 -0
  901. package/dist/shader-graph/src/wgsl-struct.js +251 -0
  902. package/dist/test/src/index.js +1 -0
  903. package/dist/test/src/vision-test.js +228 -0
  904. package/libraries/asset-browser/src/software-thumbnails.ts +2 -2
  905. package/libraries/audio-kira/src/backend.ts +2 -1
  906. package/libraries/blitz-ui/native/src/shell.rs +35 -1
  907. package/libraries/blitz-ui/native-osr/Cargo.toml +8 -0
  908. package/libraries/blitz-ui/native-osr/src/lib.rs +213 -22
  909. package/libraries/blitz-ui/native-osr/src/mutate.rs +109 -14
  910. package/libraries/blitz-ui/src/native-osr-ffi.ts +71 -8
  911. package/libraries/blitz-ui/src/router.ts +3 -1
  912. package/libraries/blitz-ui/src/ui-blit-pass.ts +1 -1
  913. package/libraries/character/src/character-animator.ts +1 -1
  914. package/libraries/character/src/customization.ts +513 -0
  915. package/libraries/character/src/index.ts +6 -0
  916. package/libraries/character/src/inspectable.ts +111 -0
  917. package/libraries/character/src/loader.ts +38 -13
  918. package/libraries/character/src/locomotion.ts +13 -1
  919. package/libraries/character/src/preview.ts +94 -24
  920. package/libraries/devtools/README.md +16 -18
  921. package/libraries/devtools/src/backend.ts +505 -0
  922. package/libraries/devtools/src/cdp-bridge.ts +8 -8
  923. package/libraries/devtools/src/collectors.ts +41 -37
  924. package/libraries/devtools/src/index.ts +32 -14
  925. package/libraries/devtools/src/native-providers.ts +20 -12
  926. package/libraries/devtools/src/snapshot.ts +77 -0
  927. package/libraries/devtools/src/web/host.ts +11 -12
  928. package/libraries/devtools/src/web/mirror.ts +14 -405
  929. package/libraries/devtools/src/web/server.ts +4 -3
  930. package/libraries/entities/src/model-renderer.ts +96 -23
  931. package/libraries/gamepad/src/library.ts +2 -1
  932. package/libraries/inspectable/src/index.ts +11 -0
  933. package/libraries/inspectable/src/inspectable.ts +277 -0
  934. package/libraries/marching-cubes/src/streaming-manager.ts +4 -4
  935. package/libraries/models/src/bind-unskinned-meshes.ts +131 -0
  936. package/libraries/models/src/index.ts +1 -0
  937. package/libraries/models/src/types.ts +22 -0
  938. package/libraries/persistence/src/autosave-manager.ts +1 -1
  939. package/libraries/persistence/src/binary-record-store.ts +1 -1
  940. package/libraries/persistence/src/file-save-store.ts +4 -4
  941. package/libraries/persistence/src/library.ts +1 -1
  942. package/libraries/persistence/src/opfs-save-store.ts +5 -5
  943. package/libraries/persistence/src/save-worker.ts +13 -14
  944. package/libraries/physics-rapier/src/ffi-lib.ts +2 -1
  945. package/libraries/postfx/src/post-process-stack.ts +1 -1
  946. package/libraries/sand/src/sand-step-pool.ts +5 -0
  947. package/libraries/water/src/water-renderer.ts +1 -1
  948. package/libraries/weatherfx/src/cloud-system.ts +3 -3
  949. package/mcp/README.md +20 -0
  950. package/mcp/src/client.ts +75 -22
  951. package/mcp/src/undo-redo.ts +2 -2
  952. package/modules/devtools/src/blitz/host.ts +430 -0
  953. package/modules/devtools/src/blitz/module.ts +101 -0
  954. package/modules/devtools/src/blitz/panels/console.ts +223 -0
  955. package/modules/devtools/src/blitz/panels/elements.ts +92 -0
  956. package/modules/devtools/src/blitz/panels/gpu.ts +70 -0
  957. package/modules/devtools/src/blitz/panels/performance.ts +120 -0
  958. package/modules/devtools/src/blitz/panels/snapshot.ts +152 -0
  959. package/modules/devtools/src/blitz/panels/types.ts +120 -0
  960. package/modules/devtools/src/blitz/theme.ts +168 -0
  961. package/modules/devtools/src/data-bridge.ts +1 -1
  962. package/modules/devtools/src/index.ts +6 -0
  963. package/modules/devtools/src/profiling-bridge.ts +17 -13
  964. package/modules/devtools/src/profiling-hooks.ts +22 -13
  965. package/modules/devtools/src/scene-inspector.ts +1 -1
  966. package/modules/devtools/src/worker-sync.ts +9 -1
  967. package/modules/editor/src/commands/registry.ts +2 -2
  968. package/modules/editor/src/module.ts +1 -1
  969. package/modules/html-ui/src/composite.ts +1 -1
  970. package/modules/html-ui/src/create-html-ui.ts +21 -9
  971. package/modules/html-ui/src/doc-backend.ts +189 -10
  972. package/modules/html-ui/src/host.ts +354 -40
  973. package/modules/html-ui/src/index.ts +1 -1
  974. package/modules/html-ui/src/jsx-runtime.ts +1 -1
  975. package/modules/html-ui/src/protocol.ts +53 -6
  976. package/modules/mcp/README.md +6 -0
  977. package/modules/mcp/src/index.ts +70 -3
  978. package/modules/movement-3d/src/character-motor.ts +83 -10
  979. package/package.json +838 -165
  980. package/shader-graph/README.md +25 -0
  981. package/test/README.md +16 -0
  982. package/libraries/blitz-ui/native-osr-spike.ts +0 -70
  983. package/libraries/devtools/native/Cargo.toml +0 -12
  984. package/libraries/devtools/native/src/lib.rs +0 -1646
  985. package/libraries/devtools/native/src/panels/console.rs +0 -338
  986. package/libraries/devtools/native/src/panels/dom_tree.rs +0 -47
  987. package/libraries/devtools/native/src/panels/generic.rs +0 -317
  988. package/libraries/devtools/native/src/panels/gpu.rs +0 -107
  989. package/libraries/devtools/native/src/panels/input.rs +0 -88
  990. package/libraries/devtools/native/src/panels/mod.rs +0 -154
  991. package/libraries/devtools/native/src/panels/perf_metrics.rs +0 -91
  992. package/libraries/devtools/native/src/panels/perf_recorder.rs +0 -158
  993. package/libraries/devtools/native/src/panels/scene.rs +0 -72
  994. package/libraries/devtools/native/src/state.rs +0 -394
  995. package/libraries/devtools/src/egui-ffi.ts +0 -804
  996. package/libraries/devtools/src/egui-renderer.ts +0 -407
  997. package/libraries/devtools/src/host.ts +0 -363
  998. package/libraries/devtools/src/mirror.ts +0 -794
  999. package/libraries/models/test-fixtures/fbx/LICENSE-notice.txt +0 -24
  1000. package/libraries/models/test-fixtures/fbx/README.md +0 -46
  1001. package/libraries/models/test-fixtures/fbx/m01_cube_phong.fbx +0 -0
  1002. package/libraries/models/test-fixtures/fbx/m02_geo_ngons.fbx +0 -0
  1003. package/libraries/models/test-fixtures/fbx/m03_normals.fbx +0 -0
  1004. package/libraries/models/test-fixtures/fbx/m04_material_properties.fbx +0 -0
  1005. package/libraries/models/test-fixtures/fbx/m05_external_diffuse.png +0 -0
  1006. package/libraries/models/test-fixtures/fbx/m05_textures.fbx +0 -0
  1007. package/libraries/models/test-fixtures/fbx/m06_uv_transform.fbx +0 -0
  1008. package/libraries/models/test-fixtures/fbx/m07_multimaterial.fbx +0 -0
  1009. package/libraries/models/test-fixtures/fbx/m08_transforms.fbx +0 -0
  1010. package/libraries/models/test-fixtures/fbx/m09_skinning.fbx +0 -0
  1011. package/libraries/models/test-fixtures/fbx/m10_morph.fbx +0 -0
  1012. package/libraries/models/test-fixtures/fbx/m11_node_anim.fbx +0 -0
  1013. package/libraries/models/test-fixtures/fbx/m12_skeletal_anim.fbx +0 -0
  1014. package/libraries/models/test-fixtures/fbx/m13_morph_anim.fbx +0 -0
  1015. package/libraries/models/test-fixtures/fbx/m14_multiclip.fbx +0 -0
  1016. package/libraries/models/test-fixtures/fbx/m15_camera_lights.fbx +0 -0
  1017. package/libraries/models/test-fixtures/fbx/m16_axis_yup.fbx +0 -0
  1018. package/libraries/models/test-fixtures/fbx/m16_axis_zup.fbx +0 -0
  1019. package/libraries/models/test-fixtures/fbx/m16_units_254.fbx +0 -0
  1020. package/libraries/physics-native/src/ffi-spike-worker.ts +0 -71
  1021. package/libraries/physics-rapier/bench/ffi-bench.ts +0 -79
  1022. package/libraries/physics-rapier/bench/wasm-baseline.ts +0 -90
package/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # `@downdraft/engine`
2
+
3
+ Downdraft engine — a native-runtime game engine (winit + wgpu, no Electron, no browser shell). The JS host is interchangeable: Bun, Node, and Deno all run the same engine through a shared FFI/device layer.
4
+
5
+ Everything the engine ships is exposed as **subpath exports** of this one package:
6
+
7
+ - `@downdraft/engine` — core index (ECS, render loop, HostAPI types)
8
+ - `@downdraft/engine/app/renderer` — `startGame()` / `bootstrapGame()` game bootstrap
9
+ - `@downdraft/engine/libraries/<name>` — engine building blocks (physics, audio, models, water, weather, navmesh, gpu-kernels, …)
10
+ - `@downdraft/engine/modules/<name>` — opt-in feature modules with lifecycle + typed DI (movement-2d/3d, terrain, sailing, camera-controls, devtools, …)
11
+ - `@downdraft/engine/platform/…` — runtime adapters (native surface, FFI, SAB channels)
12
+
13
+ ## Install
14
+
15
+ ```sh
16
+ bun add @downdraft/engine @downdraft/platform-native @downdraft/cli
17
+ ```
18
+
19
+ `@downdraft/platform-native` supplies the native window/GPU device layer (prebuilt binaries per OS/arch arrive via optional dependencies).
20
+
21
+ ## Quick start
22
+
23
+ ```ts
24
+ import { startGame } from "@downdraft/engine/app/renderer";
25
+
26
+ startGame({
27
+ renderer: (canvas) => new WebGPURenderer(canvas),
28
+ sim: (seed) => new SimWebWorker(seed?.libraryBuffers),
29
+ simConfig: { seed: 12345 },
30
+ });
31
+ ```
32
+
33
+ See the [Downdraft engine repository](https://github.com/knackstedt/downdraft) for architecture docs and examples.
package/app/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # `@downdraft/engine/app`
2
+
3
+ Downdraft application runtime — renderer runtime (startGame/GameModule), shared host services, and dev-shell support.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ bun add @downdraft/engine/app
9
+ ```
10
+
11
+ See the [Downdraft engine repository](https://github.com/knackstedt/downdraft) for architecture docs and examples.
@@ -21,13 +21,79 @@
21
21
  // that need full control can call `bootstrapGame()` directly.
22
22
  // ============================================================================
23
23
 
24
- import { encodeFeatureLogLine, isDevMode, type RenderSurface } from "@downdraft/engine";
24
+ import { encodeFeatureLogLine, getNativeHost, isDevMode, type RenderSurface } from "@downdraft/engine";
25
25
  import { createLogger } from "@downdraft/engine/util/logger";
26
26
  import { collectRendererFeatureLog } from "./feature-log";
27
27
  import { downdraft, getSurface } from "./index";
28
28
 
29
29
  const log = createLogger("info");
30
30
 
31
+ // Pre-warm the devtools chunks in dev mode. The dynamic imports below are
32
+ // awaited deep inside async bootstrap frames — if the fetch is still in
33
+ // flight when a dev-session restart clears the runner's module cache, the
34
+ // pending fetch can be dropped unresolved, leaving the async frame suspended
35
+ // forever and pinning the dead generation's renderer/devtools graph. Firing
36
+ // the import at module eval collapses the awaits to a settled-cache lookup.
37
+ const devtoolsModuleP = isDevMode
38
+ ? import("@downdraft/engine/modules/devtools")
39
+ : null;
40
+ const devtoolsLibP = isDevMode
41
+ ? import("@downdraft/engine/libraries/devtools")
42
+ : null;
43
+ // ./hooks is tiny and same-graph, but pre-warming it too keeps the await at
44
+ // the bottom of bootstrapGame() off the in-flight-fetch path as well.
45
+ const hooksP = import("./hooks");
46
+ // Attach benign handlers so a rejection before the first await isn't flagged
47
+ // as unhandled — awaiting the original promise still propagates the error.
48
+ devtoolsModuleP?.catch(() => {});
49
+ devtoolsLibP?.catch(() => {});
50
+ hooksP.catch(() => {});
51
+
52
+ /**
53
+ * Race an awaited import against session teardown: under the dev shell a
54
+ * fetch can be orphaned mid-flight (module-cache clear drops the pending
55
+ * entry unresolved), which would suspend the awaiting async frame forever —
56
+ * JSC retains suspended frames via their rooted executables, so the frame's
57
+ * captured environment (renderer, module host, devtools host) leaks per
58
+ * restart. Resolving to null lets the caller abandon the work cleanly.
59
+ */
60
+ function importOrDead<T>(p: Promise<T>, expectedSession?: any): Promise<T | null> {
61
+ const tracker = (globalThis as any).__ddSession;
62
+ if (!tracker || typeof tracker.onDispose !== "function") return p;
63
+ const s = tracker.session;
64
+ // No live session — or a DIFFERENT session than the caller's generation —
65
+ // at await time means this frame belongs to a generation that is already
66
+ // dead. Resolve null now so it unwinds rather than parking on a
67
+ // possibly-orphaned fetch or registering into the wrong session.
68
+ if (!s || s.dead || (expectedSession !== undefined && s !== expectedSession)) {
69
+ return Promise.resolve(null);
70
+ }
71
+ return Promise.race([
72
+ p,
73
+ new Promise<null>((resolve) => {
74
+ tracker.onDispose(() => resolve(null));
75
+ // The registration is dropped when the session is already dying —
76
+ // re-check so the race can't park on a resolve that will never fire.
77
+ if (s.dead || tracker.session !== s) resolve(null);
78
+ }),
79
+ ]);
80
+ }
81
+
82
+ /** Bail predicate for bootstrapGame's mid-boot awaits. The session snapshot
83
+ * captured at ENTRY is this generation's identity: after any await a restart
84
+ * may have torn it down AND begun a fresh session — checking the tracker's
85
+ * current session alone would let dead-generation continuations register
86
+ * timers/listeners into the new session (which tracks them faithfully,
87
+ * pinning the dead module graph for a whole generation). Also bails when a
88
+ * host restart stripped the DOM polyfill globals. */
89
+ function makeBootGuard(mySession: any): () => boolean {
90
+ const tracker = (globalThis as any).__ddSession;
91
+ return () => {
92
+ if (tracker && (tracker.session !== mySession || !mySession || mySession.dead)) return true;
93
+ return typeof (globalThis as any).window === "undefined";
94
+ };
95
+ }
96
+
31
97
  export interface BootstrapAutosaveOptions {
32
98
  /** Load saved state. Returns null if no save exists. */
33
99
  load: () => Promise<any | null>;
@@ -56,6 +122,8 @@ export interface BootstrapDevToolsOptions {
56
122
  * renderer init — a factory runs when the game's sim worker is already
57
123
  * started, e.g. by an overridden onInit). */
58
124
  workerHosts?: any[] | ((renderer: any) => any[]);
125
+ /** Extra game-level rows for the Input panel. */
126
+ inputInfo?: () => { key: string; value: string; flags?: number }[];
59
127
  /**
60
128
  * Enable the profiling system (ProfilingSAB + ProfilingBridge + built-in views).
61
129
  * When true, a ProfilingBridge is created and the ProfilingSAB is shared
@@ -63,6 +131,19 @@ export interface BootstrapDevToolsOptions {
63
131
  * pre-allocated buffer. Default: false.
64
132
  */
65
133
  profiling?: boolean | { sharedSAB?: { sab: SharedArrayBuffer; layout: unknown } };
134
+ /**
135
+ * Devtools UI frontend. "blitz" (default) mounts the docked in-window UI
136
+ * (F12 toggles); "web" starts the loopback browser frontend
137
+ * (WebDevtoolsHost, requires Bun); "none" wires data only.
138
+ * Object form: `{ kind: "blitz", dockFraction?, autoShow?, toggleKey? }`.
139
+ * `DOWNDRAFT_DISABLE_DEVTOOLS=1` forces "none".
140
+ */
141
+ ui?: "blitz" | "web" | "none" | {
142
+ kind?: "blitz" | "web";
143
+ dockFraction?: number;
144
+ autoShow?: boolean;
145
+ toggleKey?: string | null;
146
+ };
66
147
  }
67
148
 
68
149
  export interface BootstrapGameOptions {
@@ -128,6 +209,8 @@ export interface BootstrapGameOptions {
128
209
  * partial composition can use the individual hooks from `./hooks.ts` instead.
129
210
  */
130
211
  export async function bootstrapGame(opts: BootstrapGameOptions): Promise<void> {
212
+ const bootSession = (globalThis as any).__ddSession?.session ?? null;
213
+ const bootAborted = makeBootGuard(bootSession);
131
214
  const canvasLayer = opts.canvasLayer ?? 0;
132
215
  const deterministic = downdraft?.deterministic === true;
133
216
 
@@ -137,17 +220,21 @@ export async function bootstrapGame(opts: BootstrapGameOptions): Promise<void> {
137
220
  // 3. Create + init renderer
138
221
  const renderer = opts.createRenderer(surface);
139
222
  if (opts.initRenderer) {
140
- const ok = await opts.initRenderer(renderer);
223
+ const ok = await importOrDead(Promise.resolve(opts.initRenderer(renderer)), bootSession);
224
+ if (ok === null) return;
141
225
  if (!ok) {
142
- log.error("bootstrapGame", "Renderer init failed");
226
+ log.error("bootstrap-game", "Renderer init failed");
143
227
  return;
144
228
  }
145
229
  }
230
+ if (bootAborted()) return;
146
231
 
147
232
  // 4. Wire DevTools (if provided) — runs BEFORE onRendererInit so that
148
233
  // games can access the ProfilingBridge + __sceneInspector API in onReady.
149
234
  if (opts.devtools) {
150
- const { initDevTools } = await import("@downdraft/engine/modules/devtools");
235
+ const devtoolsMod = await importOrDead(devtoolsModuleP ?? import("@downdraft/engine/modules/devtools"), bootSession);
236
+ if (!devtoolsMod) return;
237
+ const { initDevTools } = devtoolsMod;
151
238
  const simStatsProvider = opts.devtools.createSimStatsProvider?.(renderer);
152
239
  const panels = typeof opts.devtools.panels === "function"
153
240
  ? opts.devtools.panels(renderer)
@@ -155,21 +242,149 @@ export async function bootstrapGame(opts: BootstrapGameOptions): Promise<void> {
155
242
  const workerHosts = typeof opts.devtools.workerHosts === "function"
156
243
  ? opts.devtools.workerHosts(renderer)
157
244
  : opts.devtools.workerHosts;
158
- await initDevTools(renderer, {
245
+ const devtoolsBridge = await importOrDead(initDevTools(renderer, {
159
246
  simStatsProvider,
160
247
  panels,
161
248
  sceneInspector: opts.devtools.sceneInspector,
162
249
  bridgeClass: opts.devtools.bridgeClass,
163
250
  workerHosts,
164
251
  profiling: opts.devtools.profiling as any,
165
- });
252
+ }), bootSession);
253
+ if (!devtoolsBridge) return;
254
+ if (bootAborted()) {
255
+ try { devtoolsBridge.destroy(); } catch {}
256
+ return;
257
+ }
258
+ // The bridge exposes `window.__sceneInspector` on the PERSISTENT window —
259
+ // its methods close over `renderer`, so without a destroy on session
260
+ // teardown the old session's renderer (and through it the whole module
261
+ // graph) stays rooted across hot-reload restarts.
262
+ const hooksMod = await importOrDead(hooksP, bootSession);
263
+ if (!hooksMod) return;
264
+ hooksMod.dispose(() => { try { devtoolsBridge.destroy(); } catch {} });
265
+
266
+ // 4a. Profiling wiring — `profiling: true` allocates the SAB + bridge,
267
+ // but without this nothing ticks the bridge or shares the SAB with
268
+ // workers, so the perf tab would only ever report the main thread.
269
+ // wireProfilingBridge guards against games that also call it
270
+ // manually; worker-side attach is idempotent.
271
+ if (opts.devtools.profiling) {
272
+ try {
273
+ const mod = await importOrDead(devtoolsModuleP ?? import("@downdraft/engine/modules/devtools"), bootSession);
274
+ if (!mod) return;
275
+ const { wireProfilingBridge } = mod;
276
+ const bridge =
277
+ (globalThis as Record<string, any>).window?.__sceneInspector?.__getProfilingBridge?.()
278
+ ?? (globalThis as Record<string, any>).__sceneInspector?.__getProfilingBridge?.()
279
+ ?? null;
280
+ if (bridge) {
281
+ // workerHosts entries are {prefix, proxy} — the devtools proxy
282
+ // exposes __profilingAttach via exposeDevToolsApi → wrap each into
283
+ // the ProfilingWireHost surface wireProfilingBridge expects.
284
+ const hosts: Array<{ host: { attachProfilingSAB(sab: SharedArrayBuffer, o?: any): Promise<void> }; workerTag?: string }> = [];
285
+ (workerHosts ?? []).forEach((wh: any) => {
286
+ const proxy = wh?.proxy;
287
+ if (typeof proxy?.__profilingAttach !== "function") return;
288
+ const prefix = wh?.prefix;
289
+ hosts.push({
290
+ host: {
291
+ attachProfilingSAB: async (sab, o) => {
292
+ await proxy.__profilingAttach(sab, {
293
+ workerTag: o?.workerTag ?? prefix ?? "worker",
294
+ layout: o?.layout,
295
+ });
296
+ },
297
+ },
298
+ workerTag: prefix,
299
+ });
300
+ });
301
+ // The native services worker (save + SQLite) exposes the same
302
+ // profiling RPC — claim a slot for it too.
303
+ const services = (getNativeHost() as any)?.services;
304
+ if (typeof services?.api?.__profilingAttach === "function") {
305
+ hosts.push({
306
+ host: {
307
+ attachProfilingSAB: async (sab, o) => {
308
+ await services.api.__profilingAttach(sab, {
309
+ workerTag: "services",
310
+ layout: o?.layout,
311
+ });
312
+ },
313
+ },
314
+ workerTag: "services",
315
+ });
316
+ }
317
+ wireProfilingBridge({ renderer, bridge, workerHosts: hosts });
318
+ }
319
+ } catch (err) {
320
+ log.warn("bootstrap-game", `profiling wiring failed: ${err}`);
321
+ }
322
+ }
323
+
324
+ // 4b. Devtools UI frontend — the Blitz dock is the default surface.
325
+ const disabled = typeof process !== "undefined" && !!process.env?.DOWNDRAFT_DISABLE_DEVTOOLS;
326
+ const uiOpt = opts.devtools.ui ?? "blitz";
327
+ const uiKind = disabled ? "none" : (typeof uiOpt === "string" ? uiOpt : uiOpt.kind ?? "blitz");
328
+ if (uiKind !== "none" && typeof renderer.useRendererModule === "function") {
329
+ try {
330
+ const uiCfg = typeof uiOpt === "object" ? uiOpt : {};
331
+ const profilingSAB =
332
+ (globalThis as Record<string, any>).window?.__sceneInspector?.__getProfilingBridge?.()?.getProfilingSAB?.()
333
+ ?? (globalThis as Record<string, any>).__sceneInspector?.__getProfilingBridge?.()?.getProfilingSAB?.()
334
+ ?? null;
335
+ if (uiKind === "blitz") {
336
+ const mod = await importOrDead(devtoolsModuleP ?? import("@downdraft/engine/modules/devtools"), bootSession);
337
+ if (!mod) return;
338
+ const { createDevtoolsUiModule } = mod;
339
+ renderer.useRendererModule(createDevtoolsUiModule({
340
+ renderer,
341
+ profilingSAB,
342
+ dockFraction: uiCfg.dockFraction,
343
+ autoShow: uiCfg.autoShow,
344
+ toggleKey: uiCfg.toggleKey,
345
+ onHost: (host) => {
346
+ renderer.nativeDebugger = host;
347
+ wireDevtoolsFrontend(host.devtoolsMirror, host, renderer, workerHosts, profilingSAB, opts.devtools?.inputInfo, bootSession);
348
+ },
349
+ }));
350
+ } else {
351
+ // "web" — loopback browser frontend (Bun-only transport).
352
+ const libMod = await importOrDead(devtoolsLibP ?? import("@downdraft/engine/libraries/devtools"), bootSession);
353
+ if (!libMod) return;
354
+ const { WebDevtoolsHost } = libMod;
355
+ const webHost = new WebDevtoolsHost({
356
+ device: renderer.getDevice?.() as GPUDevice,
357
+ adapter: null as any,
358
+ targetFormat: renderer.getFormat?.() ?? "bgra8unorm",
359
+ width: 0, height: 0,
360
+ renderer,
361
+ profilingSAB,
362
+ });
363
+ await webHost.start();
364
+ renderer.nativeDebugger = webHost;
365
+ wireDevtoolsFrontend(webHost.devtoolsMirror, webHost, renderer, workerHosts, profilingSAB, opts.devtools?.inputInfo, bootSession);
366
+ // Per-frame pump + F12 through the renderer's input bus, same as
367
+ // the Blitz module's wiring.
368
+ renderer.setCallbacks?.({
369
+ ...renderer.getCallbacks?.(),
370
+ beforeFrame: ((prev: any) => (dt: number, t: number) => {
371
+ try { webHost.update(); } catch { /* ignore */ }
372
+ prev?.(dt, t);
373
+ })(renderer.getCallbacks?.().beforeFrame),
374
+ });
375
+ }
376
+ } catch (err) {
377
+ log.error("bootstrap-game", `Devtools UI init failed: ${err}`);
378
+ }
379
+ }
166
380
  }
167
381
 
168
- // 4b. onRendererInit — library setup, sim start, game-specific wiring (onReady).
382
+ // 4c. onRendererInit — library setup, sim start, game-specific wiring (onReady).
169
383
  // DevTools is already wired, so games can access __sceneInspector +
170
384
  // the ProfilingBridge from their onReady hook.
171
385
  if (opts.onRendererInit) {
172
- await opts.onRendererInit(renderer);
386
+ await importOrDead(Promise.resolve(opts.onRendererInit(renderer)), bootSession);
387
+ if (bootAborted()) return;
173
388
  }
174
389
 
175
390
  // 5. Start the render loop immediately — don't let a hung autosave load
@@ -191,16 +406,19 @@ export async function bootstrapGame(opts: BootstrapGameOptions): Promise<void> {
191
406
  deterministic,
192
407
  getActiveModules: opts.getActiveModules,
193
408
  });
194
- log.info("bootstrapGame", encodeFeatureLogLine(renderFeatureLog));
409
+ log.info("bootstrap-game", encodeFeatureLogLine(renderFeatureLog));
195
410
 
196
- // 7. FPS polling (if onFpsUpdate provided)
411
+ // 7. FPS polling (if onFpsUpdate provided). unref so the interval can't
412
+ // pin the runtime after the window closes (packaged mode has no session
413
+ // tracker to clear it).
197
414
  if (opts.onFpsUpdate) {
198
415
  const fpsInterval = opts.fpsPollIntervalMs ?? 500;
199
- setInterval(() => {
416
+ const id = setInterval(() => {
200
417
  if (typeof renderer.getFPS === "function") {
201
418
  opts.onFpsUpdate!(renderer.getFPS());
202
419
  }
203
420
  }, fpsInterval);
421
+ (id as any)?.unref?.();
204
422
  }
205
423
 
206
424
  // 8. Display info wiring (if onDisplayInfo provided)
@@ -228,40 +446,49 @@ export async function bootstrapGame(opts: BootstrapGameOptions): Promise<void> {
228
446
  const intervalMs = autosaveOpts.intervalMs ?? 3000;
229
447
 
230
448
  try {
231
- const saved = await Promise.race([
449
+ // The inner race's timeout leg is session-tracked — teardown sweeps it
450
+ // unresolved — so the whole race is additionally raced against session
451
+ // teardown via importOrDead (returns null → bootAborted bails below).
452
+ const saved = await importOrDead(Promise.race([
232
453
  autosaveOpts.load(),
233
454
  new Promise<null>((r) => setTimeout(() => r(null), 5000)),
234
- ]);
455
+ ]), bootSession);
235
456
  if (saved && autosaveOpts.onLoad) {
236
457
  await autosaveOpts.onLoad(saved);
237
458
  }
238
459
  } catch (e) {
239
- log.warn("bootstrapGame", `Autosave load failed: ${e}`);
460
+ log.warn("bootstrap-game", `Autosave load failed: ${e}`);
240
461
  }
462
+ // A restart landing during the load await must not leave this dead
463
+ // generation's save interval registered into the NEXT live session.
464
+ if (bootAborted()) return;
241
465
 
242
466
  let saveInProgress = false;
243
- setInterval(async () => {
467
+ const id = setInterval(async () => {
244
468
  if (saveInProgress) return;
245
469
  saveInProgress = true;
246
470
  try {
247
471
  await autosaveOpts.save();
248
472
  } catch (e) {
249
- log.warn("bootstrapGame", `Autosave save failed: ${e}`);
473
+ log.warn("bootstrap-game", `Autosave save failed: ${e}`);
250
474
  } finally {
251
475
  saveInProgress = false;
252
476
  }
253
477
  }, intervalMs);
478
+ (id as any)?.unref?.();
254
479
  }
480
+ if (bootAborted()) return;
255
481
 
256
482
  // 10. MCP setup (if provided)
257
483
  if (opts.mcp) {
258
- await opts.mcp();
484
+ await importOrDead(Promise.resolve(opts.mcp()), bootSession);
259
485
  }
260
486
 
261
487
  // 11. Hot-reload dispose (if provided)
262
488
  if (opts.onHotReloadDispose) {
263
- const { dispose } = await import("./hooks");
264
- dispose(opts.onHotReloadDispose);
489
+ const hooksMod = await importOrDead(hooksP, bootSession);
490
+ if (!hooksMod) return;
491
+ hooksMod.dispose(opts.onHotReloadDispose);
265
492
  }
266
493
 
267
494
  // 12. Deterministic callbacks (if onDeterministic provided)
@@ -269,3 +496,52 @@ export async function bootstrapGame(opts: BootstrapGameOptions): Promise<void> {
269
496
  opts.onDeterministic(renderer);
270
497
  }
271
498
  }
499
+
500
+ /**
501
+ * Shared wiring for a live devtools frontend (Blitz dock or web host):
502
+ * engine-generic providers + thread evals derived from the devtools
503
+ * workerHosts entries ({prefix, proxy} — proxies exposing __devtoolsEval
504
+ * get a REPL target under their prefix name).
505
+ */
506
+ async function wireDevtoolsFrontend(
507
+ mirror: { registerProvider?: any; registerCommandHandler?: any },
508
+ host: { registerThreadEval: (n: string, fn: (e: string) => Promise<{ result?: unknown; error?: string }>) => void },
509
+ renderer: any,
510
+ workerHosts: any[] | undefined,
511
+ profilingSAB: SharedArrayBuffer | null,
512
+ inputInfo?: () => { key: string; value: string; flags?: number }[],
513
+ bootSession?: any,
514
+ ): Promise<void> {
515
+ const mod = await importOrDead(devtoolsLibP ?? import("@downdraft/engine/libraries/devtools"), bootSession);
516
+ // If the dev session died while the import was in flight, abandon the
517
+ // wiring — registering providers now would root the dead generation's
518
+ // context through persistent host closures.
519
+ if (!mod) return;
520
+ const { registerEngineProviders } = mod;
521
+ // Main-thread REPL evaluates directly in this context — Bun's inspector
522
+ // doesn't implement Runtime.evaluate, and a direct eval works on every
523
+ // runtime. Registered evals take precedence over the CDP fallback.
524
+ host.registerThreadEval("main", async (expr) => {
525
+ try {
526
+ return { result: (0, eval)(expr) };
527
+ } catch (e) {
528
+ return { error: e instanceof Error ? `${e.name}: ${e.message}` : String(e) };
529
+ }
530
+ });
531
+ const evalNames: string[] = ["main"];
532
+ for (const wh of workerHosts ?? []) {
533
+ const evalFn = wh?.proxy?.__devtoolsEval;
534
+ if (typeof evalFn === "function" && wh.prefix) {
535
+ host.registerThreadEval(wh.prefix, (expr) => evalFn.call(wh.proxy, expr));
536
+ evalNames.push(wh.prefix);
537
+ }
538
+ }
539
+ registerEngineProviders(mirror as any, {
540
+ renderer,
541
+ profilingSAB,
542
+ simProxy: workerHosts?.[0]?.proxy ?? undefined,
543
+ evalTargetNames: () => evalNames,
544
+ inputInfo,
545
+ });
546
+ }
547
+
@@ -88,6 +88,12 @@ export interface GameSimWorker {
88
88
  restoreFromState?(stateJson: string): Promise<void>;
89
89
  hotReload?(config: unknown, preserveState: boolean): Promise<void>;
90
90
  getDevToolsProxy?(): unknown;
91
+ /** Stop and terminate the worker. Entry points call this on window close —
92
+ * an unstopped worker's loop pins the runtime and the process never exits.
93
+ * Optional: bespoke workers without it leak-stop via `worker.unref()`. */
94
+ stop?(): Promise<void> | void;
95
+ /** Alias for stop() on some host implementations (BaseWorkerHost). */
96
+ shutdown?(): Promise<void> | void;
91
97
  }
92
98
 
93
99
  /** Optional seed passed to the sim worker factory. */
@@ -174,7 +180,7 @@ export function serializeRestorePayload(
174
180
  if (explicit) {
175
181
  const comp = components[explicit];
176
182
  if (!comp) {
177
- log.warn("startGame", `Save component "${explicit}" not found; available: ${Object.keys(components).join(", ")}`);
183
+ log.warn("start-game", `Save component "${explicit}" not found; available: ${Object.keys(components).join(", ")}`);
178
184
  return undefined;
179
185
  }
180
186
  return JSON.stringify(comp.data);
@@ -474,6 +480,18 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
474
480
  const isDev = !!(downdraft?.isDev) || isDevMode;
475
481
  const hasSim = !!module.sim;
476
482
 
483
+ // Dev-session guard: capture the session snapshot this boot belongs to.
484
+ // If an HMR restart lands while a boot-stage await below is suspended, the
485
+ // continuation belongs to a dead generation — and the tracker by then may
486
+ // already host the NEXT session, which would happily track this dead gen's
487
+ // listeners/timers (pinning its whole module graph for a generation). Bail
488
+ // instead. No tracker → production mode → never aborts.
489
+ const ddTracker = (globalThis as any).__ddSession;
490
+ const bootSession = ddTracker?.session ?? null;
491
+ const sessionAborted = () =>
492
+ (!!ddTracker && (ddTracker.session !== bootSession || !bootSession || bootSession.dead))
493
+ || typeof (globalThis as any).window === "undefined";
494
+
477
495
  // 0. Resolve the render surface (NativeSurface on the native runtime)
478
496
  const surface = getSurface(module.canvasLayer ?? 0);
479
497
 
@@ -515,7 +533,7 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
515
533
  // If libraries declared, pass the library-allocated SABs to the sim
516
534
  // factory via a seed object so the sim can share them zero-copy.
517
535
  const simSeed = Object.keys(libBuffers).length > 0 ? { libraryBuffers: libBuffers } : undefined;
518
- const simWorker = hasSim ? module.sim!(simSeed as any) : null;
536
+ const simWorker = hasSim ? module.sim!(simSeed) : null;
519
537
  const simSAB = simWorker?.getSimBuffer();
520
538
  const inputSAB = simWorker?.getInputBuffer();
521
539
  const extraBuffers = simWorker?.getExtraBuffers?.() ?? {};
@@ -542,6 +560,9 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
542
560
  // 3b. Merge library SABs into extraBuffers + store host on ctx
543
561
  if (libHost) {
544
562
  for (const [name, sab] of Object.entries(libBuffers)) {
563
+ if (name in ctx.extraBuffers) {
564
+ log.warn("start-game", `library SAB channel "${name}" shadows a same-named sim extra buffer in ctx.extraBuffers`);
565
+ }
545
566
  ctx.extraBuffers[name] = sab;
546
567
  }
547
568
  ctx.libraryHost = libHost;
@@ -578,10 +599,10 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
578
599
  try {
579
600
  handler(msg.data, ctx);
580
601
  } catch (err) {
581
- log.error("startGame", `Event handler error for "${msg.kind}": ${err}`);
602
+ log.error("start-game", `Event handler error for "${msg.kind}": ${err}`);
582
603
  }
583
604
  } else if (isDev && !ENGINE_EMITTED_EVENT_KINDS.has(msg.kind)) {
584
- log.warn("startGame", `Unhandled sim event kind: "${msg.kind}"`);
605
+ log.warn("start-game", `Unhandled sim event kind: "${msg.kind}"`);
585
606
  }
586
607
  });
587
608
  };
@@ -590,6 +611,7 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
590
611
  // 5. Run onBeforeInit hook
591
612
  if (module.onBeforeInit) {
592
613
  await module.onBeforeInit(ctx);
614
+ if (sessionAborted()) return;
593
615
  }
594
616
 
595
617
  // 6. Initialize save store (if configured) — for non-inline modes this
@@ -623,9 +645,10 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
623
645
  : resolvedMode === "worker" ? "worker" : "host";
624
646
  }
625
647
  } catch (e) {
626
- log.warn("startGame", `Save store init failed, falling back to host bridge: ${e}`);
648
+ log.warn("start-game", `Save store init failed, falling back to host bridge: ${e}`);
627
649
  ctx.saveMode = "host";
628
650
  }
651
+ if (sessionAborted()) return;
629
652
  }
630
653
 
631
654
  // 6b. Mode-aware save/load helpers — exposed on ctx so games can trigger manual
@@ -667,7 +690,7 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
667
690
  }
668
691
  return result?.success ?? false;
669
692
  } catch (e) {
670
- log.error("startGame", `Manual save failed: ${e}`);
693
+ log.error("start-game", `Manual save failed: ${e}`);
671
694
  return false;
672
695
  }
673
696
  };
@@ -737,12 +760,27 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
737
760
  }
738
761
  return null;
739
762
  } catch (e) {
740
- log.error("startGame", `Manual load failed: ${e}`);
763
+ log.error("start-game", `Manual load failed: ${e}`);
741
764
  return null;
742
765
  }
743
766
  };
744
767
  }
745
768
 
769
+ // 6c. Kick the default sim start early — `simWorker.start()` spawns the
770
+ // worker + sends init config and doesn't touch renderer state, so it
771
+ // can overlap renderer.init() instead of serializing behind it inside
772
+ // onRendererInit. `onInit` overrides own sim start entirely (e.g.
773
+ // to-the-ocean's Promise.all); `onSimStart` overrides stay deferred
774
+ // since they may depend on post-init ctx state; renderer-owned workers
775
+ // (simFromRenderer) are untouched.
776
+ let simStartPromise: Promise<void> | null = null;
777
+ if (simWorker && !module.onInit && !module.onSimStart) {
778
+ simStartPromise = Promise.resolve(simWorker.start(module.simConfig ?? {}));
779
+ // Mark handled now — the real await (which re-throws on failure) happens
780
+ // at the original join point inside onRendererInit.
781
+ simStartPromise.catch(() => {});
782
+ }
783
+
746
784
  // 7. Delegate to bootstrapGame() for the standard sequence
747
785
  await bootstrapGame({
748
786
  canvasLayer: module.canvasLayer,
@@ -764,6 +802,9 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
764
802
  const device = r.getDevice?.();
765
803
  const format = r.getFormat?.();
766
804
  const moduleHost = r.getRendererModuleHost?.();
805
+ if (!moduleHost) {
806
+ log.warn("start-game", "renderer does not expose getRendererModuleHost() — EngineLibrary DI provides will be silently dropped");
807
+ }
767
808
  const libProvide = (token: any, value: unknown) => {
768
809
  if (moduleHost) moduleHost.provideExternal("library", token, value);
769
810
  };
@@ -779,7 +820,7 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
779
820
  // GPU-pass library init (after device is ready).
780
821
  if (device && format) {
781
822
  libHost.initRenderer({ device, format, provide: libProvide, inject: libInject, injectOptional: libInjectOptional });
782
- libHost.setRendererBuffers(libBuffers);
823
+ libHost.setRendererBuffers(libBuffers, { provide: libProvide });
783
824
  }
784
825
  }
785
826
 
@@ -804,8 +845,9 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
804
845
  wireSimEvents(owned);
805
846
  }
806
847
  } catch (e) {
807
- log.warn("startGame", `simFromRenderer resolution failed: ${e}`);
848
+ log.warn("start-game", `simFromRenderer resolution failed: ${e}`);
808
849
  }
850
+ if (sessionAborted()) return;
809
851
  }
810
852
 
811
853
  // ── Sim worker start ──
@@ -817,9 +859,12 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
817
859
  if (simWorker && !module.onInit) {
818
860
  if (module.onSimStart) {
819
861
  await module.onSimStart(ctx);
862
+ } else if (simStartPromise) {
863
+ await simStartPromise;
820
864
  } else {
821
865
  await simWorker.start(module.simConfig ?? {});
822
866
  }
867
+ if (sessionAborted()) return;
823
868
  }
824
869
 
825
870
  // ── Inline save store init (sim-worker + OPFS) ──
@@ -833,9 +878,10 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
833
878
  maxGenerations: module.save.maxGenerations ?? 3,
834
879
  });
835
880
  } catch (e) {
836
- log.warn("startGame", `Inline save store init failed, falling back to host save store: ${e}`);
881
+ log.warn("start-game", `Inline save store init failed, falling back to host save store: ${e}`);
837
882
  ctx.saveMode = "host";
838
883
  }
884
+ if (sessionAborted()) return;
839
885
  }
840
886
 
841
887
  // ── Plugin loading ──
@@ -854,8 +900,9 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
854
900
  if (mh) pluginHost.setModuleHost(mh);
855
901
  await pluginHost.loadAll();
856
902
  } catch (e) {
857
- log.warn("startGame", `Plugin loading error: ${e}`);
903
+ log.warn("start-game", `Plugin loading error: ${e}`);
858
904
  }
905
+ if (sessionAborted()) return;
859
906
  }
860
907
 
861
908
  // ── Declarative UI lifecycle ──
@@ -867,9 +914,10 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
867
914
  await ctx.ui.start();
868
915
  } catch (e) {
869
916
  // UI failure is non-fatal — the game canvas still runs.
870
- log.error("startGame", `UI start failed: ${e}`);
917
+ log.error("start-game", `UI start failed: ${e}`);
871
918
  ctx.ui = undefined;
872
919
  }
920
+ if (sessionAborted()) return;
873
921
  }
874
922
 
875
923
  // ── Game-specific wiring ──