@oasys/oecs 0.5.4 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/CHANGELOG.md +1223 -266
  2. package/README.md +217 -112
  3. package/dist/core/ecs/access_check.d.cts +29 -29
  4. package/dist/core/ecs/access_check.d.ts +29 -29
  5. package/dist/core/ecs/access_check.d.ts.map +1 -1
  6. package/dist/core/ecs/archetype.d.cts +217 -209
  7. package/dist/core/ecs/archetype.d.ts +217 -209
  8. package/dist/core/ecs/archetype.d.ts.map +1 -1
  9. package/dist/core/ecs/archetype_closure.d.cts +23 -0
  10. package/dist/core/ecs/archetype_closure.d.ts +23 -0
  11. package/dist/core/ecs/archetype_closure.d.ts.map +1 -0
  12. package/dist/core/ecs/archetype_graph.d.cts +33 -33
  13. package/dist/core/ecs/archetype_graph.d.ts +33 -33
  14. package/dist/core/ecs/archetype_graph.d.ts.map +1 -1
  15. package/dist/core/ecs/archetype_types.d.cts +55 -0
  16. package/dist/core/ecs/archetype_types.d.ts +55 -0
  17. package/dist/core/ecs/archetype_types.d.ts.map +1 -0
  18. package/dist/core/ecs/change_feed.d.cts +53 -0
  19. package/dist/core/ecs/change_feed.d.ts +53 -0
  20. package/dist/core/ecs/change_feed.d.ts.map +1 -0
  21. package/dist/core/ecs/changed_query.d.cts +36 -0
  22. package/dist/core/ecs/changed_query.d.ts +36 -0
  23. package/dist/core/ecs/changed_query.d.ts.map +1 -0
  24. package/dist/core/ecs/chunk_columns.d.cts +49 -0
  25. package/dist/core/ecs/chunk_columns.d.ts +49 -0
  26. package/dist/core/ecs/chunk_columns.d.ts.map +1 -0
  27. package/dist/core/ecs/command_log.d.cts +26 -26
  28. package/dist/core/ecs/command_log.d.ts +26 -26
  29. package/dist/core/ecs/command_log.d.ts.map +1 -1
  30. package/dist/core/ecs/component.d.cts +43 -42
  31. package/dist/core/ecs/component.d.ts +43 -42
  32. package/dist/core/ecs/component.d.ts.map +1 -1
  33. package/dist/core/ecs/component_registry.d.cts +53 -0
  34. package/dist/core/ecs/component_registry.d.ts +53 -0
  35. package/dist/core/ecs/component_registry.d.ts.map +1 -0
  36. package/dist/core/ecs/compute_backend.d.cts +18 -7
  37. package/dist/core/ecs/compute_backend.d.ts +18 -7
  38. package/dist/core/ecs/compute_backend.d.ts.map +1 -1
  39. package/dist/core/ecs/deferred_commands.d.cts +15 -14
  40. package/dist/core/ecs/deferred_commands.d.ts +15 -14
  41. package/dist/core/ecs/deferred_commands.d.ts.map +1 -1
  42. package/dist/core/ecs/dispatch_trace.d.cts +32 -31
  43. package/dist/core/ecs/dispatch_trace.d.ts +32 -31
  44. package/dist/core/ecs/dispatch_trace.d.ts.map +1 -1
  45. package/dist/core/ecs/ecs.d.cts +289 -270
  46. package/dist/core/ecs/ecs.d.ts +289 -270
  47. package/dist/core/ecs/ecs.d.ts.map +1 -1
  48. package/dist/core/ecs/ecs_memory.d.cts +134 -136
  49. package/dist/core/ecs/ecs_memory.d.ts +134 -136
  50. package/dist/core/ecs/ecs_memory.d.ts.map +1 -1
  51. package/dist/core/ecs/ecs_options.d.cts +89 -0
  52. package/dist/core/ecs/ecs_options.d.ts +89 -0
  53. package/dist/core/ecs/ecs_options.d.ts.map +1 -0
  54. package/dist/core/ecs/entity.d.cts +4 -4
  55. package/dist/core/ecs/entity.d.ts +4 -4
  56. package/dist/core/ecs/entity_allocator.d.cts +20 -18
  57. package/dist/core/ecs/entity_allocator.d.ts +20 -18
  58. package/dist/core/ecs/entity_allocator.d.ts.map +1 -1
  59. package/dist/core/ecs/event.d.cts +36 -22
  60. package/dist/core/ecs/event.d.ts +36 -22
  61. package/dist/core/ecs/event.d.ts.map +1 -1
  62. package/dist/core/ecs/facades.d.cts +12 -126
  63. package/dist/core/ecs/facades.d.ts +12 -126
  64. package/dist/core/ecs/facades.d.ts.map +1 -1
  65. package/dist/core/ecs/frame_stepper.d.cts +12 -12
  66. package/dist/core/ecs/frame_stepper.d.ts +12 -12
  67. package/dist/core/ecs/frame_stepper.d.ts.map +1 -1
  68. package/dist/core/ecs/frame_trace.d.cts +32 -32
  69. package/dist/core/ecs/frame_trace.d.ts +32 -32
  70. package/dist/core/ecs/frame_trace.d.ts.map +1 -1
  71. package/dist/core/ecs/host_commands.d.cts +103 -85
  72. package/dist/core/ecs/host_commands.d.ts +103 -85
  73. package/dist/core/ecs/host_commands.d.ts.map +1 -1
  74. package/dist/core/ecs/index.d.cts +21 -11
  75. package/dist/core/ecs/index.d.ts +21 -11
  76. package/dist/core/ecs/index.d.ts.map +1 -1
  77. package/dist/core/ecs/observer.d.cts +39 -120
  78. package/dist/core/ecs/observer.d.ts +39 -120
  79. package/dist/core/ecs/observer.d.ts.map +1 -1
  80. package/dist/core/ecs/phase.d.cts +79 -0
  81. package/dist/core/ecs/phase.d.ts +79 -0
  82. package/dist/core/ecs/phase.d.ts.map +1 -0
  83. package/dist/core/ecs/plugin.d.cts +125 -0
  84. package/dist/core/ecs/plugin.d.ts +125 -0
  85. package/dist/core/ecs/plugin.d.ts.map +1 -0
  86. package/dist/core/ecs/plugin_slots.d.cts +26 -0
  87. package/dist/core/ecs/plugin_slots.d.ts +26 -0
  88. package/dist/core/ecs/plugin_slots.d.ts.map +1 -0
  89. package/dist/core/ecs/query.d.cts +208 -578
  90. package/dist/core/ecs/query.d.ts +208 -578
  91. package/dist/core/ecs/query.d.ts.map +1 -1
  92. package/dist/core/ecs/query_cache.d.cts +130 -0
  93. package/dist/core/ecs/query_cache.d.ts +130 -0
  94. package/dist/core/ecs/query_cache.d.ts.map +1 -0
  95. package/dist/core/ecs/query_registry.d.cts +47 -0
  96. package/dist/core/ecs/query_registry.d.ts +47 -0
  97. package/dist/core/ecs/query_registry.d.ts.map +1 -0
  98. package/dist/core/ecs/query_terms.d.cts +126 -0
  99. package/dist/core/ecs/query_terms.d.ts +126 -0
  100. package/dist/core/ecs/query_terms.d.ts.map +1 -0
  101. package/dist/core/ecs/ref.d.cts +100 -39
  102. package/dist/core/ecs/ref.d.ts +100 -39
  103. package/dist/core/ecs/ref.d.ts.map +1 -1
  104. package/dist/core/ecs/relation.d.cts +101 -182
  105. package/dist/core/ecs/relation.d.ts +101 -182
  106. package/dist/core/ecs/relation.d.ts.map +1 -1
  107. package/dist/core/ecs/resource.d.cts +13 -13
  108. package/dist/core/ecs/resource.d.ts +13 -13
  109. package/dist/core/ecs/resource_registry.d.cts +5 -5
  110. package/dist/core/ecs/resource_registry.d.ts +5 -5
  111. package/dist/core/ecs/resource_registry.d.ts.map +1 -1
  112. package/dist/core/ecs/row_kinds.d.cts +24 -0
  113. package/dist/core/ecs/row_kinds.d.ts +24 -0
  114. package/dist/core/ecs/row_kinds.d.ts.map +1 -0
  115. package/dist/core/ecs/run_condition.d.cts +23 -23
  116. package/dist/core/ecs/run_condition.d.ts +23 -23
  117. package/dist/core/ecs/run_condition.d.ts.map +1 -1
  118. package/dist/core/ecs/schedule.d.cts +91 -120
  119. package/dist/core/ecs/schedule.d.ts +91 -120
  120. package/dist/core/ecs/schedule.d.ts.map +1 -1
  121. package/dist/core/ecs/schedule_plan.d.cts +33 -0
  122. package/dist/core/ecs/schedule_plan.d.ts +33 -0
  123. package/dist/core/ecs/schedule_plan.d.ts.map +1 -0
  124. package/dist/core/ecs/snapshot.d.cts +77 -0
  125. package/dist/core/ecs/snapshot.d.ts +77 -0
  126. package/dist/core/ecs/snapshot.d.ts.map +1 -0
  127. package/dist/core/ecs/snapshot_mount.d.cts +42 -0
  128. package/dist/core/ecs/snapshot_mount.d.ts +42 -0
  129. package/dist/core/ecs/snapshot_mount.d.ts.map +1 -0
  130. package/dist/core/ecs/sparse_store.d.cts +108 -51
  131. package/dist/core/ecs/sparse_store.d.ts +108 -51
  132. package/dist/core/ecs/sparse_store.d.ts.map +1 -1
  133. package/dist/core/ecs/store.d.cts +527 -473
  134. package/dist/core/ecs/store.d.ts +527 -473
  135. package/dist/core/ecs/store.d.ts.map +1 -1
  136. package/dist/core/ecs/store_layout_listener.d.cts +6 -6
  137. package/dist/core/ecs/store_layout_listener.d.ts +6 -6
  138. package/dist/core/ecs/store_types.d.cts +122 -0
  139. package/dist/core/ecs/store_types.d.ts +122 -0
  140. package/dist/core/ecs/store_types.d.ts.map +1 -0
  141. package/dist/core/ecs/system.d.cts +146 -61
  142. package/dist/core/ecs/system.d.ts +146 -61
  143. package/dist/core/ecs/system.d.ts.map +1 -1
  144. package/dist/core/ecs/system_context.d.cts +296 -0
  145. package/dist/core/ecs/system_context.d.ts +296 -0
  146. package/dist/core/ecs/system_context.d.ts.map +1 -0
  147. package/dist/core/ecs/system_set.d.cts +48 -0
  148. package/dist/core/ecs/system_set.d.ts +48 -0
  149. package/dist/core/ecs/system_set.d.ts.map +1 -0
  150. package/dist/core/ecs/utils/arrays.d.cts +15 -1
  151. package/dist/core/ecs/utils/arrays.d.ts +15 -1
  152. package/dist/core/ecs/utils/arrays.d.ts.map +1 -1
  153. package/dist/core/ecs/utils/error.d.cts +82 -6
  154. package/dist/core/ecs/utils/error.d.ts +82 -6
  155. package/dist/core/ecs/utils/error.d.ts.map +1 -1
  156. package/dist/core/ecs/utils/plugin_error.d.cts +10 -0
  157. package/dist/core/ecs/utils/plugin_error.d.ts +10 -0
  158. package/dist/core/ecs/utils/plugin_error.d.ts.map +1 -0
  159. package/dist/core/restore_errors.d.cts +30 -0
  160. package/dist/core/restore_errors.d.ts +30 -0
  161. package/dist/core/restore_errors.d.ts.map +1 -0
  162. package/dist/core/store/action_ring.d.cts +44 -44
  163. package/dist/core/store/action_ring.d.ts +44 -44
  164. package/dist/core/store/action_ring.d.ts.map +1 -1
  165. package/dist/core/store/allocator.d.cts +149 -95
  166. package/dist/core/store/allocator.d.ts +149 -95
  167. package/dist/core/store/allocator.d.ts.map +1 -1
  168. package/dist/core/store/buffer_backed_column.d.cts +17 -17
  169. package/dist/core/store/buffer_backed_column.d.ts +17 -17
  170. package/dist/core/store/buffer_backed_column.d.ts.map +1 -1
  171. package/dist/core/store/column_store.d.cts +124 -86
  172. package/dist/core/store/column_store.d.ts +124 -86
  173. package/dist/core/store/column_store.d.ts.map +1 -1
  174. package/dist/core/store/command_dispatch.d.cts +14 -15
  175. package/dist/core/store/command_dispatch.d.ts +14 -15
  176. package/dist/core/store/command_dispatch.d.ts.map +1 -1
  177. package/dist/core/store/command_ring.d.cts +36 -39
  178. package/dist/core/store/command_ring.d.ts +36 -39
  179. package/dist/core/store/command_ring.d.ts.map +1 -1
  180. package/dist/core/store/descriptor.d.cts +34 -17
  181. package/dist/core/store/descriptor.d.ts +34 -17
  182. package/dist/core/store/descriptor.d.ts.map +1 -1
  183. package/dist/core/store/entity_index.d.cts +34 -35
  184. package/dist/core/store/entity_index.d.ts +34 -35
  185. package/dist/core/store/entity_index.d.ts.map +1 -1
  186. package/dist/core/store/event_ring.d.cts +36 -38
  187. package/dist/core/store/event_ring.d.ts +36 -38
  188. package/dist/core/store/event_ring.d.ts.map +1 -1
  189. package/dist/core/store/extend.d.cts +13 -7
  190. package/dist/core/store/extend.d.ts +13 -7
  191. package/dist/core/store/extend.d.ts.map +1 -1
  192. package/dist/core/store/grow.d.cts +2 -2
  193. package/dist/core/store/grow.d.ts +2 -2
  194. package/dist/core/store/grow.d.ts.map +1 -1
  195. package/dist/core/store/header.d.cts +31 -27
  196. package/dist/core/store/header.d.ts +31 -27
  197. package/dist/core/store/header.d.ts.map +1 -1
  198. package/dist/core/store/index.d.cts +10 -10
  199. package/dist/core/store/index.d.ts +10 -10
  200. package/dist/core/store/index.d.ts.map +1 -1
  201. package/dist/core/store/layout_ops.d.cts +71 -62
  202. package/dist/core/store/layout_ops.d.ts +71 -62
  203. package/dist/core/store/layout_ops.d.ts.map +1 -1
  204. package/dist/core/store/region_table.d.cts +28 -21
  205. package/dist/core/store/region_table.d.ts +28 -21
  206. package/dist/core/store/region_table.d.ts.map +1 -1
  207. package/dist/core/store/snapshot.d.cts +31 -16
  208. package/dist/core/store/snapshot.d.ts +31 -16
  209. package/dist/core/store/snapshot.d.ts.map +1 -1
  210. package/dist/core/store/state_hash.d.cts +12 -12
  211. package/dist/core/store/state_hash.d.ts +12 -12
  212. package/dist/core/store/state_hash.d.ts.map +1 -1
  213. package/dist/core/store/store_regions.d.cts +10 -10
  214. package/dist/core/store/store_regions.d.ts +10 -10
  215. package/dist/core/store/store_regions.d.ts.map +1 -1
  216. package/dist/core/store/vendored_abi/abi.d.cts +27 -2
  217. package/dist/core/store/vendored_abi/abi.d.ts +27 -2
  218. package/dist/core/store/vendored_abi/abi.d.ts.map +1 -1
  219. package/dist/host_commands-B2KMx8O2.cjs +1 -0
  220. package/dist/host_commands-ClVPvhSa.cjs +2 -0
  221. package/dist/host_commands-CwxVQS1z.js +1524 -0
  222. package/dist/host_commands-nJvTy88E.js +1667 -0
  223. package/dist/index.cjs +1 -1
  224. package/dist/index.d.cts +15 -10
  225. package/dist/index.d.ts +15 -10
  226. package/dist/index.d.ts.map +1 -1
  227. package/dist/index.development.cjs +1 -1
  228. package/dist/index.development.js +5804 -5203
  229. package/dist/index.js +5323 -4764
  230. package/dist/internal.cjs +2 -2
  231. package/dist/internal.d.cts +5 -2
  232. package/dist/internal.d.ts +5 -2
  233. package/dist/internal.d.ts.map +1 -1
  234. package/dist/internal.development.cjs +1 -1
  235. package/dist/internal.development.js +70 -20
  236. package/dist/internal.js +138 -83
  237. package/dist/plugins/abi-D3V-QUSf.cjs +1 -0
  238. package/dist/plugins/abi-NP8pNxpd.js +42 -0
  239. package/dist/plugins/arrays-Dr_1hCjL.js +28 -0
  240. package/dist/plugins/arrays-Dt-Joc4i.cjs +1 -0
  241. package/dist/plugins/assertions-gtDVfbnQ.js +6 -0
  242. package/dist/plugins/assertions-z5GQd_bB.cjs +1 -0
  243. package/dist/{extensions → plugins}/editor/editor.d.cts +54 -54
  244. package/dist/{extensions → plugins}/editor/editor.d.ts +54 -54
  245. package/dist/plugins/editor/editor.d.ts.map +1 -0
  246. package/dist/{extensions → plugins}/editor/field_handle.d.cts +12 -12
  247. package/dist/{extensions → plugins}/editor/field_handle.d.ts +12 -12
  248. package/dist/plugins/editor/field_handle.d.ts.map +1 -0
  249. package/dist/plugins/editor/index.d.cts +22 -0
  250. package/dist/plugins/editor/index.d.ts +22 -0
  251. package/dist/plugins/editor/index.d.ts.map +1 -0
  252. package/dist/plugins/editor.cjs +1 -0
  253. package/dist/plugins/editor.d.cts +1 -0
  254. package/dist/plugins/editor.d.ts +1 -0
  255. package/dist/plugins/editor.development.cjs +1 -0
  256. package/dist/{extensions/editor/index.development.js → plugins/editor.development.js} +81 -64
  257. package/dist/{extensions/editor/index.js → plugins/editor.js} +81 -64
  258. package/dist/plugins/events/event_channel.d.cts +13 -0
  259. package/dist/plugins/events/event_channel.d.ts +13 -0
  260. package/dist/plugins/events/event_channel.d.ts.map +1 -0
  261. package/dist/plugins/events/event_registry.d.cts +22 -0
  262. package/dist/plugins/events/event_registry.d.ts +22 -0
  263. package/dist/plugins/events/event_registry.d.ts.map +1 -0
  264. package/dist/plugins/events/facade.d.cts +26 -0
  265. package/dist/plugins/events/facade.d.ts +26 -0
  266. package/dist/plugins/events/facade.d.ts.map +1 -0
  267. package/dist/plugins/events/index.d.cts +10 -0
  268. package/dist/plugins/events/index.d.ts +10 -0
  269. package/dist/plugins/events/index.d.ts.map +1 -0
  270. package/dist/plugins/events.cjs +1 -0
  271. package/dist/plugins/events.d.cts +1 -0
  272. package/dist/plugins/events.d.ts +1 -0
  273. package/dist/plugins/events.development.cjs +1 -0
  274. package/dist/plugins/events.development.js +174 -0
  275. package/dist/plugins/events.js +159 -0
  276. package/dist/plugins/observers/index.d.cts +23 -0
  277. package/dist/plugins/observers/index.d.ts +23 -0
  278. package/dist/plugins/observers/index.d.ts.map +1 -0
  279. package/dist/plugins/observers/observer_registry.d.cts +101 -0
  280. package/dist/plugins/observers/observer_registry.d.ts +101 -0
  281. package/dist/plugins/observers/observer_registry.d.ts.map +1 -0
  282. package/dist/plugins/observers.cjs +1 -0
  283. package/dist/plugins/observers.d.cts +1 -0
  284. package/dist/plugins/observers.d.ts +1 -0
  285. package/dist/plugins/observers.development.cjs +1 -0
  286. package/dist/plugins/observers.development.js +431 -0
  287. package/dist/plugins/observers.js +403 -0
  288. package/dist/plugins/relation_store-BsoegrZh.js +313 -0
  289. package/dist/plugins/relation_store-DQKSnxsm.cjs +1 -0
  290. package/dist/plugins/relation_store-RBhpcE28.cjs +1 -0
  291. package/dist/plugins/relation_store-RqW5Snx6.js +328 -0
  292. package/dist/plugins/relations/builtin_relations.d.cts +48 -0
  293. package/dist/plugins/relations/builtin_relations.d.ts +48 -0
  294. package/dist/plugins/relations/builtin_relations.d.ts.map +1 -0
  295. package/dist/plugins/relations/facade.d.cts +73 -0
  296. package/dist/plugins/relations/facade.d.ts +73 -0
  297. package/dist/plugins/relations/facade.d.ts.map +1 -0
  298. package/dist/plugins/relations/index.d.cts +11 -0
  299. package/dist/plugins/relations/index.d.ts +11 -0
  300. package/dist/plugins/relations/index.d.ts.map +1 -0
  301. package/dist/{core/ecs → plugins/relations}/relation_service.d.cts +85 -97
  302. package/dist/{core/ecs → plugins/relations}/relation_service.d.ts +85 -97
  303. package/dist/plugins/relations/relation_service.d.ts.map +1 -0
  304. package/dist/plugins/relations/relation_store.d.cts +177 -0
  305. package/dist/plugins/relations/relation_store.d.ts +177 -0
  306. package/dist/plugins/relations/relation_store.d.ts.map +1 -0
  307. package/dist/plugins/relations.cjs +1 -0
  308. package/dist/plugins/relations.d.cts +1 -0
  309. package/dist/plugins/relations.d.ts +1 -0
  310. package/dist/plugins/relations.development.cjs +1 -0
  311. package/dist/plugins/relations.development.js +603 -0
  312. package/dist/plugins/relations.js +553 -0
  313. package/dist/plugins/snapshots/index.d.cts +33 -0
  314. package/dist/plugins/snapshots/index.d.ts +33 -0
  315. package/dist/plugins/snapshots/index.d.ts.map +1 -0
  316. package/dist/plugins/snapshots/resume.d.cts +57 -0
  317. package/dist/plugins/snapshots/resume.d.ts +57 -0
  318. package/dist/plugins/snapshots/resume.d.ts.map +1 -0
  319. package/dist/plugins/snapshots/snapshot_service.d.cts +59 -0
  320. package/dist/plugins/snapshots/snapshot_service.d.ts +59 -0
  321. package/dist/plugins/snapshots/snapshot_service.d.ts.map +1 -0
  322. package/dist/plugins/snapshots.cjs +1 -0
  323. package/dist/plugins/snapshots.d.cts +1 -0
  324. package/dist/plugins/snapshots.d.ts +1 -0
  325. package/dist/plugins/snapshots.development.cjs +1 -0
  326. package/dist/plugins/snapshots.development.js +737 -0
  327. package/dist/plugins/snapshots.js +737 -0
  328. package/dist/plugins/solid/index.d.cts +8 -0
  329. package/dist/plugins/solid/index.d.ts +8 -0
  330. package/dist/plugins/solid/index.d.ts.map +1 -0
  331. package/dist/plugins/solid/solid.d.cts +97 -0
  332. package/dist/plugins/solid/solid.d.ts +97 -0
  333. package/dist/plugins/solid/solid.d.ts.map +1 -0
  334. package/dist/plugins/solid.cjs +1 -0
  335. package/dist/plugins/solid.d.cts +1 -0
  336. package/dist/plugins/solid.d.ts +1 -0
  337. package/dist/plugins/solid.development.cjs +1 -0
  338. package/dist/plugins/solid.development.js +319 -0
  339. package/dist/plugins/solid.js +319 -0
  340. package/dist/plugins/workers/index.d.cts +75 -0
  341. package/dist/plugins/workers/index.d.ts +75 -0
  342. package/dist/plugins/workers/index.d.ts.map +1 -0
  343. package/dist/plugins/workers/node_threads.d.cts +25 -0
  344. package/dist/plugins/workers/node_threads.d.ts +25 -0
  345. package/dist/plugins/workers/node_threads.d.ts.map +1 -0
  346. package/dist/plugins/workers/plan.d.cts +61 -0
  347. package/dist/plugins/workers/plan.d.ts +61 -0
  348. package/dist/plugins/workers/plan.d.ts.map +1 -0
  349. package/dist/plugins/workers/pool.d.cts +144 -0
  350. package/dist/plugins/workers/pool.d.ts +144 -0
  351. package/dist/plugins/workers/pool.d.ts.map +1 -0
  352. package/dist/plugins/workers/protocol.d.cts +112 -0
  353. package/dist/plugins/workers/protocol.d.ts +112 -0
  354. package/dist/plugins/workers/protocol.d.ts.map +1 -0
  355. package/dist/plugins/workers/worker_bind.d.cts +64 -0
  356. package/dist/plugins/workers/worker_bind.d.ts +64 -0
  357. package/dist/plugins/workers/worker_bind.d.ts.map +1 -0
  358. package/dist/plugins/workers/worker_loop.d.cts +14 -0
  359. package/dist/plugins/workers/worker_loop.d.ts +14 -0
  360. package/dist/plugins/workers/worker_loop.d.ts.map +1 -0
  361. package/dist/plugins/workers.cjs +1 -0
  362. package/dist/plugins/workers.d.cts +1 -0
  363. package/dist/plugins/workers.d.ts +1 -0
  364. package/dist/plugins/workers.development.cjs +1 -0
  365. package/dist/plugins/workers.development.js +596 -0
  366. package/dist/plugins/workers.js +474 -0
  367. package/dist/primitives.cjs +1 -1
  368. package/dist/primitives.d.cts +4 -4
  369. package/dist/primitives.d.ts +4 -4
  370. package/dist/primitives.development.cjs +1 -1
  371. package/dist/primitives.development.js +66 -22
  372. package/dist/primitives.js +66 -22
  373. package/dist/shared-BKl12xF1.js +132 -0
  374. package/dist/shared-Dk-pACZT.cjs +1 -0
  375. package/dist/shared.cjs +1 -1
  376. package/dist/shared.d.cts +7 -7
  377. package/dist/shared.d.ts +7 -7
  378. package/dist/shared.d.ts.map +1 -1
  379. package/dist/shared.development.cjs +1 -1
  380. package/dist/shared.development.js +4 -3
  381. package/dist/shared.js +4 -3
  382. package/dist/topological_sort-Cc_yXqPT.js +346 -0
  383. package/dist/topological_sort-vp1imU6D.cjs +1 -0
  384. package/dist/type_primitives/assertions.d.cts +12 -16
  385. package/dist/type_primitives/assertions.d.ts +12 -16
  386. package/dist/type_primitives/assertions.d.ts.map +1 -1
  387. package/dist/type_primitives/binary_heap/binary_heap.d.cts +2 -6
  388. package/dist/type_primitives/binary_heap/binary_heap.d.ts +2 -6
  389. package/dist/type_primitives/binary_heap/binary_heap.d.ts.map +1 -1
  390. package/dist/type_primitives/bitset/bitset.d.cts +7 -11
  391. package/dist/type_primitives/bitset/bitset.d.ts +7 -11
  392. package/dist/type_primitives/bitset/bitset.d.ts.map +1 -1
  393. package/dist/type_primitives/brand.d.cts +2 -7
  394. package/dist/type_primitives/brand.d.ts +2 -7
  395. package/dist/type_primitives/brand.d.ts.map +1 -1
  396. package/dist/type_primitives/error.d.cts +1 -2
  397. package/dist/type_primitives/error.d.ts +1 -2
  398. package/dist/type_primitives/error.d.ts.map +1 -1
  399. package/dist/type_primitives/index.d.cts +1 -1
  400. package/dist/type_primitives/index.d.ts +1 -1
  401. package/dist/type_primitives/sparse_map/sparse_map.d.cts +3 -7
  402. package/dist/type_primitives/sparse_map/sparse_map.d.ts +3 -7
  403. package/dist/type_primitives/sparse_map/sparse_map.d.ts.map +1 -1
  404. package/dist/type_primitives/sparse_set/sparse_set.d.cts +2 -6
  405. package/dist/type_primitives/sparse_set/sparse_set.d.ts +2 -6
  406. package/dist/type_primitives/sparse_set/sparse_set.d.ts.map +1 -1
  407. package/dist/type_primitives/topological_sort/topological_sort.d.cts +1 -5
  408. package/dist/type_primitives/topological_sort/topological_sort.d.ts +1 -5
  409. package/dist/type_primitives/topological_sort/topological_sort.d.ts.map +1 -1
  410. package/dist/type_primitives/typed_arrays/typed_arrays.d.cts +16 -15
  411. package/dist/type_primitives/typed_arrays/typed_arrays.d.ts +16 -15
  412. package/dist/type_primitives/typed_arrays/typed_arrays.d.ts.map +1 -1
  413. package/dist/utils/error.d.ts.map +1 -1
  414. package/dist/version.d.cts +3 -3
  415. package/dist/version.d.ts +3 -3
  416. package/dist/worker.cjs +1 -0
  417. package/dist/worker.d.cts +17 -0
  418. package/dist/worker.d.ts +17 -0
  419. package/dist/worker.d.ts.map +1 -0
  420. package/dist/worker.development.cjs +1 -0
  421. package/dist/worker.development.js +253 -0
  422. package/dist/worker.js +253 -0
  423. package/package.json +363 -191
  424. package/dist/core/ecs/builtin_relations.d.cts +0 -43
  425. package/dist/core/ecs/builtin_relations.d.ts +0 -43
  426. package/dist/core/ecs/builtin_relations.d.ts.map +0 -1
  427. package/dist/core/ecs/event_registry.d.cts +0 -22
  428. package/dist/core/ecs/event_registry.d.ts +0 -22
  429. package/dist/core/ecs/event_registry.d.ts.map +0 -1
  430. package/dist/core/ecs/relation_service.d.ts.map +0 -1
  431. package/dist/core/ecs/resume.d.cts +0 -85
  432. package/dist/core/ecs/resume.d.ts +0 -85
  433. package/dist/core/ecs/resume.d.ts.map +0 -1
  434. package/dist/core/ecs/snapshot_service.d.cts +0 -94
  435. package/dist/core/ecs/snapshot_service.d.ts +0 -94
  436. package/dist/core/ecs/snapshot_service.d.ts.map +0 -1
  437. package/dist/extensions/editor/editor.d.ts.map +0 -1
  438. package/dist/extensions/editor/field_handle.d.ts.map +0 -1
  439. package/dist/extensions/editor/index.cjs +0 -1
  440. package/dist/extensions/editor/index.d.cts +0 -21
  441. package/dist/extensions/editor/index.d.ts +0 -21
  442. package/dist/extensions/editor/index.d.ts.map +0 -1
  443. package/dist/extensions/editor/index.development.cjs +0 -1
  444. package/dist/extensions/reactive/ecs_sync.d.cts +0 -214
  445. package/dist/extensions/reactive/ecs_sync.d.ts +0 -214
  446. package/dist/extensions/reactive/ecs_sync.d.ts.map +0 -1
  447. package/dist/extensions/reactive/index.cjs +0 -1
  448. package/dist/extensions/reactive/index.d.cts +0 -23
  449. package/dist/extensions/reactive/index.d.ts +0 -23
  450. package/dist/extensions/reactive/index.d.ts.map +0 -1
  451. package/dist/extensions/reactive/index.development.cjs +0 -1
  452. package/dist/extensions/reactive/index.development.js +0 -215
  453. package/dist/extensions/reactive/index.js +0 -215
  454. package/dist/extensions/solid/index.cjs +0 -1
  455. package/dist/extensions/solid/index.d.cts +0 -6
  456. package/dist/extensions/solid/index.d.ts +0 -6
  457. package/dist/extensions/solid/index.d.ts.map +0 -1
  458. package/dist/extensions/solid/index.development.cjs +0 -1
  459. package/dist/extensions/solid/index.development.js +0 -40
  460. package/dist/extensions/solid/index.js +0 -36
  461. package/dist/extensions/solid/kernel_solid.d.cts +0 -45
  462. package/dist/extensions/solid/kernel_solid.d.ts +0 -45
  463. package/dist/extensions/solid/kernel_solid.d.ts.map +0 -1
  464. package/dist/host_commands-BlR3oZ3x.js +0 -2406
  465. package/dist/host_commands-C2cpU3yC.cjs +0 -1
  466. package/dist/internal-BoxWl4dG.js +0 -2565
  467. package/dist/internal-CGBEwfeB.cjs +0 -2
  468. package/dist/interop-CT-REx0W.cjs +0 -1
  469. package/dist/interop-CcY6ASQc.js +0 -18
  470. package/dist/interop-DqxleBo7.js +0 -18
  471. package/dist/interop-T1HZ-Dpa.cjs +0 -1
  472. package/dist/kernel-Cz2Kxlwl.js +0 -240
  473. package/dist/kernel-DgyrLFjW.js +0 -227
  474. package/dist/kernel-sw7ScKWu.cjs +0 -1
  475. package/dist/kernel-yWV3XnAb.cjs +0 -1
  476. package/dist/reactive/array.d.cts +0 -24
  477. package/dist/reactive/array.d.ts +0 -24
  478. package/dist/reactive/array.d.ts.map +0 -1
  479. package/dist/reactive/index.cjs +0 -1
  480. package/dist/reactive/index.d.cts +0 -11
  481. package/dist/reactive/index.d.ts +0 -11
  482. package/dist/reactive/index.d.ts.map +0 -1
  483. package/dist/reactive/index.development.cjs +0 -1
  484. package/dist/reactive/index.development.js +0 -18
  485. package/dist/reactive/index.js +0 -18
  486. package/dist/reactive/interop.d.cts +0 -19
  487. package/dist/reactive/interop.d.ts +0 -19
  488. package/dist/reactive/interop.d.ts.map +0 -1
  489. package/dist/reactive/kernel.d.cts +0 -73
  490. package/dist/reactive/kernel.d.ts +0 -73
  491. package/dist/reactive/kernel.d.ts.map +0 -1
  492. package/dist/reactive/map.d.cts +0 -16
  493. package/dist/reactive/map.d.ts +0 -16
  494. package/dist/reactive/map.d.ts.map +0 -1
  495. package/dist/reactive/shallow.d.cts +0 -11
  496. package/dist/reactive/shallow.d.ts +0 -11
  497. package/dist/reactive/shallow.d.ts.map +0 -1
  498. package/dist/reactive/struct.d.cts +0 -10
  499. package/dist/reactive/struct.d.ts +0 -10
  500. package/dist/reactive/struct.d.ts.map +0 -1
  501. package/dist/shallow-Bs39EPh1.js +0 -150
  502. package/dist/shallow-C5YmTbtb.cjs +0 -1
  503. package/dist/shallow-CiFC70Dz.js +0 -159
  504. package/dist/shallow-DQ8aG51_.cjs +0 -1
  505. package/dist/shared-B4v0L1cw.js +0 -109
  506. package/dist/shared-DU78k0pU.cjs +0 -1
  507. package/dist/topological_sort-BDvEyb9W.cjs +0 -1
  508. package/dist/topological_sort-DK6EjpWa.js +0 -135
  509. package/dist/typed_arrays-D3NmwtCG.cjs +0 -1
  510. package/dist/typed_arrays-DIVwVy5_.js +0 -258
