@forgeax/engine-app 0.0.0-dev.8d955ade1c79

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 (348) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +424 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/__tests__/animation-asset-lookup.unit.test.d.ts +2 -0
  5. package/dist/__tests__/animation-asset-lookup.unit.test.d.ts.map +1 -0
  6. package/dist/__tests__/callback-deletion.unit.test.d.ts +2 -0
  7. package/dist/__tests__/callback-deletion.unit.test.d.ts.map +1 -0
  8. package/dist/__tests__/callback-inference.test-d.d.ts +2 -0
  9. package/dist/__tests__/callback-inference.test-d.d.ts.map +1 -0
  10. package/dist/__tests__/component-introspection.unit.test.d.ts +2 -0
  11. package/dist/__tests__/component-introspection.unit.test.d.ts.map +1 -0
  12. package/dist/__tests__/consumer-migration.unit.test.d.ts +2 -0
  13. package/dist/__tests__/consumer-migration.unit.test.d.ts.map +1 -0
  14. package/dist/__tests__/create-app-error-retention.integration.test.d.ts +2 -0
  15. package/dist/__tests__/create-app-error-retention.integration.test.d.ts.map +1 -0
  16. package/dist/__tests__/create-app-features.test.d.ts +2 -0
  17. package/dist/__tests__/create-app-features.test.d.ts.map +1 -0
  18. package/dist/__tests__/create-app-listener-sync.test.d.ts +2 -0
  19. package/dist/__tests__/create-app-listener-sync.test.d.ts.map +1 -0
  20. package/dist/__tests__/create-app-lock-provider.test.d.ts +2 -0
  21. package/dist/__tests__/create-app-lock-provider.test.d.ts.map +1 -0
  22. package/dist/__tests__/create-app-physics-plugin-failure.integration.test.d.ts +2 -0
  23. package/dist/__tests__/create-app-physics-plugin-failure.integration.test.d.ts.map +1 -0
  24. package/dist/__tests__/create-app-plugin.test.d.ts +2 -0
  25. package/dist/__tests__/create-app-plugin.test.d.ts.map +1 -0
  26. package/dist/__tests__/create-app-stop.test.d.ts +2 -0
  27. package/dist/__tests__/create-app-stop.test.d.ts.map +1 -0
  28. package/dist/__tests__/create-app-time.unit.test.d.ts +2 -0
  29. package/dist/__tests__/create-app-time.unit.test.d.ts.map +1 -0
  30. package/dist/__tests__/create-app.test-d.d.ts +2 -0
  31. package/dist/__tests__/create-app.test-d.d.ts.map +1 -0
  32. package/dist/__tests__/create-app.test.d.ts +2 -0
  33. package/dist/__tests__/create-app.test.d.ts.map +1 -0
  34. package/dist/__tests__/create-renderer-error.integration.test.d.ts +2 -0
  35. package/dist/__tests__/create-renderer-error.integration.test.d.ts.map +1 -0
  36. package/dist/__tests__/create-renderer-lifecycle.integration.test.d.ts +2 -0
  37. package/dist/__tests__/create-renderer-lifecycle.integration.test.d.ts.map +1 -0
  38. package/dist/__tests__/docs-gate-green.unit.test.d.ts +2 -0
  39. package/dist/__tests__/docs-gate-green.unit.test.d.ts.map +1 -0
  40. package/dist/__tests__/draw-source-injected-world-update-visibility.test.d.ts +2 -0
  41. package/dist/__tests__/draw-source-injected-world-update-visibility.test.d.ts.map +1 -0
  42. package/dist/__tests__/draw-source-single-world-regression.test.d.ts +2 -0
  43. package/dist/__tests__/draw-source-single-world-regression.test.d.ts.map +1 -0
  44. package/dist/__tests__/engine-worker-bootstrap-channel.unit.test.d.ts +2 -0
  45. package/dist/__tests__/engine-worker-bootstrap-channel.unit.test.d.ts.map +1 -0
  46. package/dist/__tests__/engine-worker-world-swap.unit.test.d.ts +2 -0
  47. package/dist/__tests__/engine-worker-world-swap.unit.test.d.ts.map +1 -0
  48. package/dist/__tests__/errors-pointer-lock-failed.test.d.ts +2 -0
  49. package/dist/__tests__/errors-pointer-lock-failed.test.d.ts.map +1 -0
  50. package/dist/__tests__/execution-bootstrap-isolation.unit.test.d.ts +2 -0
  51. package/dist/__tests__/execution-bootstrap-isolation.unit.test.d.ts.map +1 -0
  52. package/dist/__tests__/execution-error-detail.test-d.d.ts +2 -0
  53. package/dist/__tests__/execution-error-detail.test-d.d.ts.map +1 -0
  54. package/dist/__tests__/execution-error-detail.unit.test.d.ts +2 -0
  55. package/dist/__tests__/execution-error-detail.unit.test.d.ts.map +1 -0
  56. package/dist/__tests__/execution-frame-order.unit.test.d.ts +2 -0
  57. package/dist/__tests__/execution-frame-order.unit.test.d.ts.map +1 -0
  58. package/dist/__tests__/execution-frame-protocol.unit.test.d.ts +2 -0
  59. package/dist/__tests__/execution-frame-protocol.unit.test.d.ts.map +1 -0
  60. package/dist/__tests__/execution-input-sample.contract.test.d.ts +2 -0
  61. package/dist/__tests__/execution-input-sample.contract.test.d.ts.map +1 -0
  62. package/dist/__tests__/execution-measurement.unit.test.d.ts +2 -0
  63. package/dist/__tests__/execution-measurement.unit.test.d.ts.map +1 -0
  64. package/dist/__tests__/execution-public-api.test-d.d.ts +2 -0
  65. package/dist/__tests__/execution-public-api.test-d.d.ts.map +1 -0
  66. package/dist/__tests__/execution-public-api.unit.test.d.ts +2 -0
  67. package/dist/__tests__/execution-public-api.unit.test.d.ts.map +1 -0
  68. package/dist/__tests__/execution-rebuild.contract.test.d.ts +2 -0
  69. package/dist/__tests__/execution-rebuild.contract.test.d.ts.map +1 -0
  70. package/dist/__tests__/execution-report.contract.test.d.ts +2 -0
  71. package/dist/__tests__/execution-report.contract.test.d.ts.map +1 -0
  72. package/dist/__tests__/execution-report.types.test-d.d.ts +2 -0
  73. package/dist/__tests__/execution-report.types.test-d.d.ts.map +1 -0
  74. package/dist/__tests__/execution-schema-freshness.unit.test.d.ts +2 -0
  75. package/dist/__tests__/execution-schema-freshness.unit.test.d.ts.map +1 -0
  76. package/dist/__tests__/execution-selector.unit.test.d.ts +2 -0
  77. package/dist/__tests__/execution-selector.unit.test.d.ts.map +1 -0
  78. package/dist/__tests__/execution-shared-kernel.unit.test.d.ts +2 -0
  79. package/dist/__tests__/execution-shared-kernel.unit.test.d.ts.map +1 -0
  80. package/dist/__tests__/fallback-camera.unit.test.d.ts +2 -0
  81. package/dist/__tests__/fallback-camera.unit.test.d.ts.map +1 -0
  82. package/dist/__tests__/frame-loop-time-elapsed.test.d.ts +2 -0
  83. package/dist/__tests__/frame-loop-time-elapsed.test.d.ts.map +1 -0
  84. package/dist/__tests__/frame-loop-time.unit.test.d.ts +2 -0
  85. package/dist/__tests__/frame-loop-time.unit.test.d.ts.map +1 -0
  86. package/dist/__tests__/frame-loop-world-array.test.d.ts +2 -0
  87. package/dist/__tests__/frame-loop-world-array.test.d.ts.map +1 -0
  88. package/dist/__tests__/kernel-worker-runtime.unit.test.d.ts +2 -0
  89. package/dist/__tests__/kernel-worker-runtime.unit.test.d.ts.map +1 -0
  90. package/dist/__tests__/migration-surface-inventory.unit.test.d.ts +2 -0
  91. package/dist/__tests__/migration-surface-inventory.unit.test.d.ts.map +1 -0
  92. package/dist/__tests__/plugin-policy.integration.test.d.ts +2 -0
  93. package/dist/__tests__/plugin-policy.integration.test.d.ts.map +1 -0
  94. package/dist/__tests__/plugin-profiles.unit.test.d.ts +2 -0
  95. package/dist/__tests__/plugin-profiles.unit.test.d.ts.map +1 -0
  96. package/dist/__tests__/profiler-default-off.test.d.ts +2 -0
  97. package/dist/__tests__/profiler-default-off.test.d.ts.map +1 -0
  98. package/dist/__tests__/profiler-frame-token.test.d.ts +2 -0
  99. package/dist/__tests__/profiler-frame-token.test.d.ts.map +1 -0
  100. package/dist/__tests__/profiler-phase-catalog.test.d.ts +2 -0
  101. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +1 -0
  102. package/dist/__tests__/profiler-phase-integration.test.d.ts +2 -0
  103. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +1 -0
  104. package/dist/__tests__/profiler-remote-bridge.test.d.ts +2 -0
  105. package/dist/__tests__/profiler-remote-bridge.test.d.ts.map +1 -0
  106. package/dist/__tests__/remote-integration.test.d.ts +2 -0
  107. package/dist/__tests__/remote-integration.test.d.ts.map +1 -0
  108. package/dist/__tests__/rhi-capture-capability.test-d.d.ts +2 -0
  109. package/dist/__tests__/rhi-capture-capability.test-d.d.ts.map +1 -0
  110. package/dist/__tests__/rhi-capture-host.integration.test.d.ts +2 -0
  111. package/dist/__tests__/rhi-capture-host.integration.test.d.ts.map +1 -0
  112. package/dist/__tests__/rhi-capture.browser.test.d.ts +2 -0
  113. package/dist/__tests__/rhi-capture.browser.test.d.ts.map +1 -0
  114. package/dist/__tests__/surface-handoff.test.d.ts +2 -0
  115. package/dist/__tests__/surface-handoff.test.d.ts.map +1 -0
  116. package/dist/__tests__/types-m2.test-d.d.ts +2 -0
  117. package/dist/__tests__/types-m2.test-d.d.ts.map +1 -0
  118. package/dist/__tests__/visibility-remote.integration.test.d.ts +2 -0
  119. package/dist/__tests__/visibility-remote.integration.test.d.ts.map +1 -0
  120. package/dist/__tests__/worker-execution-stop.test.d.ts +2 -0
  121. package/dist/__tests__/worker-execution-stop.test.d.ts.map +1 -0
  122. package/dist/animation-asset-lookup.d.ts +7 -0
  123. package/dist/animation-asset-lookup.d.ts.map +1 -0
  124. package/dist/browser-frame-signal.d.ts +17 -0
  125. package/dist/browser-frame-signal.d.ts.map +1 -0
  126. package/dist/canvas-policy.d.ts +4 -0
  127. package/dist/canvas-policy.d.ts.map +1 -0
  128. package/dist/create-app.d.ts +78 -0
  129. package/dist/create-app.d.ts.map +1 -0
  130. package/dist/engine-worker-runtime.mjs +827 -0
  131. package/dist/engine-worker-runtime.mjs.map +1 -0
  132. package/dist/errors.d.ts +254 -0
  133. package/dist/errors.d.ts.map +1 -0
  134. package/dist/execution/attached-world-swap.d.ts +10 -0
  135. package/dist/execution/attached-world-swap.d.ts.map +1 -0
  136. package/dist/execution/bootstrap-entry.d.ts +30 -0
  137. package/dist/execution/bootstrap-entry.d.ts.map +1 -0
  138. package/dist/execution/bootstrap-url.d.ts +5 -0
  139. package/dist/execution/bootstrap-url.d.ts.map +1 -0
  140. package/dist/execution/capabilities.d.ts +5 -0
  141. package/dist/execution/capabilities.d.ts.map +1 -0
  142. package/dist/execution/control.d.ts +12 -0
  143. package/dist/execution/control.d.ts.map +1 -0
  144. package/dist/execution/engine-worker-runtime.d.ts +2 -0
  145. package/dist/execution/engine-worker-runtime.d.ts.map +1 -0
  146. package/dist/execution/engine-worker.d.ts +24 -0
  147. package/dist/execution/engine-worker.d.ts.map +1 -0
  148. package/dist/execution/host-controller.d.ts +16 -0
  149. package/dist/execution/host-controller.d.ts.map +1 -0
  150. package/dist/execution/index.d.ts +10 -0
  151. package/dist/execution/index.d.ts.map +1 -0
  152. package/dist/execution/kernel-pool.d.ts +14 -0
  153. package/dist/execution/kernel-pool.d.ts.map +1 -0
  154. package/dist/execution/kernel-worker-runtime.d.ts +2 -0
  155. package/dist/execution/kernel-worker-runtime.d.ts.map +1 -0
  156. package/dist/execution/measurement.d.ts +7 -0
  157. package/dist/execution/measurement.d.ts.map +1 -0
  158. package/dist/execution/protocol.d.ts +87 -0
  159. package/dist/execution/protocol.d.ts.map +1 -0
  160. package/dist/execution/report.d.ts +5 -0
  161. package/dist/execution/report.d.ts.map +1 -0
  162. package/dist/execution/schema.d.ts +4 -0
  163. package/dist/execution/schema.d.ts.map +1 -0
  164. package/dist/execution/selector.d.ts +10 -0
  165. package/dist/execution/selector.d.ts.map +1 -0
  166. package/dist/execution/types.d.ts +123 -0
  167. package/dist/execution/types.d.ts.map +1 -0
  168. package/dist/fallback-camera.d.ts +8 -0
  169. package/dist/fallback-camera.d.ts.map +1 -0
  170. package/dist/game-context.d.ts +98 -0
  171. package/dist/game-context.d.ts.map +1 -0
  172. package/dist/index.d.ts +27 -0
  173. package/dist/index.d.ts.map +1 -0
  174. package/dist/index.mjs +3980 -0
  175. package/dist/index.mjs.map +1 -0
  176. package/dist/input-map-plugin.d.ts +5 -0
  177. package/dist/input-map-plugin.d.ts.map +1 -0
  178. package/dist/input-plugin.d.ts +4 -0
  179. package/dist/input-plugin.d.ts.map +1 -0
  180. package/dist/internal/assembled-engine-profile.d.ts +5 -0
  181. package/dist/internal/assembled-engine-profile.d.ts.map +1 -0
  182. package/dist/internal/assets-world-plugin.d.ts +7 -0
  183. package/dist/internal/assets-world-plugin.d.ts.map +1 -0
  184. package/dist/internal/browser-remote-bridge.d.ts +24 -0
  185. package/dist/internal/browser-remote-bridge.d.ts.map +1 -0
  186. package/dist/internal/browser-rhi-debug-runtime.d.ts +18 -0
  187. package/dist/internal/browser-rhi-debug-runtime.d.ts.map +1 -0
  188. package/dist/internal/component-introspection.d.ts +24 -0
  189. package/dist/internal/component-introspection.d.ts.map +1 -0
  190. package/dist/internal/debug-draw.d.ts +9 -0
  191. package/dist/internal/debug-draw.d.ts.map +1 -0
  192. package/dist/internal/ecs-import.d.ts +6 -0
  193. package/dist/internal/ecs-import.d.ts.map +1 -0
  194. package/dist/internal/engine-profile-common.d.ts +9 -0
  195. package/dist/internal/engine-profile-common.d.ts.map +1 -0
  196. package/dist/internal/error-fanout.d.ts +66 -0
  197. package/dist/internal/error-fanout.d.ts.map +1 -0
  198. package/dist/internal/frame-loop.d.ts +38 -0
  199. package/dist/internal/frame-loop.d.ts.map +1 -0
  200. package/dist/internal/input-attach.d.ts +44 -0
  201. package/dist/internal/input-attach.d.ts.map +1 -0
  202. package/dist/internal/main-engine-profile.d.ts +19 -0
  203. package/dist/internal/main-engine-profile.d.ts.map +1 -0
  204. package/dist/internal/remote-serve-flag.d.ts +19 -0
  205. package/dist/internal/remote-serve-flag.d.ts.map +1 -0
  206. package/dist/internal/remote-server-plugin.d.ts +8 -0
  207. package/dist/internal/remote-server-plugin.d.ts.map +1 -0
  208. package/dist/internal/rhi-capture.d.ts +19 -0
  209. package/dist/internal/rhi-capture.d.ts.map +1 -0
  210. package/dist/internal/rhi-debug-flag.d.ts +18 -0
  211. package/dist/internal/rhi-debug-flag.d.ts.map +1 -0
  212. package/dist/internal/worker-engine-profile.d.ts +15 -0
  213. package/dist/internal/worker-engine-profile.d.ts.map +1 -0
  214. package/dist/kernel-worker-runtime.mjs +69 -0
  215. package/dist/kernel-worker-runtime.mjs.map +1 -0
  216. package/dist/load-game-errors.d.ts +131 -0
  217. package/dist/load-game-errors.d.ts.map +1 -0
  218. package/dist/load-game.d.ts +34 -0
  219. package/dist/load-game.d.ts.map +1 -0
  220. package/dist/plugin-factories.d.ts +3 -0
  221. package/dist/plugin-factories.d.ts.map +1 -0
  222. package/dist/renderer-plugin.d.ts +25 -0
  223. package/dist/renderer-plugin.d.ts.map +1 -0
  224. package/dist/tool-preview/bootstrap.d.ts +113 -0
  225. package/dist/tool-preview/bootstrap.d.ts.map +1 -0
  226. package/dist/tool-preview/evidence.d.ts +20 -0
  227. package/dist/tool-preview/evidence.d.ts.map +1 -0
  228. package/dist/tool-preview/framing.d.ts +13 -0
  229. package/dist/tool-preview/framing.d.ts.map +1 -0
  230. package/dist/tool-preview/recipe.d.ts +54 -0
  231. package/dist/tool-preview/recipe.d.ts.map +1 -0
  232. package/dist/types.d.ts +404 -0
  233. package/dist/types.d.ts.map +1 -0
  234. package/package.json +85 -0
  235. package/schema/execution-report.schema.json +168 -0
  236. package/src/__tests__/animation-asset-lookup.unit.test.ts +20 -0
  237. package/src/__tests__/callback-deletion.unit.test.ts +14 -0
  238. package/src/__tests__/callback-inference.test-d.ts +36 -0
  239. package/src/__tests__/component-introspection.unit.test.ts +56 -0
  240. package/src/__tests__/consumer-migration.unit.test.ts +34 -0
  241. package/src/__tests__/create-app-error-retention.integration.test.ts +125 -0
  242. package/src/__tests__/create-app-features.test.ts +51 -0
  243. package/src/__tests__/create-app-listener-sync.test.ts +381 -0
  244. package/src/__tests__/create-app-lock-provider.test.ts +212 -0
  245. package/src/__tests__/create-app-physics-plugin-failure.integration.test.ts +142 -0
  246. package/src/__tests__/create-app-plugin.test.ts +217 -0
  247. package/src/__tests__/create-app-stop.test.ts +609 -0
  248. package/src/__tests__/create-app-time.unit.test.ts +26 -0
  249. package/src/__tests__/create-app.test-d.ts +83 -0
  250. package/src/__tests__/create-app.test.ts +287 -0
  251. package/src/__tests__/create-renderer-error.integration.test.ts +25 -0
  252. package/src/__tests__/create-renderer-lifecycle.integration.test.ts +24 -0
  253. package/src/__tests__/docs-gate-green.unit.test.ts +61 -0
  254. package/src/__tests__/draw-source-injected-world-update-visibility.test.ts +176 -0
  255. package/src/__tests__/draw-source-single-world-regression.test.ts +184 -0
  256. package/src/__tests__/engine-worker-bootstrap-channel.unit.test.ts +82 -0
  257. package/src/__tests__/engine-worker-world-swap.unit.test.ts +69 -0
  258. package/src/__tests__/errors-pointer-lock-failed.test.ts +265 -0
  259. package/src/__tests__/execution-bootstrap-isolation.unit.test.ts +79 -0
  260. package/src/__tests__/execution-error-detail.test-d.ts +13 -0
  261. package/src/__tests__/execution-error-detail.unit.test.ts +35 -0
  262. package/src/__tests__/execution-frame-order.unit.test.ts +38 -0
  263. package/src/__tests__/execution-frame-protocol.unit.test.ts +60 -0
  264. package/src/__tests__/execution-input-sample.contract.test.ts +23 -0
  265. package/src/__tests__/execution-measurement.unit.test.ts +20 -0
  266. package/src/__tests__/execution-public-api.test-d.ts +14 -0
  267. package/src/__tests__/execution-public-api.unit.test.ts +9 -0
  268. package/src/__tests__/execution-rebuild.contract.test.ts +36 -0
  269. package/src/__tests__/execution-report.contract.test.ts +50 -0
  270. package/src/__tests__/execution-report.types.test-d.ts +16 -0
  271. package/src/__tests__/execution-schema-freshness.unit.test.ts +20 -0
  272. package/src/__tests__/execution-selector.unit.test.ts +72 -0
  273. package/src/__tests__/execution-shared-kernel.unit.test.ts +180 -0
  274. package/src/__tests__/fallback-camera.unit.test.ts +32 -0
  275. package/src/__tests__/frame-loop-time-elapsed.test.ts +115 -0
  276. package/src/__tests__/frame-loop-time.unit.test.ts +61 -0
  277. package/src/__tests__/frame-loop-world-array.test.ts +450 -0
  278. package/src/__tests__/kernel-worker-runtime.unit.test.ts +50 -0
  279. package/src/__tests__/migration-surface-inventory.unit.test.ts +13 -0
  280. package/src/__tests__/plugin-policy.integration.test.ts +15 -0
  281. package/src/__tests__/plugin-profiles.unit.test.ts +190 -0
  282. package/src/__tests__/profiler-default-off.test.ts +53 -0
  283. package/src/__tests__/profiler-frame-token.test.ts +235 -0
  284. package/src/__tests__/profiler-phase-catalog.test.ts +30 -0
  285. package/src/__tests__/profiler-phase-integration.test.ts +117 -0
  286. package/src/__tests__/profiler-remote-bridge.test.ts +31 -0
  287. package/src/__tests__/remote-integration.test.ts +224 -0
  288. package/src/__tests__/rhi-capture-capability.test-d.ts +22 -0
  289. package/src/__tests__/rhi-capture-host.integration.test.ts +157 -0
  290. package/src/__tests__/rhi-capture.browser.test.ts +51 -0
  291. package/src/__tests__/surface-handoff.test.ts +89 -0
  292. package/src/__tests__/types-m2.test-d.ts +81 -0
  293. package/src/__tests__/visibility-remote.integration.test.ts +116 -0
  294. package/src/__tests__/worker-execution-stop.test.ts +173 -0
  295. package/src/animation-asset-lookup.ts +13 -0
  296. package/src/browser-frame-signal.ts +44 -0
  297. package/src/canvas-policy.ts +16 -0
  298. package/src/create-app.ts +1264 -0
  299. package/src/errors.ts +442 -0
  300. package/src/execution/attached-world-swap.ts +33 -0
  301. package/src/execution/bootstrap-entry.ts +122 -0
  302. package/src/execution/bootstrap-url.ts +25 -0
  303. package/src/execution/capabilities.ts +102 -0
  304. package/src/execution/control.ts +48 -0
  305. package/src/execution/engine-worker-runtime.ts +383 -0
  306. package/src/execution/engine-worker.ts +163 -0
  307. package/src/execution/host-controller.ts +460 -0
  308. package/src/execution/index.ts +44 -0
  309. package/src/execution/kernel-pool.ts +236 -0
  310. package/src/execution/kernel-worker-runtime.ts +103 -0
  311. package/src/execution/measurement.ts +39 -0
  312. package/src/execution/protocol.ts +134 -0
  313. package/src/execution/report.ts +66 -0
  314. package/src/execution/schema.ts +168 -0
  315. package/src/execution/selector.ts +98 -0
  316. package/src/execution/types.ts +163 -0
  317. package/src/fallback-camera.ts +20 -0
  318. package/src/game-context.ts +126 -0
  319. package/src/index.ts +190 -0
  320. package/src/input-map-plugin.ts +21 -0
  321. package/src/input-plugin.ts +26 -0
  322. package/src/internal/assembled-engine-profile.ts +14 -0
  323. package/src/internal/assets-world-plugin.ts +33 -0
  324. package/src/internal/browser-remote-bridge.ts +269 -0
  325. package/src/internal/browser-rhi-debug-runtime.ts +67 -0
  326. package/src/internal/component-introspection.ts +116 -0
  327. package/src/internal/debug-draw.ts +38 -0
  328. package/src/internal/ecs-import.ts +41 -0
  329. package/src/internal/engine-profile-common.ts +9 -0
  330. package/src/internal/error-fanout.ts +129 -0
  331. package/src/internal/frame-loop.ts +539 -0
  332. package/src/internal/input-attach.ts +104 -0
  333. package/src/internal/main-engine-profile.ts +84 -0
  334. package/src/internal/remote-serve-flag.ts +41 -0
  335. package/src/internal/remote-server-plugin.ts +16 -0
  336. package/src/internal/rhi-capture.ts +211 -0
  337. package/src/internal/rhi-debug-flag.ts +40 -0
  338. package/src/internal/worker-engine-profile.ts +47 -0
  339. package/src/load-game-errors.ts +211 -0
  340. package/src/load-game.ts +115 -0
  341. package/src/plugin-factories.ts +2 -0
  342. package/src/renderer-plugin.ts +96 -0
  343. package/src/tool-preview/bootstrap.ts +835 -0
  344. package/src/tool-preview/evidence.ts +59 -0
  345. package/src/tool-preview/framing.ts +52 -0
  346. package/src/tool-preview/recipe.ts +137 -0
  347. package/src/types.ts +450 -0
  348. package/src/vite-env.d.ts +10 -0