@@ -0,0 +1,553 @@
1
+ import { D as b, R as C, a as m, g as d, c as N, U as w } from "./relation_store-BsoegrZh.js";
2
+ import { r as L } from "./arrays-Dr_1hCjL.js";
3
+ import { ECSError as D, ECS_ERROR as I } from "../index.js";
4
+ import { u as A } from "./assertions-gtDVfbnQ.js";
5
+ class M {
6
+ constructor(t) {
7
+ this._host = t;
8
+ }
9
+ // Parallel array indexed by RelationID. Each entry owns a backing sparse
10
+ // component (membership + the target field when exclusive) plus the reverse
11
+ // index and multi-target forward sets. Layered on the sparse storage class,
12
+ // so add, remove and re-target of a pair cause no archetype transition.
13
+ _relations = [];
14
+ // True once any relation registers a non-`orphan` `onDeleteTarget` policy.
15
+ // Gates the target-role cleanup branch in both of the Store's
16
+ // destroy paths so the common case (no cleanup policies) leaves the destroy
17
+ // hot path untouched, mirrors the Store's `count > 0` and sparse-store gates.
18
+ _hasTargetCleanup = !1;
19
+ // Reused radix scratch for the hierarchy depth-ordering driver.
20
+ // The motivating use case, transform propagation, is a per-tick depth-ordered
21
+ // pass, so `forEachHierarchyMatch` allocating two 1024-entry histograms and
22
+ // an `out` array per call would be per-tick GC churn. `radixSortByIndex` fully
23
+ // consumes these three before any `cb` fires, so unlike
24
+ // the call-local `matched`, `buckets`, `depthMemo` and `visiting` (which stay
25
+ // live across the emit loop and would corrupt under a re-entrant callback) they
26
+ // are safe to share as instance state. The observers plugin keeps the same
27
+ // scratch privately, so this one cannot be shared with it.
28
+ _hierarchyRadixOut = new Uint32Array(1024);
29
+ _hierarchyRadixC0 = new Int32Array(1024);
30
+ _hierarchyRadixC1 = new Int32Array(1024);
31
+ /** The registry, indexed by RelationID, the read-only view the Store's
32
+ * `stateHash`, snapshot and restore paths iterate. */
33
+ get stores() {
34
+ return this._relations;
35
+ }
36
+ /** Number of registered relations. */
37
+ get count() {
38
+ return this._relations.length;
39
+ }
40
+ /** Whether any relation registered a non-`orphan` `onDeleteTarget` policy,
41
+ * the destroy paths' gate for `cleanupTarget`. */
42
+ get hasTargetCleanup() {
43
+ return this._hasTargetCleanup;
44
+ }
45
+ /** Register a relation kind. `exclusive` (the default) → one target per
46
+ * source, stored in a backing `{ target: f64 }` sparse component, so the
47
+ * forward index rides the sparse store and inherits query membership,
48
+ * `stateHash` + snapshot and restore for free. `multi` → a set of
49
+ * targets per source, backed by a sparse tag for membership plus a side
50
+ * forward index the relation owns. The two cardinalities are mutually
51
+ * exclusive. `onDeleteTarget` selects the cleanup policy run when a target
52
+ * is destroyed, `delete` (cascade-destroy sources), `clear` (drop the link,
53
+ * sources survive), or `orphan` (default: leave it dangling). See
54
+ * `relation_store.ts`.
55
+ *
56
+ * The backing sparse store is resolved and handed to the relation so it can
57
+ * drive forward and membership rows directly, the cardinality-specific
58
+ * interaction belongs to `ExclusiveRelationStore` and `MultiRelationStore`, not to a
59
+ * branch here. */
60
+ registerRelation(t) {
61
+ const e = t?.multi === !0, s = t?.exclusive === !0;
62
+ if (e && s)
63
+ throw new D(
64
+ I.RELATION_MODE_INVALID,
65
+ "relations.register: a relation cannot be both exclusive and multi-target"
66
+ );
67
+ const r = !e, i = t?.onDeleteTarget ?? b, n = r ? this._host.pushSparseStore([C], ["f64"]) : this._host.pushSparseStore([], []), o = this._relations.length;
68
+ return this._relations.push(
69
+ m(r, n, this._host.sparseStoreOf(n), i)
70
+ ), i !== "orphan" && (this._hasTargetCleanup = !0), A(o);
71
+ }
72
+ _relationOf(t) {
73
+ const e = t, s = this._relations[e];
74
+ if (s === void 0)
75
+ throw new D(I.RELATION_NOT_REGISTERED, `relation ${e} is not registered`);
76
+ return s;
77
+ }
78
+ /** Add a `(R, tgt)` pair to `src`. No archetype transition. Exclusive:
79
+ * replaces any existing target (engine-enforced one-per-source), a no-op if
80
+ * `tgt` is already the target. Multi: adds `tgt` to the set, a no-op if
81
+ * already present. A dead `src` *or* `tgt` is caller error: it throws in
82
+ * `DEV` and is a no-op in production, symmetric, so a production build
83
+ * never links a reverse-index entry keyed by a destroyed handle. */
84
+ addRelation(t, e, s) {
85
+ const r = this._relationOf(e);
86
+ this._host.isAlive(t) && this._host.isAlive(s) && r.link(t, s);
87
+ }
88
+ /** Remove a `(R, tgt)` pair from `src`. No archetype transition. Exclusive:
89
+ * `tgt` is optional and the removal is a no-op when it names a target other
90
+ * than the current one. Multi: omitting `tgt` removes *all* of `src`'s
91
+ * targets. Passing one removes only that pair (dropping membership when the
92
+ * set empties). */
93
+ removeRelation(t, e, s) {
94
+ const r = this._relationOf(e);
95
+ this._host.isAlive(t) && r.unlink(t, s);
96
+ }
97
+ /** The single target of `src` under an exclusive relation, or `undefined`.
98
+ * Throws in `DEV` on a multi-target relation (use `targetsOf`). */
99
+ targetOf(t, e) {
100
+ return this._relationOf(e).singleTargetAt(d(t));
101
+ }
102
+ /** All targets of `src` under `R`, one or zero for exclusive, the full set
103
+ * for multi, ascending by id. */
104
+ targetsOf(t, e) {
105
+ return this._relationOf(e).targetsAt(d(t));
106
+ }
107
+ /** Sources that point at `tgt` under `R` (the reverse index), ascending by
108
+ * id. Empty when none. */
109
+ sourcesOf(t, e) {
110
+ return this._relationOf(e).sourcesOf(t);
111
+ }
112
+ /** Whether `src` holds any pair under `R`. */
113
+ hasRelation(t, e) {
114
+ return this._host.hasSparse(t, this._relationOf(e).sparse);
115
+ }
116
+ /** All `(source, target)` pairs of relation `R`, the `(R, *)` wildcard.
117
+ * Sources are emitted in **canonical entity-index order** (the
118
+ * determinism convention): exclusive relations ride the backing sparse
119
+ * store's `canonicalIndices`, multi relations ride the same
120
+ * `forEachCanonicalTargetSet` traversal that `stateHash` and
121
+ * `snapshotRelations` use. A multi source's targets follow ascending by id.
122
+ * Empty when the relation holds no pairs. Cold path, it allocates the result
123
+ * array, and for multi it sorts each source's target set. Not for per-tick
124
+ * use. The point-query forms are `targetOf` and `targetsOf`. */
125
+ pairsOf(t) {
126
+ const e = this._relationOf(t), s = [], r = this._host.generations();
127
+ return e.forEachCanonicalPair(
128
+ (i) => N(i, r[i]),
129
+ (i, n) => s.push([i, n])
130
+ ), s;
131
+ }
132
+ /** Every `(relation, source)` pointing at `tgt`, across **all** registered
133
+ * relation kinds, the `(*, T)` wildcard. Walks the relation registry
134
+ * in id order (each relation's reverse index already returns sources
135
+ * ascending by id), so the result is ordered by relation id then source id.
136
+ * Empty when nothing targets `tgt`. The single-relation form is
137
+ * `sourcesOf(tgt, def)`. */
138
+ sourcesOfAny(t) {
139
+ const e = [], s = this._relations;
140
+ for (let r = 0; r < s.length; r++) {
141
+ const i = A(r), n = s[r].sourcesOf(t);
142
+ for (let o = 0; o < n.length; o++) e.push([i, n[o]]);
143
+ }
144
+ return e;
145
+ }
146
+ // --- Wildcard query terms ---
147
+ // `(R, *)` and `(*, T)` as composable query terms (vs the cold materializing
148
+ // helpers `pairsOf` and `sourcesOfAny` above). Membership semantics: each
149
+ // matching source is yielded once. Fetch its targets on demand with
150
+ // `targetsOf`. Insertion order, consistent with the `andSparse` path
151
+ // (deterministic by construction across lockstep peers, canonical sorting is
152
+ // reserved for `stateHash` and for snapshot). Canonical ordering costs far
153
+ // more for each iteration and buys no determinism here.
154
+ /** The backing sparse component id of relation `R`, the membership store a
155
+ * `(R, *)` wildcard term (`Query.andRelation`) drives through the shared
156
+ * sparse-match path. Exclusive relations back a `{ target: f64 }` sparse
157
+ * component, multi a tag. Both carry per-source membership, so "has any
158
+ * `(R, *)` pair" is exactly membership in this store (including an
159
+ * orphan-dangling source, whose membership row persists, consistent with
160
+ * `pairsOf`). The def is engine-owned and never handed to callers. This hands
161
+ * the query builder only its erased id for the `sparseIncludes` list. */
162
+ relationBackingSparseId(t) {
163
+ return this._relationOf(t).sparse;
164
+ }
165
+ /** Drive a `(*, T)` wildcard query (`Query.forEachRelatedTo`): every source
166
+ * related to `target` under **any** relation, intersected with the query's
167
+ * dense mask, its sparse require and exclude terms, and the default
168
+ * enabled-row filter,
169
+ * each source yielded once. Unions `sourcesOf(target, R)` across every
170
+ * relation into a `Set` (dedup by full `EntityID`, a source related to `T`
171
+ * via two relations is yielded once), then sorts ascending: the cross-relation
172
+ * union has no inherent order, so one cold sort gives a deterministic,
173
+ * canonical `(*, T)` order matching `sourcesOf` and `sourcesOfAny` (which sort
174
+ * the same way). Cold and structural, not a per-tick hot loop over many targets.
175
+ * `sparseIncludes` and `sparseExcludes` carry both raw sparse terms and the backing
176
+ * stores of any composed `(R, *)` terms, so it intersects with them uniformly. */
177
+ forEachTargetMatch(t, e, s, r, i, n) {
178
+ const { sparseIncludes: o, sparseExcludes: l, includesDisabled: a } = i, c = this._relations;
179
+ if (c.length === 0) return;
180
+ const _ = /* @__PURE__ */ new Set();
181
+ for (let h = 0; h < c.length; h++) {
182
+ const u = c[h].sourcesOf(t);
183
+ for (let O = 0; O < u.length; O++) _.add(u[O]);
184
+ }
185
+ if (_.size === 0) return;
186
+ const R = Array.from(_).sort((h, u) => h - u), S = this._host.sparseStores(), E = this._host.entityArchetypes(), f = this._host.entityRows(), p = this._host.archetypes();
187
+ for (let h = 0; h < R.length; h++) {
188
+ const u = A(R[h]), O = d(u), x = E[O];
189
+ if (x === w) continue;
190
+ const k = p[x], y = k.mask;
191
+ if (!y.contains(e) || s !== null && y.overlaps(s) || r !== null && !y.overlaps(r)) continue;
192
+ let T = !0;
193
+ for (let g = 0; g < o.length; g++)
194
+ if (!S[o[g]].has(O)) {
195
+ T = !1;
196
+ break;
197
+ }
198
+ if (T) {
199
+ for (let g = 0; g < l.length; g++)
200
+ if (S[l[g]].has(O)) {
201
+ T = !1;
202
+ break;
203
+ }
204
+ if (T) {
205
+ if (!a) {
206
+ const g = f[O];
207
+ if (g !== w && g >= k.enabledCount) continue;
208
+ }
209
+ n(u);
210
+ }
211
+ }
212
+ }
213
+ }
214
+ /** Reclaim reverse-index memory: drop every relation's reverse entries whose
215
+ * **target** has been destroyed, returning the total dropped across all
216
+ * relations. Under the default `orphan` policy a destroyed target
217
+ * leaves its reverse entry intact until each source re-targets or dies, so a
218
+ * long-lived source that orphan-points at a churn of short-lived targets and
219
+ * never re-targets accumulates dead-target keys without bound. This cold-path
220
+ * hook drops them on demand, call it at scene or snapshot boundaries.
221
+ *
222
+ * Purely a memory reclaim with no observable state change: forward links stay
223
+ * dangling (so `orphan`'s `targetOf`-returns-the-dead-handle contract is
224
+ * unchanged), `stateHash` is unaffected (the reverse index is derived, never
225
+ * folded), and the dropped entries are faithfully rebuilt by snapshot and restore
226
+ * from the surviving forward links (the snapshot plugin's
227
+ * `_rebuildRelationIndices`). The only
228
+ * difference a caller can see is `sourcesOf(deadHandle, R)` going from the
229
+ * dangling sources to `[]`, both meaningless once the target is gone.
230
+ * No-op (returns 0) when no relations are registered. */
231
+ compactRelations() {
232
+ const t = this._relations;
233
+ if (t.length === 0) return 0;
234
+ const e = (r) => this._host.isAlive(r);
235
+ let s = 0;
236
+ for (let r = 0; r < t.length; r++) s += t[r].pruneDeadReverse(e);
237
+ return s;
238
+ }
239
+ // --- Traversal (parent and IsA chains over an exclusive relation) ---
240
+ // Traversal is **exclusive-only**: an exclusive relation gives each source at
241
+ // most one target ("parent"), so the forward direction is a chain and the
242
+ // reverse index (`sourcesOf`) gives children, together a proper tree. A
243
+ // multi relation is a dag with no single parent chain, so these throw
244
+ // `RELATION_MODE_MISMATCH` in `DEV` (mirroring `targetOf`). Acyclicity
245
+ // is assumed. Every walk carries a visited set so a malformed (cyclic) chain
246
+ // is a loud `RELATION_CYCLE` in `DEV` and a safe early-out (never a hang)
247
+ // in production. Cold path, allocates the result array. Not for per-tick use.
248
+ /** Walk exclusive relation `R` from `src` toward the root, returning the
249
+ * **up**-chain `[src, parent, grandparent, …, root]` (nearest-ancestor-first,
250
+ * inclusive of both endpoints). A source with no target returns `[src]`. The
251
+ * root is the first entity in the chain with no `R`-target, **or** a dangling
252
+ * dead target handle (see below). Throws `RELATION_MODE_MISMATCH` on a multi
253
+ * relation and `RELATION_CYCLE` on a cycle (both `DEV`-only, in production
254
+ * a cycle stops at the repeated node).
255
+ *
256
+ * **Dangling links terminate the chain.** Under the `orphan` policy a source
257
+ * keeps pointing at a destroyed target (a dead handle). The walk must *not*
258
+ * advance through such a handle: the backing store is keyed by entity
259
+ * **index**, so reading the dead handle's index would return whatever now
260
+ * occupies that recycled slot, splicing the chain onto an unrelated entity
261
+ * (the ABA the `EntityID`-keyed reverse index avoids for `cascadeOf`). So a
262
+ * dead next-hop is appended as the chain's (dangling) terminus and the walk
263
+ * stops. The caller can detect it with `isAlive`, exactly as `targetOf`
264
+ * returns a dead handle. */
265
+ ancestorsOf(t, e) {
266
+ const s = this._relationOf(e), r = this._host.sparseStoreOf(s.sparse), i = [t], n = /* @__PURE__ */ new Set([d(t)]);
267
+ let o = t;
268
+ for (; ; ) {
269
+ const l = r.getField(d(o), 0);
270
+ if (l === void 0) break;
271
+ const a = A(l);
272
+ if (!this._host.isAlive(a)) {
273
+ i.push(a);
274
+ break;
275
+ }
276
+ const c = d(a);
277
+ if (n.has(c))
278
+ break;
279
+ n.add(c), o = a, i.push(o);
280
+ }
281
+ return i;
282
+ }
283
+ /** The root of `src`'s exclusive-relation chain, the last entity of
284
+ * `ancestorsOf` (the one with no `R`-target). `src` itself when it has no
285
+ * target. If the chain ends in a dangling dead target handle (orphan policy),
286
+ * that handle is the root, `isAlive`-check the result if dangling links are
287
+ * possible. Same `DEV` guards as `ancestorsOf`. */
288
+ rootOf(t, e) {
289
+ const s = this.ancestorsOf(t, e);
290
+ return s[s.length - 1];
291
+ }
292
+ /** Walk exclusive relation `R` **down** from `root` over the reverse index,
293
+ * returning the subtree (including `root`) breadth-first, **parents before
294
+ * children** (the `cascade` order). Children of each node come from
295
+ * `sourcesOf` (ascending by id), so the traversal is deterministic. Throws
296
+ * `RELATION_MODE_MISMATCH` on a multi relation and `RELATION_CYCLE` on a cycle
297
+ * (both `DEV`-only, in production an already-visited node is skipped, so
298
+ * it never hangs). */
299
+ cascadeOf(t, e) {
300
+ const s = this._relationOf(e), r = [t], i = /* @__PURE__ */ new Set([d(t)]);
301
+ for (let n = 0; n < r.length; n++) {
302
+ const o = s.sourcesOf(r[n]);
303
+ for (let l = 0; l < o.length; l++) {
304
+ const a = o[l], c = d(a);
305
+ i.has(c) || (i.add(c), r.push(a));
306
+ }
307
+ }
308
+ return r;
309
+ }
310
+ /** Purge a destroyed entity from the relation indices, its **source** role
311
+ * only: drop its forward target(s) and unlink it from every target's reverse
312
+ * set. The backing sparse membership row is dropped separately by the Store's
313
+ * `_purgeSparse`, so this must run *before* it (it reads the sparse target
314
+ * field for exclusive relations). The entity's **target** role is left
315
+ * intact: the reverse index is keyed by full `EntityID`, so a recycled slot
316
+ * never aliases the dead target's sources. The destroyed entity's **target**
317
+ * role is handled separately by `cleanupTarget` per each relation's
318
+ * `OnDeleteTarget` policy. Gated by the caller on `count > 0`. */
319
+ purgeSource(t) {
320
+ const e = this._relations;
321
+ for (let s = 0; s < e.length; s++) e[s].purgeSource(t);
322
+ }
323
+ /** Apply each relation's `OnDeleteTarget` policy for a destroyed **target**
324
+ * `targetId`. Walks the registry. For every relation whose reverse
325
+ * index has sources pointing at the dead target:
326
+ *
327
+ * - **`delete`**, append each source to `cascade`. The caller destroys them
328
+ * through the same path, so chains and trees cascade recursively. The sources'
329
+ * own source-role purge (`purgeSource`) drops their forward link and
330
+ * unlinks them from `targetId`'s reverse set, so no reverse entry leaks.
331
+ * - **`clear`**, drop each source's link to the dead target in place via
332
+ * `rs.unlink(src, targetId)` (exclusive drops the row, multi removes the
333
+ * target from the set, dropping membership when it empties). Sources
334
+ * survive, the cardinality bookkeeping is the relation's, not branched here.
335
+ * - **`orphan`**, skipped (the link is left dangling, safe because the
336
+ * reverse key carries the generation).
337
+ *
338
+ * `sourcesOf` returns a fresh snapshot, so mutating the reverse index while
339
+ * iterating is safe. Gated by the caller on `hasTargetCleanup`, so the
340
+ * whole walk is skipped when no relation opts into a non-`orphan` policy. */
341
+ cleanupTarget(t, e) {
342
+ const s = this._relations;
343
+ for (let r = 0; r < s.length; r++) {
344
+ const i = s[r];
345
+ if (i.onDeleteTarget === "orphan") continue;
346
+ const n = i.sourcesOf(t);
347
+ if (n.length !== 0) {
348
+ if (i.onDeleteTarget === "delete") {
349
+ for (let o = 0; o < n.length; o++) e.push(n[o]);
350
+ continue;
351
+ }
352
+ for (let o = 0; o < n.length; o++) i.unlink(n[o], t);
353
+ }
354
+ }
355
+ }
356
+ /** A query-match path: yield the matched entities, the exact
357
+ * sparse-match intersection (dense mask, sparse require and exclude, and the
358
+ * default enabled-row filter), in canonical **hierarchy depth order** over
359
+ * exclusive relation `R`: depth ascending (parents before children), **entity
360
+ * index ascending within each depth band**. Entities deeper than `maxDepth`
361
+ * are skipped (`Infinity` = unbounded). Only reached via `Query.forEachEntity`
362
+ * on a query carrying a `.hierarchy(R)` term.
363
+ *
364
+ * `.hierarchy(R)` does not narrow the matched set. It reorders it, so an
365
+ * entity with no `R`-parent is a root (depth 0) and is yielded first. Depth is a
366
+ * structural property of the *full* tree (an ancestor outside the matched set
367
+ * still counts toward depth), computed by a memoised upward walk shared across
368
+ * the whole batch, so a shared or deep chain costs O(nodes), not O(nodes²).
369
+ *
370
+ * The canonical order is produced without a comparator sort, which is far
371
+ * slower: (1) collect the matched ids via
372
+ * the host's `forEachSparseMatch`, (2) `radixSortByIndex` → entity-index
373
+ * ascending, and (3) stable-bucket by depth, since the input is index-ascending
374
+ * and the bucket append is stable, each depth band stays index-ascending.
375
+ * Tuned for the motivating per-tick case (transform propagation): the radix
376
+ * scratch is reused instance state (`_hierarchyRadix*`), so a per-tick pass
377
+ * churns no histograms. The working set (`matched`, `buckets`, `depthMemo`
378
+ * and `visiting`) is still allocated per call, as it must stay call-local for
379
+ * re-entrancy.
380
+ *
381
+ * Exclusive-only, a multi relation throws `RELATION_MODE_MISMATCH` in `DEV`
382
+ * (mirrors `cascadeOf` and `ancestorsOf`). A cycle is a loud `RELATION_CYCLE`
383
+ * in `DEV` and a safe break in production. */
384
+ forEachHierarchyMatch(t, e, s, r, i, n, o, l) {
385
+ const a = this._relationOf(n), c = [];
386
+ if (this._host.forEachSparseMatch(
387
+ t,
388
+ e,
389
+ s,
390
+ r,
391
+ i,
392
+ (f) => c.push(f)
393
+ ), c.length === 0) return;
394
+ this._hierarchyRadixOut = L(
395
+ c,
396
+ this._hierarchyRadixOut,
397
+ this._hierarchyRadixC0,
398
+ this._hierarchyRadixC1
399
+ );
400
+ const _ = this._host.sparseStoreOf(a.sparse), R = /* @__PURE__ */ new Map(), S = /* @__PURE__ */ new Set(), E = [];
401
+ for (let f = 0; f < c.length; f++) {
402
+ const p = c[f], h = this._hierarchyDepthOf(d(p), _, R, S);
403
+ if (h > o) continue;
404
+ let u = E[h];
405
+ u === void 0 && (u = [], E[h] = u), u.push(p);
406
+ }
407
+ for (let f = 0; f < E.length; f++) {
408
+ const p = E[f];
409
+ if (p !== void 0)
410
+ for (let h = 0; h < p.length; h++) l(p[h]);
411
+ }
412
+ }
413
+ /** Depth of entity index `idx` in the exclusive-relation tree backing `store`
414
+ * (root = 0), for `forEachHierarchyMatch`. Memoised across the batch (`memo`),
415
+ * so a shared ancestor chain is walked once. Walks upward via the backing store's
416
+ * target field 0 (mirroring `ancestorsOf`), stopping at: a root (no target), an
417
+ * already-memoised node, or a dangling or dead parent (the child is then treated as
418
+ * a root, never advance through a recycled slot, the ABA `ancestorsOf` guards).
419
+ * `visiting` flags the nodes on the current upward path to catch a cycle,
420
+ * `RELATION_CYCLE` in `DEV`, treated as a root in production, and is emptied
421
+ * on the way back down so it can be reused for the next entity. */
422
+ _hierarchyDepthOf(t, e, s, r) {
423
+ const i = [];
424
+ let n = t, o = 0;
425
+ for (; ; ) {
426
+ const a = s.get(n);
427
+ if (a !== void 0) {
428
+ o = a;
429
+ break;
430
+ }
431
+ const c = e.getField(n, 0);
432
+ let _ = -1;
433
+ if (c !== void 0) {
434
+ const R = A(c);
435
+ this._host.isAlive(R) && (_ = d(R));
436
+ }
437
+ if (_ === -1) {
438
+ s.set(n, 0), o = 0;
439
+ break;
440
+ }
441
+ if (r.has(_)) {
442
+ s.set(n, 0), o = 0;
443
+ break;
444
+ }
445
+ i.push(n), r.add(n), n = _;
446
+ }
447
+ let l = o;
448
+ for (let a = i.length - 1; a >= 0; a--)
449
+ l += 1, s.set(i[a], l), r.delete(i[a]);
450
+ return s.get(t);
451
+ }
452
+ }
453
+ class F {
454
+ _service;
455
+ /** @internal constructed by the relations plugin. */
456
+ constructor(t) {
457
+ this._service = t;
458
+ }
459
+ register(t) {
460
+ return this._service.registerRelation(t);
461
+ }
462
+ /** Count of registered relations. */
463
+ get count() {
464
+ return this._service.count;
465
+ }
466
+ /** Add a `(R, tgt)` pair to `src`. Exclusive replaces the existing target
467
+ * multi adds to the set. No archetype transition. */
468
+ add(t, e, s) {
469
+ return this._service.addRelation(t, e, s), this;
470
+ }
471
+ /** Remove a `(R, tgt)` pair from `src`. For multi, omitting `tgt` removes
472
+ * all of `src`'s targets. No archetype transition. */
473
+ remove(t, e, s) {
474
+ return this._service.removeRelation(t, e, s), this;
475
+ }
476
+ /** Whether `src` holds any pair under `R`. */
477
+ has(t, e) {
478
+ return this._service.hasRelation(t, e);
479
+ }
480
+ /** The single target of `src` under an exclusive relation, or `undefined`. */
481
+ targetOf(t, e) {
482
+ return this._service.targetOf(t, e);
483
+ }
484
+ /** All targets of `src` under `R`, ascending by id. */
485
+ targetsOf(t, e) {
486
+ return this._service.targetsOf(t, e);
487
+ }
488
+ /** Sources pointing at `tgt` under `R` (the reverse index), ascending by id.
489
+ * `(entity, def)` order, matching `targetOf` and `targetsOf`. */
490
+ sourcesOf(t, e) {
491
+ return this._service.sourcesOf(t, e);
492
+ }
493
+ /** All `(source, target)` pairs of relation `R`, the `(R, *)` wildcard.
494
+ * Sources in canonical entity-index order. Cold path. */
495
+ pairsOf(t) {
496
+ return this._service.pairsOf(t);
497
+ }
498
+ /** Every `(relation, source)` pointing at `tgt`, across all relation kinds,
499
+ * the `(*, T)` wildcard. Ordered by relation id then source id. */
500
+ sourcesOfAny(t) {
501
+ return this._service.sourcesOfAny(t);
502
+ }
503
+ /** Walk relation `R` up from `src` to its chain root, returning
504
+ * `[src, parent, …, root]` (nearest-ancestor-first). Exclusive only. */
505
+ ancestorsOf(t, e) {
506
+ return this._service.ancestorsOf(t, e);
507
+ }
508
+ /** The root of `src`'s `R`-chain (`src` itself when it has no target).
509
+ * Exclusive only. */
510
+ rootOf(t, e) {
511
+ return this._service.rootOf(t, e);
512
+ }
513
+ /** Walk relation `R` down from `root` over the reverse index, returning the
514
+ * subtree (including `root`) breadth-first, parents before children (the
515
+ * `cascade` order). Exclusive only. */
516
+ cascadeOf(t, e) {
517
+ return this._service.cascadeOf(t, e);
518
+ }
519
+ /** Reclaim relation reverse-index memory: drop every reverse entry whose
520
+ * target has been destroyed, returning the total dropped. Purely
521
+ * cold-path, no observable state change, call it at a scene boundary or at
522
+ * a snapshot boundary. */
523
+ compact() {
524
+ return this._service.compactRelations();
525
+ }
526
+ }
527
+ function H(v, t) {
528
+ return v.relations.register({
529
+ exclusive: !0,
530
+ onDeleteTarget: t?.onDeleteTarget ?? "clear"
531
+ });
532
+ }
533
+ function z(v, t) {
534
+ return v.relations.register({
535
+ exclusive: !0,
536
+ onDeleteTarget: t?.onDeleteTarget ?? "delete"
537
+ });
538
+ }
539
+ function P() {
540
+ return {
541
+ name: "relations",
542
+ install(v) {
543
+ const t = v.store, e = new M(t.relationHost());
544
+ return t.installRelations(e), { relations: new F(e) };
545
+ }
546
+ };
547
+ }
548
+ export {
549
+ F as ECSRelations,
550
+ z as registerChildOf,
551
+ H as registerIsA,
552
+ P as relations
553
+ };
@@ -0,0 +1,33 @@
1
+ import { ECSSnapshots } from '../../core/ecs/facades.cjs';
2
+ import { Plugin } from '../../core/ecs/plugin.cjs';
3
+ /** The world surface this plugin adds. `ecs.snapshots` is already an
4
+ * `ECSSnapshots`, and this widens it: an intersection of the two is the
5
+ * subclass, so an installed world reaches `capture` and a bare one does not. */
6
+ export interface SnapshotsPlugin {
7
+ readonly snapshots: ECSSnapshotsFull;
8
+ }
9
+ /** `ECSSnapshots` plus the capture and restore surface. */
10
+ export declare class ECSSnapshotsFull extends ECSSnapshots {
11
+ /** Capture the full live world (the dense bytes, the sparse stores and
12
+ * relations, and the host-side bookkeeping) to one self-contained byte
13
+ * buffer that `restore` can mount back onto a live, ticking world. Version 1
14
+ * captures no resource, no event and no change-detection baseline. */
15
+ capture(): Uint8Array;
16
+ /** Mount a `capture()` buffer onto this live world and keep ticking.
17
+ * Fails closed on a malformed frame or registration mismatch before
18
+ * mutating any live state. Requires a matching archetype set and column
19
+ * layout (prewarm so the set is stable). */
20
+ restore(bytes: Uint8Array): void;
21
+ /** Serialize the sparse stores and the relations to a self-contained buffer,
22
+ * the sparse half of a world snapshot, canonical entity-index order.
23
+ * Pairs with `restoreSparse`. */
24
+ captureSparse(): Uint8Array;
25
+ /** Repopulate the sparse stores and the relation indices from
26
+ * `captureSparse` bytes. Sparse components must already be registered in the
27
+ * same order. Throws `SparseRestoreError` on a shape or identity
28
+ * mismatch. */
29
+ restoreSparse(bytes: Uint8Array): void;
30
+ }
31
+ /** The snapshot plugin, for `ECS.create({ plugins: [snapshots()] })`. */
32
+ export declare function snapshots(): Plugin<SnapshotsPlugin>;
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,33 @@
1
+ import { ECSSnapshots } from '../../core/ecs/facades.js';
2
+ import { Plugin } from '../../core/ecs/plugin.js';
3
+ /** The world surface this plugin adds. `ecs.snapshots` is already an
4
+ * `ECSSnapshots`, and this widens it: an intersection of the two is the
5
+ * subclass, so an installed world reaches `capture` and a bare one does not. */
6
+ export interface SnapshotsPlugin {
7
+ readonly snapshots: ECSSnapshotsFull;
8
+ }
9
+ /** `ECSSnapshots` plus the capture and restore surface. */
10
+ export declare class ECSSnapshotsFull extends ECSSnapshots {
11
+ /** Capture the full live world (the dense bytes, the sparse stores and
12
+ * relations, and the host-side bookkeeping) to one self-contained byte
13
+ * buffer that `restore` can mount back onto a live, ticking world. Version 1
14
+ * captures no resource, no event and no change-detection baseline. */
15
+ capture(): Uint8Array;
16
+ /** Mount a `capture()` buffer onto this live world and keep ticking.
17
+ * Fails closed on a malformed frame or registration mismatch before
18
+ * mutating any live state. Requires a matching archetype set and column
19
+ * layout (prewarm so the set is stable). */
20
+ restore(bytes: Uint8Array): void;
21
+ /** Serialize the sparse stores and the relations to a self-contained buffer,
22
+ * the sparse half of a world snapshot, canonical entity-index order.
23
+ * Pairs with `restoreSparse`. */
24
+ captureSparse(): Uint8Array;
25
+ /** Repopulate the sparse stores and the relation indices from
26
+ * `captureSparse` bytes. Sparse components must already be registered in the
27
+ * same order. Throws `SparseRestoreError` on a shape or identity
28
+ * mismatch. */
29
+ restoreSparse(bytes: Uint8Array): void;
30
+ }
31
+ /** The snapshot plugin, for `ECS.create({ plugins: [snapshots()] })`. */
32
+ export declare function snapshots(): Plugin<SnapshotsPlugin>;
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/snapshots/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;KAcK;AAGL,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,uBAAuB,CAAC;AAEhE;;gFAEgF;AAChF,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;CACrC;AAED,2DAA2D;AAC3D,qBAAa,gBAAiB,SAAQ,YAAY;IACjD;;;0EAGsE;IAC/D,OAAO,IAAI,UAAU;IAI5B;;;gDAG4C;IACrC,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAIvC;;qCAEiC;IAC1B,aAAa,IAAI,UAAU;IAIlC;;;mBAGe;IACR,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CAG7C;AAED,yEAAyE;AACzE,wBAAgB,SAAS,IAAI,MAAM,CAAC,eAAe,CAAC,CASnD"}
@@ -0,0 +1,57 @@
1
+ import { ECS_SNAPSHOT_VERSION, ArchetypeRowState, HostState } from '../../core/ecs/snapshot.cjs';
2
+ import { ArchetypeViews } from '../../core/store/index.cjs';
3
+ import { ECSRestoreError } from '../../core/ecs/utils/error.cjs';
4
+ /** Magic for the combined world-snapshot frame (`"WRS0"` little-endian). Distinct
5
+ * from the SAB `STORE_MAGIC` so a bare dense snapshot fed to `restore` is
6
+ * rejected with a clear error instead of being mis-parsed as a combined frame. */
7
+ export declare const WORLD_SNAPSHOT_MAGIC = 810766935;
8
+ export { ECSRestoreError };
9
+ export { ECS_SNAPSHOT_VERSION };
10
+ export type { ArchetypeRowState, HostState };
11
+ /** Serialize host-state to a self-contained little-endian byte buffer. Layout:
12
+ *
13
+ * [u32 tick][u32 highWater][u32 alive_count]
14
+ * [u32 freeCount][u32 free_index × freeCount]
15
+ * [u32 archCount][(u32 id, u32 length, u32 enabled_count) × archCount]
16
+ */
17
+ export declare function serializeHostState(hs: HostState): Uint8Array;
18
+ /** Parse host-state bytes produced by `serializeHostState`. Throws
19
+ * `ECSRestoreError` on truncation or a trailing-byte (non-canonical) buffer. */
20
+ export declare function parseHostState(bytes: Uint8Array): HostState;
21
+ /** Assemble the combined world-snapshot frame from its three sections. Layout:
22
+ *
23
+ * [u32 magic][u32 version][u32 denseLen][u32 sparseLen][u32 hostLen]
24
+ * [dense][sparse][host]
25
+ */
26
+ export declare function frameWorldSnapshot(dense: Uint8Array, sparse: Uint8Array, host: Uint8Array): Uint8Array;
27
+ /** The three sections of a combined frame, as zero-copy subviews over `bytes`. */
28
+ export interface WorldSnapshotSections {
29
+ readonly dense: Uint8Array;
30
+ readonly sparse: Uint8Array;
31
+ readonly host: Uint8Array;
32
+ }
33
+ /** Split a combined frame back into its sections. Validates magic, version, and
34
+ * an exact (no trailing bytes) frame. Throws `ECSRestoreError` otherwise. */
35
+ export declare function unframeWorldSnapshot(bytes: Uint8Array): WorldSnapshotSections;
36
+ /**
37
+ * Fail-closed registration guard, read **directly from the snapshot's dense
38
+ * bytes** so it can run before the dense backing is touched. `restore`
39
+ * builds the restored store through the live world's in-place allocator,
40
+ * which reuses the live backing buffer, so validating a
41
+ * *materialised* `ColumnStore` would already have overwritten live column data
42
+ * (the buffer is overwritten inside `restoreColumnStore`, before any post-build
43
+ * check could run). Parsing the descriptors off the raw `dense` `Uint8Array`
44
+ * keeps the check non-mutating, so a mismatch leaves the live world untouched.
45
+ *
46
+ * Asserts: the dense section's SAB magic and ABI, and that its archetype set,
47
+ * its per-archetype `componentMask` and its per-column
48
+ * `(componentId, fieldId, typeTag)`
49
+ * match the live store's exactly (so every live `Archetype.refreshViews` finds
50
+ * its region and no snapshot archetype is orphaned), and that the entity-index
51
+ * capacity matches (the region is sized once at construction). The archetype
52
+ * graph is rebuilt from registration code, not the snapshot (mirroring
53
+ * `restoreSparse`'s "registered in the same order" contract). Throws
54
+ * `ECSRestoreError` on any mismatch and malformed section.
55
+ */
56
+ export declare function assertDenseMatchesLive(dense: Uint8Array, live: ReadonlyMap<number, ArchetypeViews>, liveEntityIndexCapacity: number): void;
57
+ //# sourceMappingURL=resume.d.ts.map