@@ -0,0 +1,20 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createAnimationPayloadLookup } from '../animation-asset-lookup';
3
+
4
+ describe('createAnimationPayloadLookup', () => {
5
+ it('projects the renderer catalogue lookup into the animation callback', () => {
6
+ const clip = { kind: 'animation-clip' as const, duration: 2, channels: [] };
7
+ const lookup = createAnimationPayloadLookup({
8
+ lookup<T>(guid: string): T | undefined {
9
+ return (guid === 'clip-guid' ? clip : undefined) as T | undefined;
10
+ },
11
+ });
12
+
13
+ expect(lookup('clip-guid')).toBe(clip);
14
+ expect(lookup('missing')).toBeUndefined();
15
+ });
16
+
17
+ it('fails closed before a renderer catalogue exists', () => {
18
+ expect(createAnimationPayloadLookup(undefined)('clip-guid')).toBeUndefined();
19
+ });
20
+ });
@@ -0,0 +1,14 @@
1
+ import { describe, expectTypeOf, it } from 'vitest';
2
+ import type { GameHost } from '../game-context';
3
+ import type { App, AppAssembleArgs, CreateAppOptions } from '../types';
4
+
5
+ describe('app callback and phantom surface deletion', () => {
6
+ it('omits callbacks and phantom scheduling fields from public app contracts', () => {
7
+ expectTypeOf<App>().not.toHaveProperty('registerUpdate');
8
+ expectTypeOf<GameHost>().not.toHaveProperty('registerUpdate');
9
+ expectTypeOf<AppAssembleArgs>().not.toHaveProperty('schedule');
10
+ expectTypeOf<AppAssembleArgs>().not.toHaveProperty('maxDt');
11
+ expectTypeOf<CreateAppOptions>().not.toHaveProperty('schedule');
12
+ expectTypeOf<CreateAppOptions>().not.toHaveProperty('maxDt');
13
+ });
14
+ });
@@ -0,0 +1,36 @@
1
+ import { animationPlugin } from '@forgeax/engine-animation';
2
+ import { World } from '@forgeax/engine-ecs';
3
+ import type { Plugin } from '@forgeax/engine-plugin';
4
+ import { Camera, perspective, type Renderer } from '@forgeax/engine-render';
5
+ import { createRenderer } from '@forgeax/engine-runtime';
6
+ import { createApp } from '../create-app';
7
+
8
+ const plugin: Plugin = animationPlugin();
9
+ void plugin;
10
+
11
+ declare const canvas: HTMLCanvasElement;
12
+ declare const renderer: Renderer;
13
+
14
+ const world = new World();
15
+ const cameraEntity = world
16
+ .spawn({ component: Camera, data: perspective({ fov: 1, aspect: 1 }) })
17
+ .unwrap();
18
+ const camera = world.get(cameraEntity, Camera).unwrap();
19
+ camera.projection;
20
+ const appResult = createApp({ renderer, world, plugins: [plugin] });
21
+ appResult.then((result) => {
22
+ if (result.ok) {
23
+ result.value.start();
24
+ }
25
+ });
26
+
27
+ createRenderer(canvas).then((created) => {
28
+ if (!created.ok) return;
29
+ const attached = created.value.attach(world);
30
+ if (!attached.ok) return;
31
+ void created.value.draw({
32
+ leases: [attached.value],
33
+ camera: { lease: attached.value },
34
+ environment: { lease: attached.value },
35
+ });
36
+ });
@@ -0,0 +1,56 @@
1
+ import { componentDefinition, defineComponent, World } from '@forgeax/engine-ecs';
2
+ import { componentSchema } from '@forgeax/engine-ecs/internal';
3
+ import { Visibility } from '@forgeax/engine-render';
4
+ import { describe, expect, it } from 'vitest';
5
+ import { projectComponentIntrospection } from '../internal/component-introspection';
6
+
7
+ const Probe = defineComponent(
8
+ 'ComponentIntrospectionProbe',
9
+ {
10
+ mode: {
11
+ type: 'enum',
12
+ default: 0,
13
+ labels: { first: 0, second: 1 },
14
+ },
15
+ name: {
16
+ type: 'string',
17
+ meta: { purpose: 'reflection-test' },
18
+ },
19
+ },
20
+ { meta: { owner: 'app-test' } },
21
+ );
22
+
23
+ describe('component introspection projection', () => {
24
+ it('derives Visibility schema, labels, and metadata from the registered token', () => {
25
+ const world = new World();
26
+ world.components.register(Visibility).unwrap();
27
+ const descriptors = projectComponentIntrospection(world.components.entries());
28
+ const descriptor = descriptors.find((entry) => entry.name === Visibility.name);
29
+
30
+ expect(descriptor).toBeDefined();
31
+ expect(descriptor?.schema).toEqual(componentSchema(Visibility));
32
+ expect(descriptor?.fields.state?.labels).toEqual(Visibility.fields.state?.labels);
33
+ expect(descriptor?.fields.state?.type).toBe('enum');
34
+ });
35
+
36
+ it('projects field and component metadata without leaking component tokens', () => {
37
+ const world = new World();
38
+ world.components.register(Probe).unwrap();
39
+ const descriptors = projectComponentIntrospection(world.components.entries());
40
+ const descriptor = descriptors.find((entry) => entry.name === Probe.name);
41
+
42
+ expect(descriptor).toMatchObject({
43
+ name: Probe.name,
44
+ schema: componentSchema(Probe),
45
+ fields: {
46
+ mode: { type: 'enum', labels: Probe.fields.mode?.labels },
47
+ name: { type: 'string' },
48
+ },
49
+ meta: componentDefinition(Probe).policy.meta,
50
+ });
51
+ expect(descriptor).not.toHaveProperty('id');
52
+ expect(descriptor).not.toHaveProperty('validate');
53
+ expect(descriptor).not.toHaveProperty('toSchemaJSON');
54
+ expect(JSON.parse(JSON.stringify(descriptor))).toEqual(descriptor);
55
+ });
56
+ });
@@ -0,0 +1,34 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { Time, Update, World } from '@forgeax/engine-ecs';
4
+ import { describe, expect, it } from 'vitest';
5
+
6
+ describe('callback consumer migration', () => {
7
+ it('registers character-style per-frame work as an Update system reading Time', () => {
8
+ const world = new World();
9
+ let observed = 0;
10
+ world
11
+ .addSystem(Update, {
12
+ name: 'character-drive',
13
+ queries: [],
14
+ fn: () => {
15
+ observed = world.getResource(Time).delta;
16
+ },
17
+ })
18
+ .unwrap();
19
+
20
+ world.update(1 / 60).unwrap();
21
+ expect(observed).toBeCloseTo(1 / 60);
22
+ });
23
+
24
+ it('uses the receipt-bound renderer host contract', () => {
25
+ const source = [
26
+ readFileSync(resolve(process.cwd(), 'packages/app/src/create-app.ts'), 'utf8'),
27
+ readFileSync(resolve(process.cwd(), 'packages/app/src/internal/frame-loop.ts'), 'utf8'),
28
+ ].join('\n');
29
+ expect(source).toContain('renderer.attach(');
30
+ expect(source).toContain('renderer.draw({');
31
+ expect(source).not.toContain('renderer.ready');
32
+ expect(source).not.toContain('renderer.device');
33
+ });
34
+ });
@@ -0,0 +1,125 @@
1
+ import { Update, World } from '@forgeax/engine-ecs';
2
+ import type { Renderer } from '@forgeax/engine-render';
3
+ import { RhiError } from '@forgeax/engine-rhi';
4
+ import { describe, expect, it, vi } from 'vitest';
5
+ import { createApp } from '../create-app';
6
+ import type { AppDispatchError } from '../types';
7
+
8
+ function makeRenderer(): {
9
+ readonly renderer: Renderer;
10
+ readonly draw: ReturnType<typeof vi.fn>;
11
+ readonly emit: (error: RhiError) => void;
12
+ } {
13
+ const draw = vi.fn(() => ({ ok: true as const, value: undefined }));
14
+ let listener: ((event: { readonly kind: 'error'; readonly error: RhiError }) => void) | undefined;
15
+ const renderer = {
16
+ backend: 'webgpu' as const,
17
+ ready: Promise.resolve({ ok: true as const, value: undefined }),
18
+ draw,
19
+ attach: () => ({ ok: true as const, value: { dispose: () => undefined } }),
20
+ attachWorld: () => ({ ok: true as const, value: undefined }),
21
+ detachWorld: () => undefined,
22
+ subscribe: (next: (event: { readonly kind: 'error'; readonly error: RhiError }) => void) => {
23
+ listener = next;
24
+ return () => {
25
+ if (listener === next) listener = undefined;
26
+ };
27
+ },
28
+ onLost: () => () => undefined,
29
+ dispose: () => undefined,
30
+ } as unknown as Renderer;
31
+ return { renderer, draw, emit: (error) => listener?.({ kind: 'error', error }) };
32
+ }
33
+
34
+ function installFaultingSystem(world: World, cause: Error): void {
35
+ world
36
+ .addSystem(Update, {
37
+ name: 'retention-faulting-update',
38
+ queries: [],
39
+ fn: () => {
40
+ throw cause;
41
+ },
42
+ })
43
+ .unwrap();
44
+ }
45
+
46
+ async function createPausedApp(world: World, renderer: Renderer, silenceUnhandledErrors = true) {
47
+ const result = await createApp({ renderer, world, silenceUnhandledErrors });
48
+ expect(result.ok).toBe(true);
49
+ if (!result.ok) throw result.error;
50
+ result.value.start().unwrap();
51
+ result.value.pause().unwrap();
52
+ return result.value;
53
+ }
54
+
55
+ describe('createApp error retention', () => {
56
+ it('retains a real frame/update system failure through the main dispatch owner', async () => {
57
+ const cause = new Error('boom');
58
+ const world = new World();
59
+ installFaultingSystem(world, cause);
60
+ const { renderer, draw } = makeRenderer();
61
+ const app = await createPausedApp(world, renderer);
62
+ let observed: AppDispatchError | undefined;
63
+ app.onError((error) => {
64
+ observed = error;
65
+ });
66
+
67
+ const frame = app.stepFrame(1 / 60);
68
+
69
+ expect(frame.ok).toBe(false);
70
+ if (frame.ok) return;
71
+ expect(frame.error.code).toBe('app-system-update-failed');
72
+ if (frame.error.code !== 'app-system-update-failed') return;
73
+ const updateError = frame.error.detail.cause as {
74
+ readonly code?: string;
75
+ readonly detail?: { readonly cause?: unknown };
76
+ };
77
+ expect(updateError.code).toBe('system-failed');
78
+ expect(updateError.detail?.cause).toBe(cause);
79
+ expect(observed).toBe(frame.error);
80
+ expect(app.lastError).toBe(frame.error);
81
+ expect(world.execution.health).toBe('poisoned');
82
+ expect(world.inspect().systems.map((system) => system.name)).toContain(
83
+ 'retention-faulting-update',
84
+ );
85
+ expect(draw).not.toHaveBeenCalled();
86
+ });
87
+
88
+ it('retains the same structured failure when console fallback is the only observer', async () => {
89
+ const consoleError = vi.spyOn(console, 'error').mockImplementation(() => undefined);
90
+ const world = new World();
91
+ installFaultingSystem(world, new Error('unobserved boom'));
92
+ const { renderer } = makeRenderer();
93
+ const app = await createPausedApp(world, renderer, false);
94
+
95
+ const frame = app.stepFrame(1 / 60);
96
+
97
+ expect(frame.ok).toBe(false);
98
+ if (!frame.ok) {
99
+ expect(consoleError).toHaveBeenCalledTimes(1);
100
+ expect(consoleError).toHaveBeenCalledWith(frame.error);
101
+ expect(app.lastError).toBe(frame.error);
102
+ }
103
+ consoleError.mockRestore();
104
+ });
105
+
106
+ it('preserves renderer device-loss identity and retention', async () => {
107
+ const world = new World();
108
+ const { renderer, emit } = makeRenderer();
109
+ const app = await createPausedApp(world, renderer);
110
+ let observed: AppDispatchError | undefined;
111
+ app.onError((error) => {
112
+ observed = error;
113
+ });
114
+ const deviceLoss = new RhiError({
115
+ code: 'device-lost',
116
+ expected: 'the test device remains available',
117
+ hint: 'rebuild the renderer after device recovery',
118
+ });
119
+
120
+ emit(deviceLoss);
121
+
122
+ expect(observed).toBe(deviceLoss);
123
+ expect(app.lastError).toBe(deviceLoss);
124
+ });
125
+ });
@@ -0,0 +1,51 @@
1
+ import type { RenderFeature } from '@forgeax/engine-render';
2
+ import { describe, expect, it, vi } from 'vitest';
3
+
4
+ const constructRuntimeRendererHost = vi.hoisted(() => vi.fn());
5
+
6
+ vi.mock('@forgeax/engine-runtime', async (importOriginal) => {
7
+ const actual = await importOriginal<typeof import('@forgeax/engine-runtime')>();
8
+ return actual;
9
+ });
10
+
11
+ vi.mock('@forgeax/engine-runtime/internal/renderer-host', () => ({
12
+ constructRuntimeRendererHost,
13
+ loadRhiPack: vi.fn(),
14
+ }));
15
+
16
+ import { createApp } from '../create-app';
17
+
18
+ function rendererStub() {
19
+ const lease = {};
20
+ return {
21
+ attach: () => ({ ok: true as const, value: lease }),
22
+ draw: () => ({ ok: true as const, value: {} }),
23
+ observe: async () => ({ ok: true as const, value: {} }),
24
+ releaseSurface: () => ({ ok: true as const, value: undefined }),
25
+ restoreSurface: () => ({ ok: true as const, value: undefined }),
26
+ recover: async () => ({ ok: true as const, value: undefined }),
27
+ onError: () => () => undefined,
28
+ onLost: () => () => undefined,
29
+ dispose: () => undefined,
30
+ };
31
+ }
32
+
33
+ describe('createApp features passthrough', () => {
34
+ it('forwards the same ordered feature array to createRenderer', async () => {
35
+ const first = { identity: 'test.first' } as unknown as RenderFeature<unknown>;
36
+ const second = { identity: 'test.second' } as unknown as RenderFeature<unknown>;
37
+ const features = [first, second] as const;
38
+ constructRuntimeRendererHost.mockResolvedValue({
39
+ ok: true,
40
+ value: { renderer: rendererStub(), assets: undefined },
41
+ });
42
+
43
+ const canvas = { tagName: 'canvas', isConnected: true } as HTMLCanvasElement;
44
+ const result = await createApp(canvas, { features });
45
+
46
+ expect(result.ok).toBe(true);
47
+ expect(constructRuntimeRendererHost).toHaveBeenCalledTimes(1);
48
+ expect(constructRuntimeRendererHost.mock.calls[0]?.[1]).toMatchObject({ features });
49
+ expect(constructRuntimeRendererHost.mock.calls[0]?.[1].features).toBe(features);
50
+ });
51
+ });